【发布时间】:2016-09-14 22:00:35
【问题描述】:
我们有一个关于企业名称的查询,它选择不精确匹配比精确匹配更好。
例如,对于以下(伪)查询:
curl -XPOST "$ELASTICSEARCH_ENDPOINT/$ELASTICSEARCH_INDEX/company/_search" -d '
{
"query": {
"match": {
"company_name": "ACME WIDGETS LLC"
}
}
}
'
结果:
- “ACME WIDGETS BUSINESS LLC”(得分:7.8596606)
- “ACME WIDGETS LLC”(得分:7.7698755)(应该是最高结果)
我们尝试了词组匹配,但这太严格了。我们查看了 constant_score 包装器,但这消除了我们确实需要的评分。
我认为在这种情况下映射不会影响查询,但可以根据需要提供。
关于如何获得我们想要的行为的任何建议?我们应该考虑不同的查询类型吗?
使用解释功能表示文档以相同的方式进行分析;我相信会出现稍微不同的分数,因为它们位于不同的分片上。我不明白的是如何在搜索中使用无关单词来惩罚文档。
【问题讨论】:
-
尝试使用
match_phrase而不是match,你会得到什么? -
我建议使用多个
should语句的bool查询。其中一个陈述是完全匹配的。确切的含义取决于您的需要。最简单的方法是为该company_name字段定义一个.raw子字段并将其设为not_analyzed或使用keyword进行分析。那么您的should语句之一将是term查询company_name.raw。如果匹配,它将在总分中添加一个值,如果不匹配,则文档的分数将仅是match语句之一。 -
如果您对这种方法感兴趣,我可以提供一个示例查询和映射。
-
“(伪)查询”是什么意思?如果这不是您实际运行的查询,那么可能值得一看,以确保它实际上 说明了问题。不过,无论如何,如果您无法理解文档以某种方式评分的原因,请尝试使用 Explain。
-
这是确切的查询,而不是我更改了实际搜索词以概括它们,而不是使其非常特定于我们的内部系统。
标签: search elasticsearch lucene full-text-search