返回文档的数组字段包含Elasticsearch 6.x中用户数组中的所有元素

时间:2019-04-08 18:54:26

标签: arrays elasticsearch intersection

我所有的文档都有一个字段tags,类型为Array。我想搜索并返回具有用户输入数组的tags交点的所有文档。元素的数量是可变的,而不是固定的大小。

示例
tags:["python", "flask", "gunicorn"]
input:["python"]

  • 这将返回true,因为所有中的元素在input中。

tags
tags:["nginx", "pm2"]

  • 这将返回input:["nodejs", "nginx", "pm2", "microservice"],因为false"nodejs"不在"microservice"中。

我调查了tags查询,但我认为它不适用于数组。

我也找到了Elasticsearch array property must contain given array items,但是解决方案是针对旧版本的Elasticsearch,语法已经更改。

1 个答案:

答案 0 :(得分:0)

我相信您正在寻找terms_set-参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-set-query.html

PUT tags

POST tags/_doc
{
  "tags": ["python", "flask", "gunicorn"]
}

POST tags/_doc
{
  "tags": ["nginx", "pm2"]
}

GET tags/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": ["nginx", "pm2"],
        "minimum_should_match_script": {
          "source": "params.num_terms"
        }
      }
    }
  }
}

返回:

  "hits" : {
    "total" : 1,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "tags",
        "_type" : "_doc",
        "_id" : "XZqN_mkB94Kxh8PwtQs_",
        "_score" : 0.5753642,
        "_source" : {
          "tags" : [
            "nginx",
            "pm2"
          ]
        }
      }
    ]
  }

查询示例中的完整列表

GET tags/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": ["nodejs", "nginx", "pm2", "microservice"],
        "minimum_should_match_script": {
          "source": "params.num_terms"
        }
      }
    }
  }
}

没有得到预期的结果:

  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }