2016-02-29 28 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