目录

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

# 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());
}

最新文章

  1. php json_encode中文unicode问题
  2. SQL 代码创建表格以及CRUD
  3. FRM-92101解决办法
  4. java服务器
  5. maven系列(3)-maven生命周期的介绍
  6. winform窗体跟随窗体
  7. This configuration file was broken by system-config-keyboard
  8. Canvas标签初探
  9. tomcat dbcp 基于jndi当配置java.sql.SQLException: Already closed
  10. javascript 三种弹出对话框
  11. bzoj1688
  12. 数据库分库分表(sharding)系列
  13. 产品大神1--工具axure
  14. 46.Scrapy框架结构
  15. LVM逻辑卷疑问?
  16. SSM-动态SQL
  17. 基于Zookeeper的分布式锁
  18. Hadoop记录-Hadoop shell常用命令
  19. PHP-引入文件(include)后,页面错位,不居中解决办法
  20. weblogic11G 修改密码

热门文章

  1. 鼠标JS
  2. centos7编译安装LNMP服务架构
  3. Pytest Fixture(三)
  4. liveview能设定开机最小化到托盘吗 对liveview 3.5.2的建议
  5. <<Python编程:从入门到实践>>踩坑记 Django
  6. 复杂的光照与更复杂的阴影实现过程——ShaderCP9
  7. CPU密集型和IO密集型与线程池的配置
  8. Surface Pro (1796),安装Win11之后出现的问题。
  9. js 正则表达式与 python正则表达式
  10. 兼容url传参