【问题标题】:Elasticsearch querying documents between two range fields of stringsElasticsearch 在两个字符串范围字段之间查询文档
【发布时间】:2021-05-12 09:14:55
【问题描述】:

我有一个存储在 Elasticsearch 中的日志文件,其中一个文档是文件的单行。消息块以某些关键字开始和结束。我想获取包含这些关键字的文档之间的所有文档。有没有办法利用 Elasticsearch 中的范围查询/范围过滤器来查询文本字段?

示例日志文件:
...
...
xyz foo "keyword1" .....
..
....
...
xyz 栏“keyword2”.....
..
..

我想查询“keyword1”和“keyword2”之间的所有文档,包括包含关键字本身的文档。假设有多个带有“keyword1”和“keyword2”的块。

此外,我正在使用新字段 test_field 更新包含这些关键字的文档,该字段包含这些关键字作为值。可以在范围过滤器中使用这个新字段来完成上述任务吗?

Elasticsearch 字段:_source: { "log_line", "test_field" }

【问题讨论】:

    标签: python elasticsearch elasticsearch-painless


    【解决方案1】:

    我假设您还有一些标识符来定义这些文档的顺序。假设您有一个字段line_number

    您可以进行前两次搜索,匹配包含关键字的所有文档。然后对于每对这些关键字,您都有开始和结束行号。对于每一对,您可以搜索两个行号之间的所有文档(使用range query)。 这不是一个纯粹的 ES 解决方案,并且需要一些脚本,例如python或任何其他语言。如果您在查询方面需要帮助,请告诉我。

    但是在做这样的事情之前,如果我是你,我会批判性地质疑这个要求。为什么要将日志文件的每一行读入 ES?为什么不使用 Logstash/Filebeat 以您喜欢的模式加载数据,这样您就拥有一个包含整个块的文档?使查询和分析变得更加容易:)

    【讨论】:

    • 是的,我已经尝试了 line_number 方法,方法是使用范围查询并在 python 中提取它们,但我希望有一些方法可以在纯 ES 中完成,因为我将使用实时将不断更新新行的日志文件。目前我的应用程序将所有日志文件数据存储为主题中的 Kafka 消息(Kafka 也被用于其他一些东西),所以我希望直接在 ES 中执行此操作,而无需在混合中添加另一个组件(Logstash)。跨度>
    • 如何将多行作为单个文档读取有助于 ES 查询顺便说一句?
    • 好吧,我可能有点误解了这个问题。我认为这两个关键字之间的所有行都属于单个日志消息。在这种情况下,将这些多行(因为它们属于一起)放在一个文档中是有意义的。但我想事实并非如此。
    • 啊,好吧,所以我这里没有可以实现的纯 ES 解决方案吗?
    • 至少没有我能想到的。听起来像是 SQL 中的“子选择”,据我所知,这在 ES 中是不可能的。但也许有一些花哨的脚本解决方案。只有我想到的解决方案在加载到索引时需要更多的数据准备或转换。
    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多