Understanding "Query Then Fetch"显示,Elasticsearch查询是查询(从所有服务器中查找/评分/排序匹配文档)和获取(返回到服务器并收集匹配文档内容)的两步过程。
有没有一种方法可以只检索排序后的doc_id和得分的列表,但可以避免获取?我知道可以通过将size设置为0来避免获取数据...但是我仍然需要匹配的文档及其得分,并且不会返回任何内容。
我认为我可能可以关闭_source,但是我不确定,例如,如果搜索的查询部分仅知道内部doc_id并且需要执行此操作,并检索公共doc_id。
答案 0 :(得分:0)
GET / _search { “ _source”:否, “查询”:{ “ term”:{“ user”:“ kimchy”} } }
当然,您必须使用自己的ID,而不是自动生成的ID
答案 1 :(得分:0)
这些分数与文档的来源分开了,所以我不明白为什么要进行检索才能获取它们。
您当然可以关闭_source
,然后按_id
进行排序,如下所示:
GET your_index/_search
{
"_source": false,
"size": 200,
"sort": [
{
"_id": {
"order": "asc"
}
},
{
"_score": {
"order": "desc"
}
}
]
}
足够有趣的是,按文档的_source
字段排序响应似乎比按内部_id
排序的响应快约3倍(与我的预期相反)。我已经用一个很小的索引对它进行了测试-约150万个文档。我不知道跑步时会得到什么
GET your_index/_search?request_cache=false
{
"_source": false,
"size": 200,
"sort": [
{
"_id": {
"order": "asc"
}
}
]
}
,然后将_id
替换为另一个文档的_source
可排序字段。
答案 2 :(得分:0)
实际上,通过将大小设置为0
,我们将跳过获取阶段。在所有其他情况下,如果仅命中一次,则将执行提取阶段,并且无法跳过它。
正如您正确指出的那样,查询阶段不知道匹配文档的实际_id,而仅是有关分片的内部doc id。作为获取阶段的一部分,我们将检索那些_id,这些_id作为存储字段存储在Lucene中。 _source是与_id分开存储的字段,该字段也在获取阶段加载。但是要加快获取阶段的速度,可以在不需要时禁用_source的加载。作为与_id分开的字段,禁用_source不会影响_id的正确加载。