arrays - Elasticsearch-数组过滤器中的值

标签 arrays elasticsearch filter

我想过滤掉所有在数组字段中包含特定值的文档。即该值是该数组字段的元素。

具体来说-我想选择names包含test-name的所有文档,请参见下面的示例。

所以当我用

curl -XGET localhost:9200/test-index/_search

结果是
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 50,
    "max_score": 1,
    "hits": [
      {
        "_index": "test-index",
        "_type": "test",
        "_id": "34873ae4-f394-42ec-b2fc-41736e053c69",
        "_score": 1,
        "_source": {
          "names": [
            "test-name"
          ],
          "age": 100,
          ...
        }
      },
      ...
   }
}

但是如果是更具体的查询
curl -XPOST localhost:9200/test-index/_search -d '{
  "query": {
    "bool": {
      "must": {
        "match_all": {}

      },
      "filter": {
        "term": {
           "names": "test-name"
        }
      }
    }
  }
}'

我没有任何结果
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

有一些与此类似的问题。虽然,我无法获得为我工作的任何答案。

系统规格:Elasticsearch 5.1.1Ubuntu 16.04
编辑
curl -XGET localhost:9200/test-index
          ...
          "names": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          ...

最佳答案

这是因为分析了names字段,并且将test name索引为两个标记testname

因此,搜索test name术语将不会产生任何结果。如果改用match,则将获得文档。

如果您想检查test name的确切值(即两个标记一个接一个),那么您需要将names字段更改为keyword类型,而不是text
更新

根据您的映射,分析了names字段,您需要改为使用names.keyword字段,它将起作用,如下所示:

curl -XPOST localhost:9200/test-index/_search -d '{
  "query": {
    "bool": {
      "must": {
        "match_all": {}

      },
      "filter": {
        "term": {
           "names.keyword": "test-name"
        }
      }
    }
  }
}'

关于arrays - Elasticsearch-数组过滤器中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683526/

相关文章:

C 从函数返回字符数组

ios - HackerRink 解决方案重构代码 (Swift)

jquery - Elasticsearch 查询 - 如何聚合时间戳并按术语过滤?

javascript - 如何根据多属性和多属性值显示/隐藏元素?

r - 使用另一个条件过滤某些值和多个先前行

http - 谷歌开发者工具 : How can I filter by request method (e. g。 POST)在网络选项卡中?

arrays - 如何在 bash shell linux 中交换数组元素?

javascript - 返回数组中的第一个重复数字

java - ElasticSearch SpringBoot+Spring Data : java. lang.IllegalStateException:在接口(interface)上找不到合适的构造函数

elasticsearch - 如何进行适当的查询以通过ID选择并随后使用 Elasticsearch 进行更新?