ELK:如何在Elastic-search中检索超过10000个结果/事件

问题描述 投票:19回答:6

问题:在GET /搜索查询中通过搜索检索弹性搜索超过10,000个结果。

GET hostname:port /myIndex/_search { 
    "size": 10000,
    "query": {
        "term": { "field": "myField" }
    }
}

我一直在使用size选项知道:

index.max_result_window = 100000

但是,如果我的查询大小为650,000个文档或更多,我如何在一个GET中检索所有结果?

我一直在阅读有关SCROLL,FROM-TO和PAGINATION API的信息,但它们都不会超过10K。

这是Elasticsearch论坛的例子,我一直在使用:

GET /_search?scroll=1m

任何人都可以提供一个示例,您可以在其中检索GET搜索查​​询的所有文档吗?

非常感谢你。

elasticsearch scroll pagination get resultset
6个回答
21
投票

如果你想要检索大量的文档,那么滚动就是你要去的方法,因为它超过10000默认限制,可以提高。

第一个请求需要指定要进行的查询,scroll参数的持续时间为before the search context times out(下例中为1分钟)

POST /index/type/_search?scroll=1m
{
    "size": 1000,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

在第一次调用的响应中,您将获得需要用于进行第二次调用的_scroll_id

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
}

在每个后续响应中,您将获得一个新的_scroll_id,您需要在下次调用时使用该# first request response = request('POST /index/type/_search?scroll=1m') docs = [ response.hits ] scroll_id = response._scroll_id # subsequent requests while (true) { response = request('POST /_search/scroll', scroll_id) docs.push(response.hits) scroll_id = response._scroll_id } ,直到您检索到所需的文档数量为止。

所以在伪代码中看起来有点像这样:

search_after

1
投票

另一种选择是 GET twitter/_search { "size": 10, "query": { "match" : { "title" : "elasticsearch" } }, "search_after": [1463538857, "654323"], "sort": [ {"date": "asc"}, {"_id": "desc"} ] } 标签。使用排序机制联合,您可以在第一个返回中保存最后一个元素,然后在最后一个元素之后询问结果。

elascticsearch

为我工作。但到目前为止,获得超过10,000个Dokuments并不容易。


1
投票

nodeJS使用const elasticsearch = require('elasticsearch'); const elasticSearchClient = new elasticsearch.Client({ host: 'esURL' }); async function getAllData(query) { const result = await elasticSearchClient.search({ index: '*', scroll: '10m', size: 10000, body: query, }); const retriever = async ({ data, total, scrollId, }) => { if (data.length >= total) { return data; } const result = await elasticSearchClient.scroll({ scroll: '10m', scroll_id: scrollId, }); data = [...data, ...result.hits.hits]; return retriever({ total, scrollId: result._scroll_id, data, }); }; return retriever({ total: result.hits.total, scrollId: result._scroll_id, data: result.hits.hits, }); } 滚动示例:

GET /_search
{
  "size": "10000",
    "query": {
        "match_all": {"boost" : "1.0" }
    }
}

1
投票

干得好:

search_after documentation

但我们应该主要避免这种方法一次检索大量的文档,因为它可以增加数据使用和开销。


0
投票

看看query = { size: query_size, query: { multi_match: { query: "black", fields: [ "description", "title", "information", "params" ] } }, search_after: [after], sort: [ {id: "asc"} ]

在Ruby中作为哈希的示例查询:

client = Elasticsearch(['http://localhost:9200'])

}


0
投票

我可以建议一个更好的方法来做到这一点。我想你想要获得超过10,000条记录。尝试以下方式,您将获得数百万条记录。

  1. 定义您的客户。 search = Search(using=client)
  2. results = search.execute() results.hits.total
  3. 检查总命中数。 s = Search(using=client)
  4. s = s.query(..write your query here...)
  5. 写下你的查询。 results_df = pd.DataFrame((d.to_dict() for d in s.scan()))
  6. 使用扫描将数据转储到数据框中。扫描会将所有数据转储到您的数据框中,即使它是数十亿,所以要小心。 results_df
  7. 看看你的数据框架。 from elasticsearch_dsl import Search
  8. 如果您的搜索功能出现错误,请执行以下操作: qazxswpoi

0
投票

当结果超过10000时,获得其余结果的唯一方法是将查询拆分为具有更严格过滤器的多个更精确的查询,这样每个查询返回的结果少于10000。然后组合查询结果以获取完整的目标结果集。

对10000结果的此限制适用于由ElasticSearch索引支持的Web服务,并且没有办法绕过它,必须在不使用ElasticSearch的情况下重新实现Web服务。

© www.soinside.com 2019 - 2024. All rights reserved.