我正在寻找geonames db的城市。典型的搜索字符串将是#34;旧金山CA"。我有一个有城市和州的文件。我执行match
查询,将搜索字符串与城市和州匹配,然后使用bool
组合这些匹配:
"query" : {
"bool" : {
"must" : {
"match" : {
"country" : {
"query" : "San Francisco CA"
}
}
},
"should" : {
"match" : {
"city" : {
"query" : "San Francisco CA"
}
}
}
}
}
我在db中有这两个文件:
{"city" : "San Francisco", "state" : "CA"}
{"city" : "San Marino", "state" : "San Marino"}
问题在于匹配" san"圣马力诺州的得分远远高于将CA与旧金山的州匹配,因为有很多城市都有州和#34; CA"很少有城市和#34;圣马力诺"。
我尝试使用constant_score
禁用IDF,但这会导致另一个问题:匹配"旧金山CA"到旧金山"其中两个术语匹配得分与匹配#34;旧金山CA"到圣马力诺"只有一个术语匹配的地方。当一个多项匹配查询被重写为单独的术语时,是否可以constant_score
每个重写的查询,这样我得到的分数为2匹配"旧金山"只有" San"?
答案 0 :(得分:0)
在ElasticSearch discussion forum的帮助下,我有了一个解决方案。
使IDF保持不变的最简单方法是为相似度计算创建自定义类。这是我的updated example for ElasticSearch 1.7.0。
该类强制IDF始终等于1,这解决了我的问题。