1. 程式人生 > >[Elasticsearch] 常用查詢和操作總結

[Elasticsearch] 常用查詢和操作總結

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個不同的字串。

本文將會不斷更新。