【ES系列】ES的搜索请求体

本篇内容将介绍一些涉及搜索功能的其他参数信息。

请求体格式

一般一条搜索请求,包含请求体信息,offset信息,显示窗口大小信息等。例如:

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "target_col": "target_file"
                    }
                }
            ]
        }
    },
    "size": 10000
}

body体部分之前的篇幅中有提到,就不过多叙述。

allow_partial_search_results 结果部分返回

如果只有部分结果可用,则设置为false使请求失败。默认为true,在超时或部分失败时返回部分结果,可以通过在集群设置中 设置search.default_allow_partial_results为 来覆盖所有请求的默认行为。

但需要注意的是,ES有些功能的超时甚至超过120s(比如写入),所以如果是跟前端交互超时不一致时,需要在es配置中修改。

batched_reduce_size 批量计算大小

这是一个用于聚合任务的参数,意在控制每次聚合计算的批量数据大小,默认值为512。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。

比如数据量很大,并且每个分片能匹配到的数据也非常多时,需要考虑OOM的问题,这时可以控制批量计算的大小,以控制内存。
具体使用:

{
    "size": 0,
    "aggs":{
        "test_aggs":{
            "terms":{
                "target_col": "target_file"
            },
            "meta":{
                "batched_reduce_size": 10
            }
        }
        
    }
    
}

search_type 搜索类型

es中有两种搜索类型: query_then_fetch(默认),以及 dfs_query_then_fetch。

query_then_fetch是Elasticsearch的默认查询类型,也是最常用的查询类型。在这种查询类型下,Elasticsearch先执行查询操作,然后返回匹配的文档ID列表。接着,Elasticsearch根据这个文档ID列表去获取每个文档的详细内容,并进行排序和分页等操作。这种查询类型的优点是效率高,缺点是可能存在精度问题,在某些情况下可能会导致结果不准确。

dfs_query_then_fetch是一种深度优先查询类型,它在执行查询操作时先进行分布式查询(DFS,Distributed File System),然后再进行文档获取和排序等操作。这种查询类型通常用于在使用分片时,需要确保查询的准确性和精度。它会遍历所有的分片来获取所有的相关文档,然后再对文档进行排序和分页等操作。由于需要遍历所有的分片,所以这种查询类型的效率通常比较低。但在某些情况下,它可以提高查询的准确性和精度。

需要注意的是,dfs_query_then_fetch查询类型可能会对Elasticsearch集群产生较大的负载,并且可能会导致查询速度变慢。因此,只有在确实需要精确的查询结果时才应该使用该查询类型。

关于这两种搜索方式,在大数据体量下,其实也不会追求非常精准的数据;再者,对于小数据量,query_then_fetch也并未出现过精度不足的情况。所以很难说dfs_query_then_fetch能用得上。

terminate_after 分片级匹配数

为每个分片收集的最大文档数,达到该数量后查询执行将提前终止。

这是一个非常好用的功能,对于搜索场景而言,窗口大小默认只有1万,所以也可以根据这个参数,只搜1万条就结束搜索任务。
但是也会有缺陷,比如每个分片符合不同搜索结果的数量都不同,就会造成总数统计是可能小于等于真实结果的。这一缺陷可以通过,将数据分布在更多的分片上,以及稍微扩大每个分片的目标数值就可以解决。

{
    "query": {
        "bool": {
            "must": [
                {
                    "term":{
                        "target_key": "target_val"
                    }
                }
            ]
        }
    },
    "terminate_after": 5  //这里表示,每个分片只返回5个符合搜索条件的结果
}

retrieve selected fields from a search 剔除字段

搜索结果的每个hit默认是返回整个json结构体,也就是每一条数据中所有的字段信息。但大多数时候,我们并不需要那么多的结果,可以选择剔除一些字段。需要将_source字段设置为false,并在filed字段中选择想要的结果。

但在搜索的过程中,直到返回给协调节点之前,每条数据还是整个json结构体的过程。这是因为,一个doc的结构在lucene中是一个完整的field,所以在搜的过程中,没法直接剔除,而是在搜索结果返回给shard后做了一个过滤动作,最后返回给协调节点。

{
  "query": {
    "match": {
      "target_key": "target_vol"
    }
  },
  "fields": ["target_key"],
  "_source": false
}

track_total_hits 返回全部搜索结果

ES根据搜索请求体默认的窗口大小就是1w,所以搜索结果值也最大只显示1w。如果想要直到某条搜索语句,在整个数据集中具体的匹配数量,可以添加track_total_hits的

{
    "query":{
        "term":{
            "target_key": "target_val"
        }
    },
    "track_total_hits": true
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值