es 查询共有4种查询类型

QUERY_AND_FETCH:

  主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总排序然后再返回给客户端,此种方式只需要和es交互一次。

这种查询方式存在数据量和排序问题,主节点会汇总所有分片返回的数据这样数据量会比较大,二是各个分片上的规则可能不一致。

QUERY_THEN_FETCH:

主节点将请求分发给所有分片,各个分片打分排序后将数据的id和分值返回给主节点,主节点收到后进行汇总排序再根据排序后的id到对应的节点读取对应的数据再返回给客户端,此种方式需要和es交互两次。

这种方式解决了数据量问题但是排序问题依然存在而且是es的默认查询方式

DEF_QUERY_AND_FETCH 和 DFS_QUERY_THEN_FETCH:

  将各个分片的规则统一起来进行打分。解决了排序问题但是DFS_QUERY_AND_FETCH仍然存在数据量问题,DFS_QUERY_THEN_FETCH两种噢乖你问题都解决但是效率是最差的。

Maven依赖:

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.0.5.RELEASE</version> 
</dependency>

yml配置:

spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300

测试代码:

 /**
* @author 宫新程
* @since 2018/10/24 12:29
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class GoodsItemLaunchEsTest { // 查询条件
private static final String ES_SEARCH_ITEM_NAME = "itemName";
private static final String ES_SEARCH_ITEM_MODEL = "itemModel";
private static final String ES_SEARCH_PRODUCT_CODE = "productCode";
private static final String ES_SEARCH_OPER_FLAG = "oper_flag"; @Resource private ElasticsearchTemplate elasticsearchTemplate;
@Resource private EsManager esManager; /** ES创建基础表 */
@Test
public void createIndex() {
elasticsearchTemplate.createIndex(EsGoodsItemLaunchDto.class);
elasticsearchTemplate.putMapping(EsGoodsItemLaunchDto.class);
} /** ES删除表 */
@Test
public void deleteIndex() {
this.elasticsearchTemplate.deleteIndex(EsGoodsItemLaunchDto.class);
} /** 插入测试数据 */
@Test
public void insertData() { List<IndexQuery> queryList = new ArrayList<>(); for (int i = 0; i < 10000; i++) {
EsGoodsItemLaunchDto dto = new EsGoodsItemLaunchDto();
dto.setId(i);
dto.setItemId(i);
dto.setItemSkuId(i);
dto.setItemName(i % 2 == 0 ? "洗衣机" + i : "空调" + i);
dto.setCustomerSellerCode("CustomerSellerCode" + i);
dto.setCustomerName("CustomerName" + i);
dto.setMemberSellerCode("MemberSellerCode" + i);
dto.setMemberName("MemberName" + i);
dto.setProductCode("ProductCode" + i);
dto.setItemModel("ItemModel" + i);
dto.setProductGroupName("ProductGroupName" + i);
dto.setProductGroupCode("ProductGroupCode" + i);
dto.setBrandId(i * 2);
dto.setBrandName("BrandName" + i);
dto.setGmCode(((int) Math.random() * 10000) + "");
dto.setUpdateTime(new Date());
dto.setMemberId(i * 5);
dto.setCustomerId(i * 6); IndexQuery indexQuery =
new IndexQueryBuilder()
.withId(String.valueOf(dto.getId()))
.withObject(dto)
.withIndexName(esManager.index4r(EsGoodsItemLaunchDto.class))
.build(); queryList.add(indexQuery); if (queryList.size() == 1000) {
this.elasticsearchTemplate.bulkIndex(queryList);
queryList.clear();
}
} // 必须加if判断否则报异常:
// org.elasticsearch.action.ActionRequestValidationException:
// Validation Failed: 1:no requests added;
if (queryList.size() > 0) {
// 保存剩余数据 (没被1000整除)
elasticsearchTemplate.bulkIndex(queryList);
}
} @Test
public void search() {
int pageNum = 2;
int pageSize = 5; BoolQueryBuilder filter = QueryBuilders.boolQuery();
// 注意一定要小写处理 toLowerCase()
String codeOrName = "ProductCode100".toLowerCase();
BoolQueryBuilder boolQueryLike = QueryBuilders.boolQuery();
// 分词查询 商品名称
MultiMatchQueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery(codeOrName, ES_SEARCH_ITEM_NAME);
// 商品型号
QueryBuilder itemModel =
QueryBuilders.wildcardQuery(ES_SEARCH_ITEM_MODEL, "*" + codeOrName + "*");
// 产品编码
QueryBuilder productCode =
QueryBuilders.wildcardQuery(ES_SEARCH_PRODUCT_CODE, "*" + codeOrName + "*");
boolQueryLike.should(queryBuilder);
boolQueryLike.should(itemModel);
boolQueryLike.should(productCode);
filter.must(boolQueryLike); // 判断ES表的 oper_flag 不等于 D
filter.mustNot(QueryBuilders.termQuery(ES_SEARCH_OPER_FLAG, "D")); SearchQuery searchQuery = new NativeSearchQuery(filter);
searchQuery.addIndices(esManager.index4r(EsGoodsItemLaunchDto.class));
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
searchQuery.setPageable(pageable); // 深度查询分页
Page<EsGoodsItemLaunchDto> result =
this.elasticsearchTemplate.startScroll(5000, searchQuery, EsGoodsItemLaunchDto.class); for (int i = 0; i < pageNum - 1; i++) {
elasticsearchTemplate.continueScroll(
((ScrolledPage) result).getScrollId(), 5000, EsGoodsItemLaunchDto.class);
} log.info("=====================================");
result
.getContent()
.forEach(
(dto) -> {
log.info("ItemName:{}", dto.getItemName());
});
log.info("总记录数:{}", result.getTotalElements());
log.info("当前页码数:{}", pageNum);
log.info("每页显示条数:{}", pageSize);
log.info("=====================================");
}
}
/* 输出结果:
<============================>
<ItemName:空调1001>
<ItemName:洗衣机1004>
<ItemName:洗衣机1006>
<ItemName:空调1007>
<ItemName:洗衣机1008>
<总记录数:11>
<当前页码数:2>
<每页显示条数:5>
<============================>
*/

