Elasticsearch查询之request body search

一、查询基本语法

查询举例

GET /users/_search?q=21&from=0&size=2&sort=age:desc&search_type=dfs_query_then_fetch&request_cache=true&terminate_after=1&timeout=10s
字段 含义
timeout 搜索超时,将搜索请求限制为在指定的时间值内执行,并且在到期之前累积到该点的命中项进行保释。默认为无超时。
from 从某个偏移量获取匹配。默认为0。
size 返回的点击数。默认为10。如果您不希望获得一些匹配,而仅关注匹配和/或聚合的数量,则将该值设置为0将会有助于提高性能。
search_type 要执行的搜索操作的类型。可以是 dfs_query_then_fetch或query_then_fetch。默认为query_then_fetch。
request_cache 设置为true或false启用或禁用对size值为0的请求的搜索结果进行缓存,即汇总和建议(不返回最高匹配)。
terminate_after 为每个分片收集的最大文档数,达到该数量时,查询执行将提前终止。如果设置,响应将具有一个布尔值字段,terminated_early以指示查询执行是否实际上已终止。默认为no terminate_after。

二、search_type分类

按照搜索类型可以分为以下四种:

  • QUERY_THEN_FETCH
  • QUERY_AND_FEATCH
  • DFS_QUERY_THEN_FEATCH
  • DFS_QUERY_AND_FEATCH

2.1 query and fetch(新版本不支持)

  向索引的所有分片发出查询请求, 各分片返回的时候把文档和计算后的排名信息一起返回。

  • 优点:这种搜索方式是最快的。因为相比其他几种搜索方式,这种查询方法只需要去分片查询一次。
  • 缺点:返回的数据量不准确, 可能返回(N*分片数量)的数据并且数据排名也不准确,同时各个shard返回的结果的数量之和可能是用户要求的size的n倍。

2.2 query then fetch(es 默认搜索方式)

  第一步,先向所有的分片发出请求,各分片只返回文档 id(不包括文档)和排名相关的信息(文档对应的分值), 然后按照各分片返回的文档的分数进行重新排序和排名, 取前 size个文档。
  第二步, 根据文档 id 去相关的 shard 取 document。 这种方式返回的 document 数量与用户要求的大小是相等的。

  • 优点:返回的数据量是准确的。
  • 缺点:性能一般,并且数据排名不准确。

2.3 DFS query and fetch(新版本不支持)

  这种方式比第一种方式多了一个 DFS 步骤,有这一步,可以更精确控制搜索打分和排名。也就是在进行查询之前, 先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作。

  • 优点:数据排名准确
  • 缺点:性能一般。返回的数据量不准确, 可能返回(N*分片数量)的数据

2.4 DFS query then fetch(es支持)

  在进行查询之前, 先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作、

  • 优点:返回的数据量是准确的,数据排名准确
  • 缺点:性能最差

DFS就是在进行真正的查询之前,先把各个分片的词频率和文档频率收集,然后进行词搜索的时候,各分片依据全局的词频率和文档频率进行搜索和排名。 如果使用 DFS_QUERY_THEN_FETCH 这种查询方式, 效率是最低的,因为一个搜索, 可能要请求 3 次分片。 但使用 DFS 方法, 搜索精度是最高的。

2.5 总结

  • 性能方面:QUERY_AND_FETCH最好,DFS_QUERY_THEN_FETCH最差。
  • 搜索准确度:DFS 要比非DFS的准确度更高。

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/108089403