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
}