9.1 搜索类型(Search Type)
ES执行分布式搜索时可以执行不同的执行路径,分布式搜索需要将搜分散到所有相关的碎片shards
,然后收集所有结果。在执行分散/聚集类型操作时,有几种方法可以执行此操作,特别是使用搜索引擎。当执行分布式搜索时,有一个问题是从每个分片上搜索多少结果,例如,如果我们有10个分片,则第一个分片可能保持从0到10的最相关结果,其他分片结果排在其下方,因此,当执行搜索时,我们需要从所有碎片上获取0到10的结果,然后进行排序,如果想确保正确的结果,则返回结果。另一个与搜索引擎相关的问题是,每个碎片都独立存在。当具体的碎片执行搜索时,它不会考虑来自其他碎片的术语频率和其他搜索引擎信息。如果想要准确的排序,就需要首先从所有碎片上搜集术语term
的频率并计算全局术语频率,然后使用这些全局频率在每个碎片上执行查询。由于需要对结果进行排序、获取大型文档集、甚至滚动它,同时保持正确的排序行为,这样的可能会耗费资源。对于大型结果集的滚动,如果返回文档的顺序不重要,最好按_doc
排序。ES是非常灵活的并控制基于每个搜索请求执行的搜索类型,在查询参数中可以通过search_type
参数配置搜索的类型。搜索类型主要有:
- Query Then Fetch(查询再拉取):参数为
query_then_fetch
。这个类型是分为两步完成请求的:第一步,查询将转发到所有涉及的碎片,每个碎片执行搜索、生成本地排序后的结果列表,每个碎片都向协调节点返回足够的信息,以允许它合并并将碎片级别结果重新排序为具有最大长度大小的全局排序结果集;第二步,协调节点仅从相关碎片上请求文档内容(以及突出显示的片段,如果有的话)。如果不特别指定search_type
,那默认就是query_then_fetch
; - DFS query then fetch:参数为
dfs_query_then_fetch
,与“查询然后拉取”相同,但是比它多了初始分散阶段,其进行并计算分布式术语频率以获得更准确的评分;
9.2 滚动(Scroll)
当search
请求返回结果的单个页面结果,scroll
接口可以用来从一个搜索请求中取回大量(设置是所有)的结果,与在传统数据库中使用游标的方式大致相同。滚动不适用于用户的实时请求,而是用于处理大量数据,比如为了将一个索引的内容重新索引到具有不同配置的新索引中。从滚动请求返回的结果反映了初始搜索请求生成时的索引状态,如时间快照。对文档的后续更改(索引,更新或删除)只会影响以后的搜索请求。如果想要使用滚动,初始搜索请求应该在查询参数中指定scroll
参数,这个参数告诉ES它应该保持“搜索上下文”存活多久,比如?scroll=1m
:
curl -X POST "localhost:9200/twitter/_search?q=*&scroll=1m" -H 'Content-Type: application/json' -d'
{
"size": 100,
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
'
size
参数用于控制每个批次返回命中结果的最大数量结果,返回的结果为:
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAABCFmJLZUd