一、基本概念
ES(Elasticsearch)是一個分佈式、RESTful風格的搜索和分析引擎,可以解決海量數據的存儲和檢索問題。ES中的基本存儲單元是文檔,而每個文檔可以包含一個或多個字段。在ES中,基於查詢語句可以完成對文檔的修改、刪除、排序、分頁等操作。
ES中的數組查詢,即對於文檔中的數組字段(如成績單、標籤等),可以通過查詢語句完成其對應的檢索、聚合、過濾等操作。
二、數組查詢方式
ES提供了多種方式來完成對於數組字段的查詢,主要有以下幾種:
1、term查詢
{ "query": { "term": { "tags": "happy" } } }
該查詢會匹配文檔中包含”tags”字段,並且該字段中包含值為”happy”的元素。
2、terms查詢
{ "query": { "terms": { "tags": ["happy", "angry"] } } }
該查詢會匹配文檔中包含”tags”字段,並且該字段中包含值為”happy”或”angry”任意一個元素。
3、match查詢
{ "query": { "match": { "tags": "happy angry" } } }
該查詢會匹配文檔中包含”tags”字段,並且該字段中包含同時包含”happy”和”angry”的元素。
4、match_phrase查詢
{ "query": { "match_phrase": { "tags": "happy angry" } } }
該查詢會匹配文檔中包含”tags”字段,並且該字段中包含相鄰同時包含”happy”和”angry”的元素。
5、nested查詢
{ "query": { "nested": { "path": "grades", "query": { "bool": { "must": [ {"match": {"grades.grade": "A"}} ], "filter": [ {"term": {"grades.student": "john"}} ] } } } } }
該查詢會查詢出文檔中包含”grades”字段,並且該字段中存在元素”grade”等於”A”,且”student”等於”john”的文檔。
三、查詢結果的優化
在ES中,對於多字段的查詢,可以通過以下方式優化查詢結果:
1、source屬性過濾字段
{ "_source": ["title", "content"], "query": { "match": { "title": "hello" } } }
該查詢結果中,只會返回”title”和”content”字段。
2、size屬性限制返回結果數量
{ "size": 10, "query": { "match_all": {} } }
該查詢結果中,只會返回符合條件的前10條文檔。
3、from屬性進行分頁操作
{ "from": 10, "size": 10, "query": { "match_all": {} } }
該查詢結果中,只會返回符合條件的第10條到第20條文檔。
四、數組的聚合操作
在ES中,聚合(Aggregations)是將多個文檔集合起來,對於其中的某些字段進行計算和統計。對於數組字段,也可以使用聚合完成類似「統計每個標籤的出現次數」等操作。
1、terms聚合
{ "aggs": { "tags_count": { "terms": {"field": "tags"} } } }
該聚合會計算出”tags”字段中每個元素出現的次數。
2、range聚合
{ "aggs": { "age_groups": { "range": { "field": "age", "ranges": [ {"to": 10}, {"from": 10, "to": 20}, {"from": 20} ] } } } }
該聚合會將”age”字段根據不同的範圍進行劃分,然後計算每個範圍內的文檔數量。
3、nested聚合
{ "aggs": { "student_count": { "nested": {"path": "grades"}, "aggs": { "student_name": {"terms": {"field": "grades.student"}} } } } }
該聚合會計算出每個學生的成績數量。
五、總結
ES中的數組查詢方式有很多種,可以根據查詢需求來選擇不同的方式。同時,通過限制查詢結果數量、分頁、進行字段過濾等方式,可以優化查詢效率。在完成文檔的聚合計算時,也可以使用ES提供的聚合操作。
原創文章,作者:EKKC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149683.html