Elastic search中使用nested類型的內嵌對象
假設Elastic search中一個index存儲了系統中的商品及其評論,評論中包括評論者的姓名和年齡,這種情況下需要在elastic search中使用nested類型的內嵌對象.如果使用數組或者object對象的話,姓名和年齡不能被正確的關聯.
1 建立index語句如下
PUT products{ "mappings": { "doc": { "properties": { "comment": { "type": "nested", "properties": { "age": { "type": "integer" }, "name": { "type": "keyword" } } } } } }}
這樣products就有了comment這個nested類型的欄位,comment裡面的對象有age和name
2 用如下方式產生數據
POST products/doc/1{ "comment": [ { "name": "jack", "age": 29 }, { "name": "tim", "age": 30 }, { "name": "ross", "age": 31 } ]}POST products/doc/2{ "comment": [ { "name": "joey", "age": 32 } ]}
3 現在想查詢ross評論過的商品,需要使用nested query
GET products/_search{ "query": { "nested": { "path": "comment", "query": { "term": { "comment.name": { "value": "ross" } } } } }}
path表示了nested欄位的名稱,需要注意的是,查詢語句中要指定查詢欄位的全名,所以評論者姓名要用"comment.name"
如果在多個index上進行nested查詢,沒有nested欄位的index會報錯,這時可以將ignore_unmapped設置為true
4 如果想查看評論者的平均年齡,需要用nested aggregation
GET products/_search{ "size": 0, "aggs": { "nested": { "nested": { "path": "comment" }, "aggs": { "age": { "avg": { "field": "comment.age" } } } } }}
同樣注意要用path指定欄位名稱,返回的數據中,比普通的聚合查詢多了一層嵌套
{ "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 0, "hits": [] }, "aggregations": { "nested": { "doc_count": 4, "age": { "value": 30.5 } } }}
推薦閱讀:
※elasticsearch狀態顯示為red,該如何修復索引呢?
※elasticsearch 倒排索引原理
※grafana與kibana有什麼區別,是不是kibana能做的事情grafana都能做出來?
※Elasticsearch 5.0.0集群安裝
※Elasticsearch到底能玩多大的數據量?
TAG:Elasticsearch |