对参数

时间:2016-02-29 12:32:12

标签: elasticsearch

我正在解析以下网址:

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

url有更多参数,它们并不总是相同,只是为了简化。

我想在parameter_1等于value_1 时得到不同的parameter_2值以及每个值有多少命中(在这种情况下" value_2" / 1和&# 34; 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"
                    }
                }
            }
        }
    }
}

但我无法找到一种方法对parameter_2的值进行相同的操作。

作为一种解决方法,我可以复制映射中的信息,以便输入如下条目:

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

但我相信有更好的方法,即使我还没有找到它。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我相信如果您使用Nested AggregationFilter Aggregation的组合,您可以获得所需的结果。

nested聚合允许您在嵌套文档上进行聚合。但是,每个嵌套文档都包含一个" name"和"价值"。由于您只对" parameter_2"的不同值感兴趣,因此您需要过滤" name"是" 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
                 }
              ]
           }
        }
     }
  }
}