Elasticsearch 在字符串的两个范围字段之间查询文档

时间:2021-05-12 09:14:55

标签: python elasticsearch elasticsearch-painless

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我假设您还有一些标识符来定义这些文档的顺序。假设您有一个字段 library(shiny) ui <- fluidPage( fileInput(inputId = "upload_file", "", accept = '.csv'), uiOutput("num_inputs"), actionButton("calc", "Calculate"), tableOutput("table") ) server <- function(input, output, session) { data <- reactive({ infile <- input$upload_file if (is.null(infile)) return(NULL) read.csv(infile$datapath, header = TRUE, sep = ",") }) header_vars <- reactive({ names(data()[-1]) }) output$num_inputs <- renderUI({ vars <- length(header_vars()) if (vars > 0) { div( lapply(seq(vars), function(x) { numericInput(inputId = paste0("var_", x), label = header_vars()[x], value = 0, min = 0, max = 100) }) ) } }) input_vals <- eventReactive(input$calc, { n_vars <- length(header_vars()) vals <- c() if (n_vars > 0) { vals <- sapply(seq(n_vars), function(i) { input[[paste0("var_", i)]] }) } calc_sum(vals) return(vals) }) calc_sum <- function(vals) { print(sum(vals)) } output$table <- renderTable({ data.frame( vars = header_vars(), vals = input_vals() ) }) } shinyApp(ui = ui, server = server)

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

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

相关问题