1. 取得某個索引中某個字段中的所有出現過的值
這種操作類似於使用SQL的SELECT UNIQUE語句。當需要獲取某個字段上的所有可用值時,可以使用terms聚合查詢完成:
GET /index_streets/_search?search_type=count
{
"aggs": { "street_values": { "terms": { "field": "name.raw", "size": 0 } } } }
因為目標是得到name字段上的所有出現過的值,因此search_type被設置為了count,這樣在返回的響應中不會出現冗長的hits部分。另外,查詢的目標字段的索引類型需要設置為not_analyzed。所以上面的field指定的是name.raw。
得到的響應如下所示:
{
"took": 23, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 7445, "max_score": 0, "hits": [] }, "aggregations": { "street_values": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "江蘇路", "doc_count": 29 }, { "key": "南京東路", "doc_count": 28 }, ... ... ...
2. 取得某個索引/類型下某個字段中出現的不同值的個數
這種操作類似於使用SQL的select count( * ) from (select distinct * from table)語句。當需要獲取某個字段上的出現的不同值的個數時,可以使用cardinality聚合查詢完成:
GET /index_streets/_search?search_type=count
{
"aggs": { "uniq_streets": { "cardinality": { "field": "name.raw" } } } }
因為目標是得到name字段上的所有出現過的值,因此search_type被設置為了count,這樣在返回的響應中不會出現冗長的hits部分。另外,查詢的目標字段如果是字符串類型的,那么其索引類型需要設置為not_analyzed。所以上面的field指定的是name.raw。
得到的響應如下所示:
{
"took": 96, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }, "hits": { "total": 4136543, "max_score": 0, "hits": [] }, "aggregations": { "uniq_streets": { "value": 1951 } } }
返回結果表示該字段出現過1951個不同的字符串。