簡體   English   中英

彈性搜索查詢/過濾嵌套數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM