es 在查询时, 可以指定搜索类型为下面四种:

  QUERY_THEN_FETCH

  QUERY_AND_FEATCH

  DFS_QUERY_THEN_FEATCH

  DFS_QUERY_AND_FEATCH


1、 query and fetch

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

  这种搜索方式是最快的。 因为相比下面的几种搜索方式, 这种查询方法只需要去 shard查询一次。 但是各个 shard 返回的结果的数量之和可能是用户要求的 size 的 n 倍。

  优点:这种搜索方式是最快的。因为相比后面的几种es的搜索方式,这种查询方法只需要去shard查询一次。

  缺点:返回的数据量不准确, 可能返回(N*分片数量)的数据并且数据排名也不准确,同时各个shard返回的结果的数量之和可能是用户要求的size的n倍。


2、 query then fetch( es 默认的搜索方式)

  如果你搜索时, 没有指定搜索方式, 就是使用的这种搜索方式。 这种搜索方式, 大概分两个步骤:

  第一步, 先向所有的 shard 发出请求, 各分片只返回文档 id(注意, 不包括文档 document)和排名相关的信息(也就是文档对应的分值), 然后按照各分片返回的文档的分数进行重新排序和排名, 取前 size 个文档。

  第二步, 根据文档 id 去相关的 shard 取 document。 这种方式返回的 document 数量与用户要求的大小是相等的。

  优点:

    返回的数据量是准确的。

  缺点:

    性能一般,并且数据排名不准确。


3、 DFS query and fetch

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

  优点:

    数据排名准确

  缺点:

    性能一般

    返回的数据量不准确, 可能返回(N*分片数量)的数据


4、 DFS query then fetch

  比第 2 种方式多了一个 DFS 步骤。

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

  优点:

    返回的数据量是准确的

    数据排名准确

  缺点:

    性能最差【 这个最差只是表示在这四种查询方式中性能最慢, 也不至于不能忍受,如果对查询性能要求不是非常高, 而对查询准确度要求比较高的时候可以考虑这个】

总结:每种方式的时间

QUERY_AND_FETCH

0-1534820294505

1-1534820294541


QUERY_THEN_FETCH

0-1534820356610

1-1534820356641



DFS_QUERY_THEN_FETCH

0-1534820407588

1-1534820407621


DEFAULT

0-1534820503041

1-1534820503071