ES学习记录9.2——请求体搜索(Search Type和Scroll)

本文介绍了ES的两种搜索类型:Query Then Fetch和DFS Query Then Fetch,以及滚动搜索的概念,滚动适用于处理大量数据,如数据迁移。滚动通过参数控制搜索上下文的存活时间,`scroll`用于初始化搜索,`_scroll_id`用于后续滚动请求。文章还讨论了滚动切片,用于并行处理大量文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值