首页 > 解决方案 > Elasticsearch API 返回相同数量的文档

问题描述

再会!

Elasticsearch API 出现问题。我编写了一个脚本,在其中执行了几个不同的请求。在这些查询中,我尝试计算过去半小时内来自不同主机的文档数量。

在所有请求中,我使用“GET /log/_count”

"query": {
        "bool": {
                "must": [
                {
                        "match": { "host": "xxx" }
                },
                {
                        "range": {
                                "@timestamp": {
                                        "gte": "now-30m",
                                        "lte": "now"
                                }
                        }
                }
                ]
        }
}

"query": {
        "bool": {
                "must": [
                {
                        "match": { "host" : "yyy" }
                },
                {
                        "range": {
                                "@timestamp": {
                                        "gte": "now-30m",
                                        "lte": "now"
                                }
                        }
                }
                ]
        }
}

"query": {
        "bool": {
                "must": [
                {
                        "match": { "host" : "zzz" }
                },
                {
                        "range": {
                                "@timestamp": {
                                        "gte": "now-30m",
                                        "lte": "now"
                                }
                        }
                }
                ]
        }
}

另一个验证请求:

"query": {
        "bool": {
                "filter": {
                        "range": {
                                "@timestamp": {
                                        "gte": "now-30m",
                                        "lte": "now"
                                }
                        }
                }
        }
}

但是当我运行脚本时,我得到的文档数量大致相同。即使在最后一个应该显示所有文档总和的请求中,也会显示相同的数量,尽管它只配置了“范围”。

XXX: 15691

年年:15689

ZZZ:15689

全部:15689

这是正常行为,还是我做错了什么?

UPD。

"query": {
        "bool": {
                "must": [
                {
                        "match_phrase": { "host" : "xxx" }
                },
                {
                        "range": {
                                "@timestamp": {
                                        "gte": "now-30m",
                                        "lte": "now"
                                }
                        }
                }
                ]
        }
}

标签: apielasticsearchelk

解决方案


这可能是预期的行为。

原因是您有两个适用于now. 您可能会在 time1 上执行 query1,在 time1 上执行 query2。nowtime1 和 time2 是不同的。

同时(time2 - time1),可能会添加一些文档。因此,您会看到细微的差别。

要获得所有主机的计数,

GET logs/_search
{
  "size": 0,
  "aggs": {
    "hosts": {
      "filters": {
        "filters": {
          "xxx": {
            "match": {
              "host": "xxx"
            }
          },
          "yyy": {
            "match": {
              "host": "yyy"
            }
          }
        }
      },
      "aggs": {
        "range": {
          "date_range": {
            "field": "@timestamp",
            "ranges": [
              {
                "to": "now-30m"
              },
              {
                "from": "now"
              }
            ]
          }
        }
      }
    }
  }
}

如果您的值超过一个单词,则需要使用match phrasethan match


推荐阅读