2016-02-29 32 views
1

的不同的價值觀,我解析URL,例如:聚集在參數

example.org/index.html?parameter_1=value_1&parameter_2=value_2 
example.org/index.html?parameter_1=value_1&parameter_2=value_3 
example.org/index.html?parameter_1=value_4&parameter_2=value_3 
example.org/index.html?parameter_1=value_5&parameter_2=value_4 

有通過網址多了很多參數,它們並不總是相同的,它只是簡化。

我想獲得parameter_2的不同值時,parameter_1等於_1和我有多少命中爲每個值(在這種情況下,「VALUE_2」/1和「VALUE_3」/1)。

這裏是我的映射:

"my_index" : { 
    "mappings" : { 
    "urls" : { 
     ... 
     "page" : { "type" : "string", "index" : "not_analyzed" }, 
     "parameters" : { 
      "type" : "nested", 
      "properties" : { 
      "name" : { "type" : "string", "index" : "not_analyzed" }, 
      "value" : { "type" : "string", "index" : "not_analyzed" } 
      } 
     } 
     } 
    } 
    } 
} 

這給我的條目是這樣的:

{ 
    "page": "example.org/index.html", 
    "parameters": [ 
    { "name": "parameter_1", "value": "value_1" }, 
    { "name": "parameter_2", "value": "value_2" } 
    ] 
} 

如果我想這樣做,但在頁面上,我可以做這樣的過濾聚集:

{ 
    "size": 0, 
    "aggs": { 
     "sitecodes": { 
      "filter": { 
       "nested": { 
        "path": "parameters", 
        "query": { 
         "bool": { 
          "must": [ 
           { 
            "term": { 
             "parameters.name": "parameter_1" 
            } 
           }, 
           { 
            "term": { 
             "parameters.value": "value_1" 
            } 
           } 
          ] 
         } 
        } 
       } 
      }, 
      "aggs": { 
       "pages": { 
        "terms": { 
         "field": "page" 
        } 
       } 
      } 
     } 
    } 
} 

但我無法找到一種方法來做相同的參數_2的值。

作爲一種變通方法,我可以複製我的映射信息,纔能有這樣的條目:

{ 
    "page": "example.org/index.html", 
    "parameter_1": "value_1", 
    "parameters": [ 
    { "name": "parameter_1", "value": "value_1" }, 
    { "name": "parameter_2", "value": "value_2" } 
    ] 
} 

但我相信有一個更好的方式來做到這一點,即使我還沒有找到它然而。

有什麼想法?

+0

如果裏面你必須使用一個術語查詢或多個匹配查詢?接受多個條款的條款? –

回答

1

我相信如果你使用Nested Aggregation的組合和Filter Aggregation可以實現你正在尋找的結果。

nested聚合可以讓你聚集在你的嵌套文檔。但是,每個嵌套文檔都包含「名稱」和「值」。既然你是隻在「parameter_2」的獨特價值感興趣,你需要過濾的,其中「名」是「parameter_2」。最後,您可以在「值」字段做terms聚集。

這裏是爲我工作的例子:哪個返回了以下結果如預期(使用示例數據)

{ 
    "size": 0, 
    "aggs": { 
    "sitecodes": { 
     "filter": { 
     "nested": { 
      "path": "parameters", 
      "query": { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "parameters.name": "parameter_1" 
        } 
       }, 
       { 
        "term": { 
        "parameters.value": "value_1" 
        } 
       } 
       ] 
      } 
      } 
     } 
     }, 
     "aggs": { 
     "my_nested": { 
      "nested": { 
      "path": "parameters" 
      }, 
      "aggs": { 
      "parmFilter": { 
       "filter": { 
       "term": { 
        "parameters.name": "parameter_2" 
       } 
       }, 
       "aggs": { 
       "groupByValue": { 
        "terms": { 
        "field": "parameters.value", 
        "size": 10 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

... 
"aggregations": { 
    "sitecodes": { 
    "doc_count": 2, 
    "my_nested": { 
     "doc_count": 4, 
     "parmFilter": { 
      "doc_count": 2, 
      "groupByValue": { 
       "doc_count_error_upper_bound": 0, 
       "sum_other_doc_count": 0, 
       "buckets": [ 
       { 
        "key": "value_2", 
        "doc_count": 1 
       }, 
       { 
        "key": "value_3", 
        "doc_count": 1 
       } 
       ] 
      } 
     } 
    } 
    } 
} 
+0

曾在parmFilter使用params_exploded.name和params_exploded.value而不是名稱和價值,但它的工作原理...謝謝你救了我小時! – Pandawan

+0

@Pandawan對,對不起。在ES需要'嵌套'查詢和aggs中的全限定字段名稱之前,我在版本1.7上進行了測試。我將編輯我的答案以與所有版本兼容。很高興我能幫上忙! – BrookeB