问题:在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搜索查询的所有文档吗?
非常感谢你。
如果你想要检索大量的文档,那么滚动就是你要去的方法,因为它超过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
另一种选择是 GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}
标签。使用排序机制联合,您可以在第一个返回中保存最后一个元素,然后在最后一个元素之后询问结果。
elascticsearch
为我工作。但到目前为止,获得超过10,000个Dokuments并不容易。
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" }
}
}
看看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'])
}
我可以建议一个更好的方法来做到这一点。我想你想要获得超过10,000条记录。尝试以下方式,您将获得数百万条记录。
search = Search(using=client)
results = search.execute()
results.hits.total
s = Search(using=client)
s = s.query(..write your query here...)
results_df = pd.DataFrame((d.to_dict() for d in s.scan()))
results_df
from elasticsearch_dsl import Search
当结果超过10000时,获得其余结果的唯一方法是将查询拆分为具有更严格过滤器的多个更精确的查询,这样每个查询返回的结果少于10000。然后组合查询结果以获取完整的目标结果集。
对10000结果的此限制适用于由ElasticSearch索引支持的Web服务,并且没有办法绕过它,必须在不使用ElasticSearch的情况下重新实现Web服务。