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