使用POST与GET时,ELK查询在Sense中给出不同的结果

时间:2016-09-02 21:27:36

标签: elasticsearch elastic-stack sense

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

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

我的GET查询:

from tkinter import *
import time
import threading

class Threader(threading.Thread):

    def __init__(self, tbox, *args, **kwargs):

        threading.Thread.__init__(self, *args, **kwargs)
        self.tbox = tbox
        self.daemon = True # Stop threads when your program exits.
        self.start()

    def run(self):
        time.sleep(2)
        self.tbox.insert(END, "Some text1\n")

        time.sleep(2)
        self.tbox.insert(END, "Some text2\n")

        time.sleep(2)
        self.tbox.insert(END, "Some text3")

            break

class MyClass(object):
        def __init__(self):
            self.root = Tk()

            button = Button(self.root, text="Button", command= lambda: Threader(tbox=self.tbox)).pack()

            #scrollbar and textbox
            scrollbar = Scrollbar(self.root)
            scrollbar.pack(side=RIGHT, fill=Y)

            self.tbox = Text(self.root, wrap=WORD, yscrollcommand=scrollbar.set)
            self.tbox.pack(fill=X)
            scrollbar.configure(command=self.tbox.yview)

            self.root.mainloop()
MyClass()

我的POST查询:

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

当改为POST syslog-*/_search { "size": 5, "query" : { "bool": { "must": { "term":{"@hostname":"MyServer"} } } } } 时,它们开始相同,但输出的大约1/3开始漂移;最终达到了PET中存在的时间戳无法在GET结果中找到的程度。当我去"size": 50之类的时候,结果变得非常不同,我开始怀疑从这些查询构建的任何报告数据的准确性。

我只是开始使用带有Sense的ELK,所以这可能是正常行为。高级开发人员向我保证,当使用Sense从Elasticsearch数据库中获取信息时,GET与PUT没有任何功能差异,但我可能会误解他。无论如何,我想发布这个问题,看看我是否正确理解这一点。

发现了另一个似乎解决这个问题的问题(here)。但在阅读细节时,这让我更加困惑,因为根据该帖子上接受的答案,POST实际上是一个GET。

  

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

1 个答案:

答案 0 :(得分:0)

在与其他开发者讨论更多内容并更加热情地深入研究Elasticsearch文档之后发现了答案。简而言之,问题是缺乏定义的排序方法。 This是关于未排序时行为的文档中的关键部分:

  

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

所以整个GET vs 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