一尘不染

重写多项查询时,请在每个项(而不是整个查询)中添加constant_score

elasticsearch

我正在从地名数据库中查找城市。典型的搜索字符串是“ San Francisco
CA”。我有包含城市和州域的文档。我进行match查询,将搜索字符串匹配到城市和州,然后使用组合这些匹配项bool

"query" : {
    "bool" : {
        "must" : {
            "match" : {
                "country" : {
                    "query" : "San Francisco CA"
                }
            }
        },
        "should" : {
            "match" : {
                "city" : {
                    "query" : "San Francisco CA"
                }
            }
        }
    }
}

我的数据库中有以下两个文档:

{"city" : "San Francisco", "state" : "CA"}
{"city" : "San Marino", "state" : "San Marino"}

问题在于,将“ san”匹配到圣马力诺州的得分要比将CA匹配到旧金山州的得分高得多,因为存在许多州“ CA”的城市和很少州“ San Marino”的城市。

我尝试使用禁用IDF
constant_score,但这会导致另一个问题:将匹配两个术语的“旧金山CA”匹配到“旧金山”,将仅匹配一个术语的“旧金山CA”匹配到“圣马力诺”得到相同的分数。当将一项多项匹配查询重写为单独的术语时,是否可以对constant_score每个重写查询进行查询,以使匹配“
San Francisco”的得分为2,而仅匹配“ San”的得分为1?


阅读 280

收藏
2020-06-22

共1个答案

一尘不染

ElasticSearch讨论论坛的友好帮助下,我有了一个解决方案。

使IDF保持不变的最简单方法是创建一个自定义类以进行相似度计算。这是我对ElasticSearch
1.7.0的更新示例

该类强制IDF始终等于1,这解决了我的问题。

2020-06-22