我在 Elasticsearch 中存储了一个日志文件,其中文档是文件的一行。消息块以某些关键字开始和结束。我想获取包含这些关键字的文档之间的所有文档。有没有办法利用 Elasticsearch 中的范围查询/范围过滤器来查询文本字段?
示例日志文件:
...
...
xyz foo "keyword1" .....
..
....
...
xyz 栏 "keyword2" .....
..
..
我想查询“keyword1”和“keyword2”之间的所有文档,包括包含关键字本身的文档。假设有多个这样的块,带有“keyword1”和“keyword2”。
此外,我正在使用新字段 test_field 更新包含这些关键字的文档,该字段包含这些关键字作为值。可以在范围过滤器中使用这个新字段来实现上述任务吗?
Elasticsearch 字段:_source: { "log_line", "test_field" }
答案 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 以您喜欢的模式加载数据,这样您就有了一个包含整个块的文档?使查询和分析变得更加容易:)