首页 文章

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

提问于
浏览
0

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

"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 回答

  • 0

    看起来我想通了 .

    首先,我意识到我原来问题中的例子比必要的更复杂 . 我将其缩小为:“如何撰写'blub'的查询,以2,3,1的顺序返回以下文档”

    id: 1
    name: blub
    weight: 0.01
    ---
    id: 2
    name: blub
    weight: 0.1
    ---
    id: 3
    name: blub stuff
    weight: 1
    

    因此:对于具有相同(或非常相似)得分的两个文件,重量应该用作打破平局 . 但是,不管其重量如何,都不应允许分数明显较低的文件胜过其他结果 .

    我在优秀的Play工具中加载了数据:https://www.found.no/play/gist/edd93c69c015d4c62366#search并开始尝试 .

    原来 log2p 修饰符完全符合我的预期 . 在真实世界的数据集上重复它,一切看起来完全符合预期 .

    function_score: 
        query:
            match:
                name: blub
        field_value_factor:
            field: weight
            modifier: log2p
    

相关问题