Elasticsearch在列表字段中查找唯一项

时间:2018-07-21 11:43:41

标签: elasticsearch

需要查找列表字段中的唯一字符串值。

问题类似于ElasticSearch - Return Unique Values 但是现在字段值是列表

记录:

PUT items/1
{ "tags" : ["a", "b"] }

PUT items/2
{ "tags" : ["b", "c"] }

PUT items/3
{ "tags" : ["a" "d"] }

查询:

GET items/_search
{ ... }
# => Expected Response
["a", "b", "c", "d"]

有没有办法进行这种搜索?

1 个答案:

答案 0 :(得分:1)

好消息!我们可以使用与the SO post you linked to in the description中使用的聚合完全相同的聚合。实际上,如果我们要提交数字值列表,那么我们的工作已经完成!但是,此问题与您引用的问题之间的主要区别在于您使用的是“字符串”类型。

知道在Elasticsearch的最新版本中有two ways to represent "strings" in elasticsearch并且实际上不再将该类型称为字符串是有用的。使用keyword类型会将整个文本视为单个标记,而使用text类型将应用分析器将文本分解为许多不同的标记,并使用这些标记建立索引。

例如,字符串“ Foxes is brown”可以在索引中表示为"foxes are brown"["foxes", "are", "brown"]。在您的情况下,应将标签视为关键字,因此我们需要告诉elasticsearch该字段是keyword而不是默认的text

注意::尽可能使用关键字类型将减轻需要允许Elasticsearch将字段数据设置为true的问题,如果使用这种聚合则uses up a lot of memory in your cluster。标签和顺序数据是关键字类型的理想选择。

无论如何,让我们开始了解真正的东西吧?

首先,您将要设置项目中标签的映射作为关键字类型。

curl --request PUT \
  --url http://localhost:9200/items \
  --header 'content-type: application/json' \
  --data '{
  "mappings": {
    "item": { 
      "properties": { 
        "tags" :    { "type": "keyword"  }
      }
    }
  }
}
'

然后,您将运行与您引用的帖子中的汇总类似的汇总。

curl --request POST \
  --url http://localhost:9200/items/item/_search \
  --header 'content-type: application/json' \
  --data '{
    "size": 0,
    "aggregations": {
        "tags_term_agg": {
            "terms": {
                "field": "tags"
            }
        }
    }
}'

您的回复应如下所示。

{
    "took": 24,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "tags_term_agg": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "a",
                    "doc_count": 2
                },
                {
                    "key": "b",
                    "doc_count": 2
                },
                {
                    "key": "c",
                    "doc_count": 1
                },
                {
                    "key": "d",
                    "doc_count": 1
                }
            ]
        }
    }
}