首页 > 解决方案 > ElasticSearch 词袋字段匹配

问题描述

我一直在尝试用 ES 做一件非常简单的事情,并且只能通过一种解决方法进行管理:给定一个查询和一个文档字段,将所有查询的术语与所有字段的术语匹配。换句话说 :

  1. 查询的术语是字段的子集
  2. 该字段的术语是查询的子集

and通过在匹配查询中使用运算符来满足要求 1) 。但我一直无法找到2)的方法。

到目前为止,我设法实现这一目标的唯一方法是利用highlight并要求突出显示所有字符串(在我的应用程序逻辑中)

还有其他方法吗?

例子:

PUT bananas/banana/1
{ "name" : "banana"}

PUT bananas/banana/2
{ "name" : "ripe banana"}


PUT bananas/banana/3
{ "name" : "not so ripe banana"}

GET bananas/_search
{
  "query" : {
    "match": { "_all": { "query": "ripe banana", "operator": "and" } }
  },
  "highlight" : {
    "fields" : { "*" : { } },
    "require_field_match": false
  }
}

# Result (hits only):

  "hits" : {
    "hits" : [
      {
        "_index" : "bananas",
        "_type" : "banana",
        "_id" : "3",
        "_score" : 0.5753642,
        "_source" : {
          "name" : "not so ripe banana"
        },
        "highlight" : {
          "name" : [
            "not so <em>ripe</em> <em>banana</em>"
          ]
        }
      },
      {
        "_index" : "bananas",
        "_type" : "banana",
        "_id" : "2",
        "_score" : 0.51623213,
        "_source" : {
          "name" : "ripe banana"
        },
        "highlight" : {
          "name" : [
            "<em>ripe</em> <em>banana</em>"
          ]
        }
      }
    ]
  }

所以在这种情况下,我想排除“不那么成熟的香蕉”的结果(它甚至出于某种原因首先返回!)。我的解决方法是检查highlight响应的部分以查看是否有未突出显示的内容

标签: elasticsearchelasticsearch-5

解决方案


推荐阅读