我正在使用以下查询来搜索名称数据库,允许模糊匹配,但优先选择完全匹配 .
"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]
我正在寻找一个查询,将id 2的结果提升到最高分 . id 3的结果应始终保持在底部,因为它的相关性较差,无论其重量如何 . 理想情况下,使用可调参数来调整分数因子与权重因子 .
任何方式在Elasticsearch的单一传递中做到这一点,当然不会破坏性能?
1 回答
看起来我想通了 .
首先,我意识到我原来问题中的例子比必要的更复杂 . 我将其缩小为:“如何撰写'blub'的查询,以2,3,1的顺序返回以下文档”
因此:对于具有相同(或非常相似)得分的两个文件,重量应该用作打破平局 . 但是,不管其重量如何,都不应允许分数明显较低的文件胜过其他结果 .
我在优秀的Play工具中加载了数据:https://www.found.no/play/gist/edd93c69c015d4c62366#search并开始尝试 .
原来
log2p
修饰符完全符合我的预期 . 在真实世界的数据集上重复它,一切看起来完全符合预期 .