使用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。
答案 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