ElasticSearch部分短语匹配

时间:2016-06-09 17:03:03

标签: elasticsearch full-text-search

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

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

但是这只匹配所有 4个条款的条目(愚蠢,狗,玩,约)。理想情况下它仍然匹配像“正在玩的傻狗”之类的东西,它没有“约”关键字(因此会得到较低的分数)。

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

有人能指出我在正确的方向吗?只是要明确:

  • 关键字的订单很重要(match_phraseslop允许我们这样做)
  • 关键字匹配的数量match_phrase只是在任何关键字丢失的情况下排除项目 - 这对我的情况并不理想)

谢谢!

2 个答案:

答案 0 :(得分:5)

推荐的解决方案是:

  

我们可以,而不是将邻近匹配作为绝对要求   将它用作信号 - 作为潜在的许多查询之一,每个查询都是如此   有助于每个文档的总分(参见大多数字段)。

这里有一篇描述它的文章: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
          }
        }
      }
    }
  }

答案 1 :(得分:-1)

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

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

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