Elasticsearch查询文档的一部分

时间:2017-03-02 16:08:50

标签: elasticsearch filter sum range

我的索引中包含以下样式的文档:

{
  "docType": {
    "valuesOverTime": [
        {
            "begin": 1488442858570,
            "end": 1488442860570,
            "values": [
                {
                    "name": "level",
                    "segCount": 4
                }
            ]
        },
        {
            "begin": 1488442860571,
            "end": 1488442890592,
            "mcdn": [
                {
                    "name": "level",
                    "segCount": 10
                }
            ]
        },
        {
            "begin": 1488442890593,
            "end": 1488442890600,
            "mcdn": [
                {
                    "name": "level",
                    "segCount": 7
                }
            ]
        }
    ]
  }
}

并且想要在特定时间范围内查询docType.valuesOverTime.values.segCount的总和,如下面的范围

{
  "range": {
    "docType.valuesOverTime.begin": {
      "gte": 1488442858570,
      "lte": 1488442860571
    }
  }
},
{
  "range": {
    "docType.valuesOverTime.end": {
      "gte": 1488442860570,
      "lte": 1488442890592

    }
  }
}

应该得到前两个条目的总和:14。

但是我绝对不能正确查询!在这种情况下,我总是得到docType.valueOverTime.values.segCount中所有条目的总和为21。

我尝试了以下查询及其中的一些变体,当然这些都是错误的:

{
    "size": 0,
    "aggs": {
        "myfilter": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "docType.valuesOverTime.begin": {
                      "gte": 1488442858570,
                      "lte": 1488442860571
                    }
                  }
                },
                {
                  "range": {
                    "docType.valuesOverTime.end": {
                      "gte": 1488442860570,
                      "lte": 1488442890592

                    }
                  }
                }                   
              ]
            }
          },
          "aggs": {
            "summe": {
              "sum": {
                "field": "docType.valuesOverTime.values.segCount"
              }
            }
          }
        } 
    }
}

{
  "_source": "docType.valuesOverTime.values", 
  "query": {
    "constant_score" : {
      "filter" : {
        "bool": {
          "must": [
            {
              "range": {
                "docType.valuesOverTime.begin": {
                  "gte": 1488442858570,
                  "lte": 1488442860571
                }
              }
            },
            {
              "range": {
                "docType.valuesOverTime.end": {
                  "gte": 1488442860570,
                  "lte": 1488442890592

                }
              }
            }   

          ]
        }
      }
    }
  },
  "aggs": {
    "summe": {
      "sum": {
        "field": "docType.valuesOverTime.values.segCount"
      }
    }
  }
}

有人可以告诉我,我错了吗?以及如何正确行事!

使用以下映射

处理es 5.2.2
"valuesOverTime": {
    "properties": {
      "begin": {
        "type": "long"
      },
      "end": {
        "type": "long"
      },
      "values": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "segCount": {
            "type": "long"
          }
        }
      }
    }
}

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题:

首先,valuesOverTime中的所有内容都需要嵌套,以便映射看起来像

"valuesOverTime": {
    "type": nested"
    "properties": {
      "begin": {
        "type": "long"
      },
      "end": {
        "type": "long"
      },
      "values": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "segCount": {
            "type": "long"
          }
        }
      }
    }
}

然后我可以查询如下:

{
  "size": 0, 
  "aggs": {
    "nestedAcq": {
      "nested": {"path": "docType.valuesOverTime"},
      "aggs": {
        "rangeAcq": {
          "range": {
            "field": "ocType.valuesOverTime.begin",
            "ranges": [
              {
                "from": 1488442858570,
                "to": 1488442860572
              }
            ]
          },
          "aggs": {
            "theSum": {
              "sum": {                
                "field": "docType.valuesOverTime.values.segCount"
              }
            }
          }
        }
      } 

    }
  }
}

并获取

"theSum": {
    "value": 14
}