在ElasticSearch中优先选择精确匹配结果

时间:2016-05-18 12:11:02

标签: search elasticsearch lucene full-text-search

我们对商家名称进行了查询,选择不精确的匹配比完全匹配更好。

例如,对于以下(伪)查询:

unlink('a34160518200001.jpg');

结果:

  • " ACME WIDGETS BUSINESS LLC" (得分:7.8596606)
  • " ACME WIDGETS LLC" (得分:7.7698755)(应该是最佳结果)

我们尝试过短语匹配,但这太严格了。我们查看了constant_score包装器,但这消除了我们需要的评分。

在这种情况下,我不相信映射会影响查询,但如果需要,可以提供。

有关如何获得我们想要的行为的任何建议?我们应该考虑不同的查询类型吗?

使用说明功能表明文档的分析方式相同;我认为发生的分数略有不同,因为它们位于不同的分片上。我不明白的是如何在搜索中用一个无关紧要的词来处罚文件。

2 个答案:

答案 0 :(得分:0)

Try match_phrase with slop as below:

curl -XPOST "$ELASTICSEARCH_ENDPOINT/$ELASTICSEARCH_INDEX/company/_search" -d '
{
  "query": {
      "match_phrase": {
          "company_name": {
             "query": "ACME WIDGETS LLC",
             "slop":  5
        }
    }
  }
}
'

答案 1 :(得分:0)

在这种情况下你可以试试这个。 这将给出完全匹配的高分,但也会匹配一个偏差很小的查询。

告诉我你的结果

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "company_name": {
              "query": "ACME WIDGETS LLC",
              "slop": 5,
              "boost": 5
            }
          }
        },
        {
          "match": {
            "company_name": {
              "query": "ACME WIDGETS LLC",
              "boost": 1
            }
          }
        }
      ]
    }
  }
}