0

使用 Sense 工具,我有两个非常简单的查询。除了方法(GET 或 POST)之外,查询是相同的。一次运行一个查询时,我看到的结果虽然非常相似,但在似乎与查询本身无关的方式上有所不同(例如,take, max_score),并且随着我扩大范围而变得不那么相似。

例如,这些返回的结果与我预期的相同:

我的 GET 查询:

GET syslog-*/_search
{
  "size": 5, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  }
}

我的 POST 查询:

POST syslog-*/_search
{
  "size": 5, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  }
}

当更改为时,"size": 50它们开始时相同,但大约 1/3 的输出开始漂移;最终到达在 PUT 中存在的时间戳在 GET 结果中无处可寻的地步。当我去类似的东西"size": 5000时,结果变得如此不同,以至于我开始怀疑从这些查询构建的任何报告数据的准确性。

我才刚刚开始使用 ELK 和 Sense,所以这可能是正常行为。高级开发人员向我保证,在使用 Sense 从 Elasticsearch 数据库中获取信息时,GET 与 PUT 在功能上没有区别,但我可能误解了他。无论如何,我想发布这个问题,看看我是否正确理解了这一点。

发现了另一个似乎可以解决此问题的问题(此处)。但是在阅读详细信息时,这让我更加困惑,因为根据该帖子上接受的答案,POST 实际上是引擎盖下的 GET。

解释与 GET 与 POST http 方法有关。在幕后Sense实际上将GET请求转换为HTTP POST....即使您编写GET,实际的http请求也是POST。

4

1 回答 1

0

在与其他开发人员进行了更多交谈并更深入地研究 Elasticsearch 文档后发现了答案。简而言之,问题是缺乏定义的排序方法。是文档中关于不排序时行为的关键部分:

...我们表示我们只想要匹配的文档...而不尝试确定相关性。文档将以有效的随机顺序返回...

所以整个 GET 与 POST 的事情是无关紧要的。我得到越来越大尺寸的不一致结果的原因是随着查询变大,结果“随机”的机会增加。所以这两个查询(现在按日期排序)......

GET syslog-*/_search
{
  "size": 1000, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  },
   "sort":{"@timestamp":{"order":"desc"}}
}
"hits":{"total":7554334,....

...返回完全相同的结果。请注意,即使将大小设置为 1000,命中计数也是相同的。

POST syslog-*/_search
{
  "size": 1000, 
  "query" : {
    "bool": {
      "must":
      {
        "term":{"@hostname":"MyServer"}
      }
    }
  },
   "sort":{"@timestamp":{"order":"desc"}}
}
"hits":{"total":7554334,....

理智恢复了。:D

于 2016-09-06T20:55:45.387 回答