ElasticSearch 实现分词全文检索 - Scroll 深分页

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch 实现分词全文检索 - Scroll 深分页

数据准备

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 比较方便

Scroll不适合支持那种实时的和用户交互的前端分页工作,其主要用途用于从ES集群分批拉取大量结果集的情况,一般都是offline的应用场景。 比如需要将非常大的结果集拉取出来,存放到其他系统处理,或者需要做大索引的reindex等等。

# scroll 查询,返回第一页数据,并且将文档id信息存放在ES上下文中,指定生存时间 1m
POST /sms-logs-index/_search?scroll=1m
{
  "query": {
    "match_all": {}
    },
    "size": 2,
    "sort": [
      {
        "fee": {  # 指定排序
          "order": "desc"
        }
      }
    ]
  }
}
# 根据scroll查询下一页数据,【第一步设置了1分钟,所以1分钟以后再执行就没有数据了】
POST /_search/scroll
{
  "scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEQ1VkNuSVlCR2xMYVQ1OExzNU1tAAAAAAADNlcWMEt3d2xrY3hRWGFoZFlwM01ZdnlCdw==",  #根据上一步查的结果提到scroll_id
  "scroll":"1m" #生存时间
}
# 删除scroll在ES上下文中的数据
DELETE /_search/scroll/FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEQ1VkNuSVlCR2xMYVQ1OExzNU1tAAAAAAADNlcWMEt3d2xrY3hRWGFoZFlwM01ZdnlCdw==

Java

@Test
void scrollQuery() throws Exception {
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定scroll信息
    request.scroll(TimeValue.timeValueMinutes(2L)); //1分钟过期
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.size(4);
    builder.sort("fee", SortOrder.DESC);
    builder.query(QueryBuilders.matchAllQuery());
    request.source(builder);
    //4. 获取返回结果 scrollid,source
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    String scrollId = resp.getScrollId();
    System.out.println("-------首页----------");
    for (SearchHit hit : resp.getHits().getHits()) {
        System.out.println(hit.getSourceAsMap());
    }
    while (true) {
        System.out.println("ScrollId =>" + scrollId);
        //5. 循环 - 创建SearchScrollRequest
        SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
        //6. 指定 ScrollId
        scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
        //7. 执行查询获取返回结果
        SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
        //8. 判断是否查询到了数据,输出
        SearchHit[] hits = scrollResp.getHits().getHits();
        if (hits != null && hits.length > 0) {
            System.out.println("----------下一页---------");
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsMap());
            }
        } else {
            //9. 判断没有查询到数据 -  退出循环
            System.out.println("----------下一页---------");
            break;
        }
    }
    //10. 创建 ClearScrollRequest
    ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
    //11. 指定 ScrollId
    clearScrollRequest.addScrollId(scrollId);
    //12. 删除 ScrollId
    ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
    //13. 输出结果
    System.out.println("删除scroll: " + clearScrollResponse.isSucceeded());
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
30天前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
50 5
|
28天前
|
自然语言处理 Java 网络架构
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
这篇文章是关于如何自定义Elasticsearch的ik分词器配置以满足特定的中文分词需求。
109 0
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
|
11天前
|
测试技术 API 开发工具
ElasticSearch的IK分词器
ElasticSearch的IK分词器
35 7
|
28天前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
92 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
3月前
|
JSON 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
83 1
|
3月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
3月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
46 0
|
3月前
|
存储 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
25 0
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo