[英]Elastic Search Querying/filtering nested arrays
我在ES中的索引test_agg上存儲了以下嵌套數據類型。
{
"Date": "2015-10-21",
"Domain": "abc.com",
"Processed_at": "10/23/2015 9:47",
"Events": [
{
"Name": "visit",
"Count": "188",
"Value_Aggregations": [
{
"Value": "red",
"Count": "100"
}
]
},
{
"Name": "order_created",
"Count": "159",
"Value_Aggregations": [
{
"Value": "$125",
"Count": "50"
}
]
},
]
}
嵌套項的映射為
curl -XPOST localhost:9200/test_agg/nested_evt/_mapping -d '{
"nested_evt":{
"properties":{
"Events": {
"type": "nested"
}
}
}
}'
我正在嘗試使用以下查詢獲取“ Events.Count”和“ Events.Value_Aggregations.Count”,其中Events.Name =“ Visit”
{
"fields" : ["Events.Count","Events.Value_Aggregations.Count"]
"query": {
"filtered": {
"query": {
"match": { "Domain": "abc.com" }
},
"filter": {
"nested": {
"path": "Events",
"query": {
"match": { "Events.Name": "visit" }
},
}
}
}
}
}
而不是結果單值
Events.Count = [188] Events.Value_Aggregations.Count = [100]
它給
Events.Count = [188,159] Events.Value_Aggregations.Count = [100,50]
獲得所需輸出的確切查詢結構是什么?
因此,這里的問題是您要應用的nested
過濾器根據嵌套子文檔的屬性選擇父文檔。 因此,ES會找到與您的查詢匹配的父文檔(基於該文檔的嵌套子級)。 然后,由於您已指定"fields"
因此它不選擇返回所有文檔,而是僅選擇您要的那些字段,而不是返回整個文檔。 這些字段恰好是嵌套字段,並且由於父文檔具有兩個嵌套子級,因此它將為您指定的字段分別找到兩個值並返回它們。 據我所知,沒有辦法返回子文檔,至少是使用nested
體系結構。
解決此問題的一種方法是改為使用父/子關系 ,然后可以將has_parent
查詢與其他過濾器結合使用,針對子類型獲取所需的內容。 只要架構架構不與您的其他需求沖突,這可能是一種更清潔的方法。
但是,有一種方法可以使用當前架構, 嵌套聚合和過濾器聚合來完成您所要查詢的內容。 它有點涉及(在這種情況下有點含糊;請參閱下面的說明),但這是查詢:
POST /test_index/_search
{
"size": 0,
"query": {
"filtered": {
"query": {
"match": {
"Domain": "abc.com"
}
},
"filter": {
"nested": {
"path": "Events",
"query": {
"match": {
"Events.Name": "visit"
}
}
}
}
}
},
"aggs": {
"nested_events": {
"nested": {
"path": "Events"
},
"aggs": {
"filtered_events": {
"filter": {
"term": {
"Events.Name": "visit"
}
},
"aggs": {
"events_count_terms": {
"terms": {
"field": "Events.Count"
}
},
"value_aggregations_count_terms": {
"terms": {
"field": "Events.Value_Aggregations.Count"
}
}
}
}
}
}
}
}
返回:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0,
"hits": []
},
"aggregations": {
"nested_events": {
"doc_count": 2,
"filtered_events": {
"doc_count": 1,
"value_aggregations_count_terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "100",
"doc_count": 1
}
]
},
"events_count_terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "188",
"doc_count": 1
}
]
}
}
}
}
}
警告 :在我這里顯示的內容中,我不清楚您是否真的需要"query"
的"filter": { "nested": { ... } }
子句。 如果此部分以有用的方式過濾掉了父文檔,那么您將需要它。 如果您唯一的選擇是選擇要從中返回字段的嵌套子文檔,則此處多余,因為filter
聚合將負責該部分。
這是我用來測試的代碼:
http://sense.qbox.io/gist/dcc46e50117031de300b6f91c647fe9b729a5283
這是導致我想要的輸出的父子關系查詢
{
"query": {
"filtered": {
"query": {
"bool": {"must": [
{"term": {"Name": "visit"}}
]}
},
"filter":{
"has_parent": {
"type": "domain_info",
"query" : {
"filtered": {
"query": { "match_all": {}},
"filter" : {
"and": [
{"term": {"Domain": 'abc.com'}}
]
}
}
}
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.