我正在从地名数据库中查找城市。典型的搜索字符串是“ San Francisco CA”。我有包含城市和州域的文档。我进行match查询,将搜索字符串匹配到城市和州,然后使用组合这些匹配项bool:
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?
constant_score
在ElasticSearch讨论论坛的友好帮助下,我有了一个解决方案。
使IDF保持不变的最简单方法是创建一个自定义类以进行相似度计算。这是我对ElasticSearch 1.7.0的更新示例。
该类强制IDF始终等于1,这解决了我的问题。