【问题标题】:Preferring exact match results in ElasticSearch在 ElasticSearch 中更喜欢完全匹配的结果
【发布时间】: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


【解决方案1】:

在这种情况下,你可能可以试试这个。 这将为精确匹配提供高分,但也会匹配几乎没有偏差的查询。

让我知道你的结果

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

【讨论】:

    【解决方案2】:

    试试 match_phrase with slop 如下:

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

    【讨论】:

    • 谢谢;这样做的问题是,任何与确切短语的细微偏差都将导致根本不返回任何结果。例如,查询:“ACME WIDGET LLC”将不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多