【发布时间】:2015-09-24 15:44:33
【问题描述】:
我正在从 geonames db 中寻找城市。典型的搜索字符串是“旧金山 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”,而很少有城市使用“圣马力诺”。
我尝试使用 constant_score 禁用 IDF,但这会导致另一个问题:将“San Francisco CA”匹配到“San Francisco”,其中两个术语匹配得到的分数与将“San Francisco CA”匹配到“San Marino”相同" 只有一个词匹配。当多术语匹配查询被重写为单独的术语时,是否可以 constant_score 每个重写的查询,这样我匹配“旧金山”的得分为 2,匹配“旧金山”的得分为 1 ?
【问题讨论】:
-
如果你使用
constant_score,你会失去match中的coord-factor,这确实会增加匹配多个查询词的情况的分数。 -
在您的
bool查询中,您可以将 city 的 mustmatch查询与 should混合使用>constant_score查询 state(前提是您不太关心提升匹配包含多个术语的状态)。
标签: elasticsearch