【问题标题】:ElasticSearch partial phrase matchingElasticSearch 部分词组匹配
【发布时间】:2016-10-10 11:19:18
【问题描述】:

我是 ElasticNoob,但我一直在玩一些简单的短语匹配,如下所示:

query: {
  match_phrase: {
    my_field: {
      query: "silly dogs playing about",
      slop:  100
    }
  }
}

但这仅匹配具有所有 4 个术语(silly、dogs、playing、about)的条目。理想情况下,它仍会匹配没有“about”关键字的“正在玩耍的傻狗”之类的内容(因此会获得较低的分数)。

这似乎是文本搜索引擎的一个非常常见的用例,所以我认为我的 Google-fu 一定很弱,因为我在弹性搜索中找不到任何关于部分短语匹配的信息。

有人可以在这里指出正确的方向吗?明确一点:

  • 关键字的顺序很重要(match_phraseslop 允许我们这样做)
  • 关键字匹配的个数很重要(match_phrase 只是在缺少任何个关键字时排除项目 - 这不适合我的情况)

谢谢!

【问题讨论】:

    标签: elasticsearch full-text-search


    【解决方案1】:

    推荐的解决方案是:

    与其将邻近匹配作为绝对要求,我们可以 使用它作为一个信号——作为潜在的许多查询之一,每个查询 对每个文档的总分有贡献(请参阅大多数字段)。

    这里有文章描述它:https://www.elastic.co/guide/en/elasticsearch/guide/current/proximity-relevance.html

    所以你的查询看起来像:

      query: {
        bool: {
          must: {
            match: {
              my_field: {
                query: "silly dogs playing about",
                minimum_should_match: "30%"
              }
            }
          },
          should: {
            match_phrase: {
              my_field: {
                query: "silly dogs playing about",
                slop:  50
              }
            }
          }
        }
      }
    

    【讨论】:

    • 啊,正是我要找的——谢谢!很有魅力。
    【解决方案2】:

    您可以使用变量调用 minimum_should_match 来指定需要匹配的单词的百分比或指定应该匹配的单词数量。

    query: {
      match_phrase: {
        my_field: {
          query: "silly dogs playing about",
          slop:  100,
          minimum_should_match: "75%"
        }
      }
    }
    

    这意味着 4 个单词中至少有 3 个单词需要匹配才能成为热门。

    【讨论】:

    • 这行不通。 match_phrase 不支持minimum_should_match 参数。
    猜你喜欢
    • 2013-08-08
    • 2020-02-02
    • 2018-11-01
    • 2018-03-17
    • 2016-03-01
    • 1970-01-01
    • 2013-09-11
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多