弹性搜索 - 使用嵌套过滤数组作为存储桶

Posted

技术标签:

【中文标题】弹性搜索 - 使用嵌套过滤数组作为存储桶【英文标题】:elastic search - using a nested filtered array as bucket 【发布时间】:2015-09-09 15:49:05 【问题描述】:

我有点迷茫……

考虑一下这个简单的索引文档:


"url" : "http://...?mypage"
"pages": [
 
  "elapsed": 1190,
  "type": "LOADPAGE"
 ,
 
  "elapsed": 115400,
  "type": "ONPAGE"
 ,
 
  "elapsed": 1100,
  "type": "LOADPAGE"
 ,
 
  "elapsed": 1340,
  "type": "ONPAGE"
 
]    

我正在尝试计算平均 LOADPAGE,所以我知道我需要“avg”或“stats”聚合。

"aggs": 
    "compute_loadpage": 
        "filter":  "term":  "pages.type": "loadpage"  ,
        "aggs": 
            "loadpage_all": 
                "stats": 
                    "field": "pages.elapsed"
                
            
       
    

我知道“过滤器” agg 将创建一个包含与我的过滤器对应的所有文档的存储桶,那么我的 agg 将在我的完整“页面”数组上完成是可以理解的。

我怎样才能创建一个只有 LOADPAGE 值的存储桶,然后我就可以对其进行聚合,或者我必须使用脚本聚合吗?

【问题讨论】:

【参考方案1】:

只要您的文档映射使用nested type,您就可以使用nested aggregation。

为了测试,我设置了一个像这样的简单索引(注意嵌套类型,以及"pages.type" 上的"index": "not_analyzed"):

PUT /test_index

   "settings": 
      "number_of_shards": 1
   ,
   "mappings": 
      "doc": 
         "properties": 
            "pages": 
               "type": "nested",
               "properties": 
                  "elapsed": 
                     "type": "long"
                  ,
                  "type": 
                     "type": "string",
                     "index": "not_analyzed"
                  
               
            ,
            "url": 
               "type": "string"
            
         
      
   

然后我索引了你的文档:

PUT /test_index/doc/1

   "url": "http://...?mypage",
   "pages": [
      
         "elapsed": 1190,
         "type": "LOADPAGE"
      ,
      
         "elapsed": 115400,
         "type": "ONPAGE"
      ,
      
         "elapsed": 1100,
         "type": "LOADPAGE"
      ,
      
         "elapsed": 1340,
         "type": "ONPAGE"
      
   ]

那么这个聚合似乎提供了你想要的:

POST /test_index/_search?search_type=count

   "aggs": 
      "pages_nested": 
         "nested": 
            "path": "pages"
         ,
         "aggs": 
            "loadpage_filtered": 
               "filter": 
                  "term": 
                     "pages.type": "LOADPAGE"
                  
               ,
               "aggs": 
                  "loadpage_avg_elap": 
                     "avg": 
                        "field": "pages.elapsed"
                     
                  
               
            
         
      
   

...

   "took": 3,
   "timed_out": false,
   "_shards": 
      "total": 1,
      "successful": 1,
      "failed": 0
   ,
   "hits": 
      "total": 1,
      "max_score": 0,
      "hits": []
   ,
   "aggregations": 
      "pages_nested": 
         "doc_count": 4,
         "loadpage_filtered": 
            "doc_count": 2,
            "loadpage_avg_elap": 
               "value": 1145,
               "value_as_string": "1145.0"
            
         
      
   

这是我用来测试的代码:

http://sense.qbox.io/gist/b526427f14225b02e7268ed15d8c6dde4793fc8d

【讨论】:

以上是关于弹性搜索 - 使用嵌套过滤数组作为存储桶的主要内容,如果未能解决你的问题,请参考以下文章

应用聚合后过滤掉弹性搜索中的术语聚合桶

如何在弹性搜索的过滤器聚合中引用多个嵌套级别?

弹性搜索/和嵌套可能?

我的弹性映射中有一个嵌套对象。我正在尝试为该嵌套对象创建过滤器查询

通过搜索嵌套对象属性过滤对象数组

递归过滤/减少嵌套对象