【问题标题】:Elasticsearch DSL query - Get all matching resultsElasticsearch DSL 查询 - 获取所有匹配结果
【发布时间】:2018-03-09 19:11:02
【问题描述】:

我正在尝试使用 DSL 查询来搜索索引。我有许多符合日志标准和时间戳范围的文档。
我正在传递日期并将其转换为纪元毫秒。
但是我在 DSL 查询中指定了 size 参数。
我看到的是,如果我指定 5000,它会在时间范围内提取 5000 条记录。但指定时间范围内的记录数较多。
如何检索与时间范围匹配的所有数据,以便我不需要指定大小?

我的 DSL 查询如下。

GET localhost:9200/_search    
{
    "query": {
      "bool": {
        "must": [
          {"match_phrase": {
              "log":  "SOME_VALUE"
              }
            },
             {"range": {
                "@timestamp": {
                  "gte": "'"${fromDate}"'", 
                  "lte": "'"${toDate}"'", 
                  "format": "epoch_millis"
                }
              }
            }
                ]
              }
            },    
        "size":5000
}

从日期 = 1519842600000
toDate = 1520533800000

【问题讨论】:

  • 不,这不是重复的……我已经看到了。它提到了如何检索所有数据,它没有条件或附加参数,甚至没有大小参数。
  • 您应该查看扫描和滚动 API 以实现您想要的,如上述问题中的答案所示。
  • Scroll 将查看我们指定的时间以使内容处于活动状态。我试过了,但如果没有指定大小,它会命中 5 次。那也解决不了问题..

标签: elasticsearch elasticsearch-dsl


【解决方案1】:

我无法让扫描 API 或滚动模式正常工作,因为它也没有显示预期的结果。

我终于想出了一种方法来捕获点击次数,然后将其作为参数传递以提取数据。

GET localhost:9200/_count    
{
"query": {
  "bool": {
    "must": [
      {"match_phrase": {
          "log":  "SOME_VALUE"
          }
        },
         {"range": {
            "@timestamp": {
              "gte": "'"${fromDate}"'", 
              "lte": "'"${toDate}"'", 
              "format": "epoch_millis"
            }
          }
        }
            ]
          }
        }
}' > count_size.txt
size_count=`cat count_size.txt  | cut -d "," -f1 | cut -d ":" -f2`
echo "Total hits matching this criteria is ${size_count}"

由此我得到 size_count 值。 如果该值小于10000,则提取该值,否则缩小提取时间范围。

GET localhost:9200/_search    
{
"query": {
  "bool": {
    "must": [
      {"match_phrase": {
          "log":  "SOME_VALUE"
          }
        },
         {"range": {
            "@timestamp": {
              "gte": "'"${fromDate}"'", 
              "lte": "'"${toDate}"'", 
              "format": "epoch_millis"
            }
          }
        }
            ]
          }
        },    
    "size":'"${size_count}"'
}

如果在很长一段时间内需要大量数据,我需要使用一组不同的日期来运行它,并将它们组合在一起以获得所需的整体报告。

这段完整的代码是用shell脚本编写的,所以我可以更简单地使用它。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2015-10-03
    • 2015-03-09
    • 2021-08-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多