elasticsearch 在Elasticsearch中,仅提升分数接近相同的结果
我使用下面的查询来搜索姓名数据库,允许模糊匹配,但优先考虑精确匹配elasticsearch 在Elasticsearch中,仅提升分数接近相同的结果,elasticsearch,lucene,elasticsearch,Lucene,我使用下面的查询来搜索姓名数据库,允许模糊匹配,但优先考虑精确匹配 "query": { "bool": { "should": [ { "match": { "name": { "query": "x", "operator": "and",
"query": {
"bool": {
"should": [
{
"match": {
"name": {
"query": "x",
"operator": "and",
"boost": 10
}
}
},
{
"match": {
"name": {
"query": "x",
"fuzziness": "AUTO",
"operator": "and"
}
}
},
{
"match": {
"altname": {
"query": "x",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
]
}
}
数据库包含具有相同名称的条目。如果出现这种情况,我想增加第二个字段来增加这些条目,我们称之为weight
。但是,我只希望在分数(接近)相同的结果子集之间应用提升,而不是所有结果
具有相同名称的结果可能会得到稍有不同的分数,因为它们受到altname
字段上相关性的影响,这一事实使情况更加复杂
例如,查询dog
可以得到3个结果:
- 狗[id 1,得分2.3,体重10]
- 狗[id 2,得分2.2,体重20]
- 狗[id 3,得分1,体重100]
在Elasticsearch中,有没有任何方法可以在不破坏性能的情况下一次完成这项工作?看起来我已经找到了答案 首先,我意识到我原来问题中的例子过于复杂。我把范围缩小到:“如何编写一个“blub”查询,它以2、3、1的顺序返回以下文档” 因此:对于分数相同(或非常相似)的两份文件,应将重量用作平局破坏者。但分数明显较低的文件永远不应该被允许胜过其他结果,不管其权重如何 我将数据加载到优秀的Play工具中:并开始实验 原来
log2p
修饰符完全符合我的预期。在现实世界的数据集上重复这个过程,一切看起来都和预期的一模一样
function_score:
query:
match:
name: blub
field_value_factor:
field: weight
modifier: log2p
对于分数来说,多重
weight
,即boost\u模式:多重,在OPI中的示例中,它起作用,稍微更改了weight
数字,以澄清问题。由于模糊匹配,结果通常包括得分明显低于顶级结果的匹配。我不想让它们被提升到顶部,不管它们的权重如何。您可以使用函数分数仅在非模糊查询匹配上应用权重,下面提供了一个示例答案。
function_score:
query:
match:
name: blub
field_value_factor:
field: weight
modifier: log2p