关键字搜索
默认情况下,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
}
}
}
}
}