2017-06-05 476 views
0

查询elasticsearch时,只返回命中文件。我怎样才能得到命中的上下文,比如命中之前和之后的10个文档?Elasticsearch返回结果的上下文(命中前后10行)

举例来说,我已经插入5个登录到elasticsearch:

{"log": "a"} 
{"log": "b"} 
{"log": "c"} 
{"log": "d"} 
{"log": "e"} 

我已搜查"query": { "match": { "log": "e" } },和ES将返回5号文件。但是,我可能想要以前的4个日志进行调试,是否可以返回上下文?

+0

你能举出更多的例子吗? – hkulekci

+0

@hkulekci已更新 – Pao

+0

您在每个文档中是否有任何时间戳? – BlackPOP

回答

2

也许我的回答可能不是一个完整的答案,但我想分享我的意见来解决这个问题。

首先,您想获得像grep应用程序afterbefore功能的结果。据我所知,Elasticsearch可以根据与文档匹配的条件找到文档,并且不会根据文档的顺序来考虑最近的文档。在我看来,你可以用两种方法解决这个问题。第一个是在摄取时向文档填充相关数据,第二个是执行第二个查询以查找相关数据。

对于第一种方法,您将有不必要的重复数据,这将导致性能问题或需要更多存储,cpu或ram等,但您可以使用一个查询获取数据和相关数据。要处理这个问题,可以在将日志摄入Elasticsearch时使用logstash的https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html过滤器。

对于第二种方法,你会很酷:)。你的摄取部分没有任何变化,但你应该改变你的应用程序的表示部分。另一方面,在Kibana上使用ElasticStack 5.4的时候,有一个新功能,这个功能是Document Context。您可以轻松访问特定文档周围的文档。我还没有尝试,但我想,它可能与第二种方法相同。

更新:

我已经检查了Kibana 周边文档功能,它采用search_after API。