[Elasticsearch] 常用查詢和操作總結
阿新 • • 發佈:2019-02-16
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個不同的字串。
本文將會不斷更新。