ES中4种搜索类型(SearchType值)

 转载自:https://www.cnblogs.com/zlslch/p/6438352.html?utm_source=itdadao&utm_medium=referral

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

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

DFS 是一个什么样的过程?

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

  总结一下, 从性能考虑 QUERY_AND_FETCH 是最快的, DFS_QUERY_THEN_FETCH 是最慢的。从搜索的准确度来说, DFS 要比非 DFS 的准确度更高。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 使用 Elasticsearch 查询多个,可以使用 `TermsQueryBuilder` 类。以下是一个示例,展示如何使用 `TermsQueryBuilder` 查询同时匹配多个的文档: ```java import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermsQueryBuilder; TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("field", "value1", "value2"); ``` 在这个示例,`field` 是你想要匹配的字段,`value1` 和 `value2` 是你想要匹配的两个。如果你想要匹配更多的,可以在 `termsQuery` 方法添加更多的参数。然后,你可以将 `termsQueryBuilder` 对象添加到你的查询,例如: ```java import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermsQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("field", "value1", "value2"); SearchResponse searchResponse = client.prepareSearch("index") .setTypes("type") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(termsQueryBuilder) .execute() .actionGet(); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } client.close(); ``` 在这个示例,我们使用 `TransportClient` 连接到 Elasticsearch,然后使用 `termsQueryBuilder` 对象设置查询条件,最后执行查询并打印匹配的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值