Link Search Menu Expand Document Documentation Menu

关键字搜索

默认情况下,OpenSearch 使用 Okapi BM25 算法计算文档分数。BM25 是一种基于关键词的算法,对查询中出现的词语执行词法搜索。

在确定文档相关性时,BM25 会考虑 词频/逆文档频率 (TF/IDF)

  • 词频规定,搜索词出现频率更高的文档更相关。

  • 逆文档频率会降低语料库中所有文档中普遍出现的词语(例如,像“the”这样的冠词)的权重。

示例

以下示例查询在 shakespeare 索引中搜索词语 long live king

GET shakespeare/_search
{
  "query": {
    "match": {
      "text_entry": "long live king"
    }
  }
}

响应包含匹配的文档,每个文档在 _score 字段中都有一个相关性分数

{
  "took": 113,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2352,
      "relation": "eq"
    },
    "max_score": 18.781435,
    "hits": [
      {
        "_index": "shakespeare",
        "_id": "32437",
        "_score": 18.781435,
        "_source": {
          "type": "line",
          "line_id": 32438,
          "play_name": "Hamlet",
          "speech_number": 3,
          "line_number": "1.1.3",
          "speaker": "BERNARDO",
          "text_entry": "Long live the king!"
        }
      },
      {
        "_index": "shakespeare",
        "_id": "83798",
        "_score": 16.523308,
        "_source": {
          "type": "line",
          "line_id": 83799,
          "play_name": "Richard III",
          "speech_number": 42,
          "line_number": "3.7.242",
          "speaker": "BUCKINGHAM",
          "text_entry": "Long live Richard, Englands royal king!"
        }
      },
      {
        "_index": "shakespeare",
        "_id": "82994",
        "_score": 15.588365,
        "_source": {
          "type": "line",
          "line_id": 82995,
          "play_name": "Richard III",
          "speech_number": 24,
          "line_number": "3.1.80",
          "speaker": "GLOUCESTER",
          "text_entry": "live long."
        }
      },
      {
        "_index": "shakespeare",
        "_id": "7199",
        "_score": 15.586321,
        "_source": {
          "type": "line",
          "line_id": 7200,
          "play_name": "Henry VI Part 2",
          "speech_number": 12,
          "line_number": "2.2.64",
          "speaker": "BOTH",
          "text_entry": "Long live our sovereign Richard, Englands king!"
        }
      }
      ...
    ]
  }
}

相似度算法

下表列出了支持的相似度算法。

算法 描述
BM25 OpenSearch 默认的 Okapi BM25 相似度算法。
LegacyBM25 (已弃用) 旧版 LegacyBM25Similarity 实现。保留以实现向后兼容性。
布尔值 将术语的分数设置为等于其提升值。当您希望文档分数基于术语是否匹配的二元值时,请使用 boolean 相似度。

OpenSearch 3.0 中 BM25 评分的重要变化

在 OpenSearch 3.0 中,默认相似度算法从 LegacyBM25Similarity 更改为 Lucene 的原生 BM25Similarity

此更改改进了与 Lucene 标准的对齐,并简化了评分行为,但引入了一个重要的差异

  • LegacyBM25Similarity 中,分数在 BM25 公式的分子中包含一个额外的常数因子 k₁ + 1

  • BM25Similarity 中,为了更清晰的归一化,此常数已被移除(请参阅 BM25 和相应的 Lucene GitHub issue)。

  • BM25Similarity 生成的分数低于 LegacyBM25Similarity 生成的分数,通常大约低 2.2 倍。

  • 排名不受影响,因为常数因子不会改变文档的相对顺序。

  • 要保留旧的评分行为,请显式配置您的字段或索引以使用 LegacyBM25(请参阅 配置旧版 BM25 相似度)。

指定相似度

您可以在字段级别配置映射时,在 similarity 参数中指定相似度算法。

例如,以下查询为 boolean_field 指定 boolean 相似度。bm25_field 被分配默认的 BM25 相似度

PUT /testindex
{
  "mappings": {
    "properties": {
      "bm25_field": { 
        "type": "text"
      },
      "boolean_field": {
        "type": "text",
        "similarity": "boolean" 
      }
    }
  }
}

配置 BM25 相似度

您可以在索引级别配置 BM25 相似度参数,如下所示:

PUT /testindex
{
  "settings": {
    "index": {
      "similarity": {
        "custom_similarity": {
          "type": "BM25",
          "k1": 1.2,
          "b": 0.75,
          "discount_overlaps": "true"
        }
      }
    }
  }
}

BM25 相似度支持以下参数。

参数 数据类型 描述
k1 浮点型 确定非线性词频归一化(饱和)属性。默认值为 1.2
b 浮点型 确定文档长度归一化 TF 值的程度。默认值为 0.75
discount_overlaps 布尔型 确定在计算范数时是否忽略重叠词元(位置增量为零的词元)。默认值为 true(重叠词元在计算范数时不计入)。

配置旧版 BM25 相似度

如果您想保留旧的相似度行为,请将 LegacyBM25 指定为相似度 type

PUT /testindex
{
  "settings": {
    "index": {
      "similarity": {
        "default": {
          "type": "LegacyBM25",
          "k1": 1.2,
          "b": 0.75
        }
      }
    }
  }
}


后续步骤

剩余 350 字符

有问题?

想做贡献?