Elasticsearch 返回结果的上下文(命中前后各 10 行)

Hao*_* Ge 1 elasticsearch

查询elasticsearch时,只会返回命中的文档。如何获取点击的上下文,例如点击之前和之后的 10 个文档?

例如,我在elasticsearch中插入了5条日志:

{"log": "a"}
{"log": "b"}
{"log": "c"}
{"log": "d"}
{"log": "e"}
Run Code Online (Sandbox Code Playgroud)

我已经搜索过"query": { "match": { "log": "e" } },es将返回第5个文档。但是,我可能想要前面的4条日志进行调试,es可以返回上下文吗?

hku*_*kci 5

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

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

对于第一种方法,您将拥有不必要的重复数据,这将导致性能问题或需要更多存储、CPU 或 RAM 等。但是您可以通过一个查询来获取您的数据和相关数据。为了解决这个问题,您可以在将日志提取到 Elasticsearch 时使用https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html的 Logstash 过滤器。

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

更新:

我检查了 Kibana Surrounding Documents功能,它使用 search_after api。