Spring data ES攻略

2024-09-06 09:58
文章标签 java es spring data 攻略

本文主要是介绍Spring data ES攻略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总结下es的使用,方便其他小伙伴使用

一、配置依赖

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>2.0.4.RELEASE</version>
</dependency>

二、xml配置

创建xml文件,配置ES集群的连接,创建bean对象elasticsearchTemplate(spring对ES java api的封装);

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/elasticsearchhttp://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><elasticsearch:transport-client id="client"cluster-nodes="${elasticsearch_cluster_nodes}" cluster-name="${elasticsearch_cluster_name}" /><bean name="elasticsearchTemplate"class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"><constructor-arg ref="client" /></bean>
</beans>

这里使用了transport-client 集群的节点cluster-nodes 可以设置为多个或一个,因为默认开启了transport的嗅探功能,只需要指定其中一台机器,初次连接成功后就会获取到集群的列表。

client.transport.sniff = true 则开启嗅探功能

三、使用

直接上代码这是一个最简单常用的分页查询的方式:

  • 其中的注释解释了整个查询方式,依照此流程查询
@Override
public Page<CategoryGoodsData> queryHotSellProductDataByPage(PaginationRequest<BaseDataRequestVo> requestVo) {CommonUtils.setStoreIdFromEcBizStoreId(requestVo);Page<CategoryGoodsData> resultMerchantSummaryData = null;try {// 1.构建查询条件Date date = DateUtils.addDays(new Date(), -1);requestVo.getQueryParameter().setStartTime(DateUtil.format(date, Constant.DATE_STATE_TIME_FORMAT));requestVo.getQueryParameter().setEndTime(DateUtil.format(new Date(), Constant.DATE_END_TIME_FORMAT));Criteria criteria = new Criteria();criteria.and((new Criteria(Constant.ES_PARAM_PID).is(requestVo.getPid()))).and((new Criteria(Constant.ES_PARAM_STOREID).is(requestVo.getStoreId()))).and((new Criteria(Constant.ES_PARAM_CHANNEL_TYPE).is(requestVo.getQueryParameter().getChannelType()))).and(new Criteria(Constant.ES_PARAM_ANALYZEDATE).greaterThanEqual(requestVo.getQueryParameter().getStartTime())).and(new Criteria(Constant.ES_PARAM_ANALYZEDATE).lessThan(requestVo.getQueryParameter().getEndTime()));// 1.1模糊匹配商品名称if (StringUtils.isNotEmpty(requestVo.getQueryParameter().getPageName())) {criteria.and(new Criteria(Constant.ES_PARAM_GOODS_NAME).contains(CommonUtils.removeSpecialCharacters(requestVo.getQueryParameter().getPageName())));}// 1.2排序Sort sort = new Sort(Direction.DESC, Constant.ES_PARAM_ANALYZEDATE);if (CollectionUtils.isNotEmpty(requestVo.getOrderBy())) {OrderField orderFiled = requestVo.getOrderBy().get(0);if (StringUtils.isNotBlank(orderFiled.getSort()) && StringUtils.isNotBlank(orderFiled.getField())) {sort = new Sort(DataManagementUtils.getDirection(orderFiled.getSort()), orderFiled.getField());}}// 2.构建查询CriteriaQuery criteriaQuery = new CriteriaQuery(criteria);// 2.1 设置分页条件criteriaQuery.setPageable(new PageRequest(requestVo.getPageNum() - Constant.ES_PAGE_SIZE_DECREASE, requestVo.getPageSize(), sort));// 2.2 设置索引 (此处是业务要求动态生成索引的方法,灵活变通,不做累赘)String[] indexList = DataManagementUtils.getDynamicIndexBusi(requestVo.getQueryParameter().getStartTime(), requestVo.getQueryParameter().getEndTime(),suffix);criteriaQuery.addIndices(indexList);// 2.3 设定typecriteriaQuery.addTypes(Constant.ES_TYPE_CATEGORY_GOODS_DATA_1);// 3. ES API分页查询resultMerchantSummaryData = elasticsearchTemplate.queryForPage(criteriaQuery, CategoryGoodsData.class);} catch (Exception e) {LOGGER.error("findTradeDetailDayDataByPage error", e);throw new DataManagementBizException(DataManagementErrorCode.QUERY_CATEGORY_GOODS_ERROR);}return resultMerchantSummaryData;
}

  • elasticsearchTemplate中封装了各种查询方式如图,望名之意,并且提供了根据你传入的范型class,从ES命中的Hit记录映射转化为出参对象。
  • 图中标红的是本人常用的几种查询方式

四、CriteriaQuery与SearchQuery

在elasticsearchTemplate提供的接口中可以看到:其中入参有CriteriaQuery 和SearchQuery 

  • 其中CriteriaQuery满足了在使用的过程中满足了基础的大部分查询,如上面的使用例子,各种列表,分页,查询对象,但是无法使用聚合查询
  • 这时候就要用到SearchQuery,SearchQuery中提供了更加丰富的查询方式
  • 它似乎SearchQuery依赖于elasticsearch的原生QueryBuilders而CriteriaQuery而是特定于Spring Data。(这点来自下方的ps,提问者的见解) 

五、PS

有了以上四点使用spring data es已经没有问题了

PS:

在我们希望在对CriteriaQuery 和SearchQuery 提供的两种查询使用中,了解到这两种该在分别适合什么场景,该在什么情况下使用,奈何资料甚少

stack overflow上的这个疑问已经存在3年,这个提问者的疑惑也是我的疑惑,不过提问者也提供除了自己的见解

这篇关于Spring data ES攻略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141709

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C