仅提升Elasticsearch中得分几乎相同的结果

时间:2015-11-03 23:23:19

标签: elasticsearch lucene

我使用以下查询搜索名称数据库,允许模糊匹配,但优先选择完全匹配。

"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]
  • Doge [id 3,得分1,体重100]

我正在寻找能够将id 2提升到最高分的结果的查询。 id 3的结果应始终保持在底部,因为它的相关性较差,无论其重量如何。理想情况下,使用可调参数来调整得分因子与权重因子。

任何方式在Elasticsearch的单一传递中做到这一点,当然不会破坏性能?

1 个答案:

答案 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