重写multiterm查询时,将constant_score添加到每个术语,而不是整个查询

时间:2015-09-22 19:27:29

标签: elasticsearch

我正在寻找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"?

得分为1

1 个答案:

答案 0 :(得分:0)

ElasticSearch discussion forum的帮助下,我有了一个解决方案。

使IDF保持不变的最简单方法是为相似度计算创建自定义类。这是我的updated example for ElasticSearch 1.7.0

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