经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Elasticsearch » 查看文章
ElasticSearch 实现分词全文检索 - Scroll 深分页
来源:cnblogs  作者:VipSoft  时间:2023/3/14 10:25:56  对本文有异议

目录

ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - delete-by-query --待发布
ElasticSearch 实现分词全文检索 - 复合查询 --待发布
ElasticSearch 实现分词全文检索 - filter查询 --待发布
ElasticSearch 实现分词全文检索 - 高亮查询 --待发布
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality --待发布
ElasticSearch 实现分词全文检索 - 经纬度查询 --待发布

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

深分页 Scroll

ES 对 from + size 有限制,两者之和不能超过1W

from + size 在 ES 查询数据的方式:

  • 第一步:将用户指定的关键词进行分词
  • 第二步:将词汇去词库中进行检索,得到多个文档id
  • 第三步:去各个分片中拉取指定的数据【耗时较长】
  • 第四步:根据score(匹配度)将数据进行排序,【耗时较长】
  • 第五步:根据 from 的值,将查询到的数据舍弃一部分
  • 第六步:返回结果

Scroll + size 在 ES 查询数据的方式:

  • 第一步:将用户指定的关键词进行分词
  • 第二步:将词汇去分词库中进行检索,得到多个文档的id
  • 第三步:将文档的id存放在一个ES的上下文中(设定保存时间,过期后移除)
  • 第四步:根据你指定的Size的个数去ES中检索指定个数的数据,拿到数据的文档id,会从上下文中移除
  • 第五步:如果需要下一页数据,直接去ES的上下文中找后续的内容
  • 第六步:循环第四步和第五步

Scroll查询方式,不适合做实时的查询,每次都是从数据文档中的ID去获取,效果高了,但文档中的ID(第二步)不是实时更新的,一般后台管理的方式用 Scroll 比较方便

  1. # scroll 查询,返回第一页数据,并且将文档id信息存放在ES上下文中,指定生存时间 1m
  2. POST /sms-logs-index/_search?scroll=1m
  3. {
  4. "query": {
  5. "match_all": {}
  6. },
  7. "size": 2,
  8. "sort": [
  9. {
  10. "fee": { # 指定排序
  11. "order": "desc"
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. # 根据scroll查询下一页数据,【第一步设置了1分钟,所以1分钟以后再执行就没有数据了】
  18. POST /_search/scroll
  19. {
  20. "scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEQ1VkNuSVlCR2xMYVQ1OExzNU1tAAAAAAADNlcWMEt3d2xrY3hRWGFoZFlwM01ZdnlCdw==", #根据上一步查的结果提到scroll_id
  21. "scroll":"1m" #生存时间
  22. }
  23. # 删除scroll在ES上下文中的数据
  24. DELETE /_search/scroll/FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEQ1VkNuSVlCR2xMYVQ1OExzNU1tAAAAAAADNlcWMEt3d2xrY3hRWGFoZFlwM01ZdnlCdw==

Java

  1. @Test
  2. void scrollQuery() throws Exception {
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建SearchRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定scroll信息
  8. request.scroll(TimeValue.timeValueMinutes(2L)); //1分钟过期
  9. //2. 指定查询条件
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. builder.size(4);
  12. builder.sort("fee", SortOrder.DESC);
  13. builder.query(QueryBuilders.matchAllQuery());
  14. request.source(builder);
  15. //4. 获取返回结果 scrollid,source
  16. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  17. String scrollId = resp.getScrollId();
  18. System.out.println("-------首页----------");
  19. for (SearchHit hit : resp.getHits().getHits()) {
  20. System.out.println(hit.getSourceAsMap());
  21. }
  22. while (true) {
  23. System.out.println("ScrollId =>" + scrollId);
  24. //5. 循环 - 创建SearchScrollRequest
  25. SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
  26. //6. 指定 ScrollId
  27. scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
  28. //7. 执行查询获取返回结果
  29. SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
  30. //8. 判断是否查询到了数据,输出
  31. SearchHit[] hits = scrollResp.getHits().getHits();
  32. if (hits != null && hits.length > 0) {
  33. System.out.println("----------下一页---------");
  34. for (SearchHit hit : hits) {
  35. System.out.println(hit.getSourceAsMap());
  36. }
  37. } else {
  38. //9. 判断没有查询到数据 - 退出循环
  39. System.out.println("----------下一页---------");
  40. break;
  41. }
  42. }
  43. //10. 创建 ClearScrollRequest
  44. ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
  45. //11. 指定 ScrollId
  46. clearScrollRequest.addScrollId(scrollId);
  47. //12. 删除 ScrollId
  48. ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
  49. //13. 输出结果
  50. System.out.println("删除scroll: " + clearScrollResponse.isSucceeded());
  51. }

原文链接:https://www.cnblogs.com/vipsoft/p/17168910.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号