是否可以在不执行搜索的获取阶段的情况下仅从Elasticsearch中检索文档ID和得分?

时间:2020-07-15 16:19:01

标签: elasticsearch

Understanding "Query Then Fetch"显示,Elasticsearch查询是查询(从所有服务器中查找/评分/排序匹配文档)和获取(返回到服务器并收集匹配文档内容)的两步过程。

有没有一种方法可以只检索排序后的doc_id和得分的列表,但可以避免获取?我知道可以通过将size设置为0来避免获取数据...但是我仍然需要匹配的文档及其得分,并且不会返回任何内容。

我认为我可能可以关闭_source,但是我不确定,例如,如果搜索的查询部分仅知道内部doc_id并且需要执行此操作,并检索公共doc_id。

3 个答案:

答案 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的正确加载。