SpringBoot 整合 Elasticsearch深度分页查询的更多相关文章

  1. SpringBoot整合Mybatis关于分页查询的方法

    最近公司在用到SpringBoot整合Mybatis时当web端页面数据增多时需要使用分页查询以方便来展示数据.本人对分页查询进行了一些步骤的总结,希望能够帮助到有需要的博友.如有更好的方式,也希望评 ...

  2. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

  3. ElasticSearch(2)---SpringBoot整合ElasticSearch

    SpringBoot整合ElasticSearch 一.基于spring-boot-starter-data-elasticsearch整合 开发环境:springboot版本:2.0.1,elast ...

  4. elasticserach数据库深度分页查询的原理

    深度分页存在的问题 https://segmentfault.com/a/1190000019004316?utm_source=tag-newest 在实际应用中,分页是必不可少的,例如,前端页面展 ...

  5. 😊SpringBoot 整合 Elasticsearch (超详细).md

    SpringBoot 整合 Elasticsearch (超详细) 注意: 1.环境搭建 安装es Elasticsearch 6.4.3 下载链接 为了方便,环境使用Windows 配置 解压后配置 ...

  6. springboot整合elasticsearch入门例子

    springboot整合elasticsearch入门例子 https://blog.csdn.net/tianyaleixiaowu/article/details/72833940 Elastic ...

  7. SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)

    准备工作 环境准备 JAVA版本 java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121 ...

  8. Springboot整合Elasticsearch报错availableProcessors is already set to [4], rejecting [4]

    Springboot整合Elasticsearch报错 今天使用SpringBoot整合Elasticsearch时候,相关的配置完成后,启动项目就报错了. nested exception is j ...

  9. Springboot整合elasticsearch以及接口开发

    Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...

随机推荐

  1. 基 B/S 平台的机房监控云平台-U位篇

    前言 机柜 U 位管理是一项突破性创新技术--继承了 RFID 标签(电子标签)的优点的同时,完全解决了 RFID 技术(非接触式的自动识别技术)在机房 U 位资产监控场应用景中的四大缺陷,采用工业互 ...

  2. 在 Vue-cli 创建的项目中引入 Element-UI

    Element-UI 是饿了么前端团队退出了一套基于 vue.js 开发的 UI 组件库,在与 Vue-cli 创建的项目结合时,需要做以下配置: 1. 安装 loader 模块 cnpm insta ...

  3. spring boot参数验证

    必须要知道 简述 JSR303/JSR-349,hibernate validation,spring validation 之间的关系 JSR303 是一项标准,JSR-349 是其的升级版本,添加 ...

  4. mybatis的环境搭建以及问题

    1.mybatis中3个重要的类或者接口 1)SqlSessionFactoryBuilder类 用它来创建工厂对象,它重载了9次build()方法,我们常用build(inputstream)来创建 ...

  5. IntelliJ IDEA下载安装及破解(100%成功)教程

    原文链接:http://www.studyshare.cn/software/details/1182/0 一.下载 1.IntelliJ IDEA下载 网盘下载:https://pan.baidu. ...

  6. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  7. 02-20 kd树(鸢尾花分类)

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  8. 计算几何基础算法几何C++实现

    This file is implementation of Common Common Computational Geometry Algorithms.Please please pay att ...

  9. DJango错误日志生成

    DJango错误日志生成 setting.py设置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': ...

  10. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...