【问题标题】:When rewriting multiterm query, add constant_score to every term, not to the whole query重写多项查询时,将 constant_score 添加到每个项,而不是整个查询
【发布时间】: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 查询中,您可以将 citymust match 查询与 should混合使用> constant_score 查询 state(前提是您不太关心提升匹配包含多个术语的状态)。

标签: elasticsearch


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2013-12-11
    • 2018-09-11
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    相关资源
    最近更新 更多