SpringBoot整合ElasticSearch

一.【es-client】项⽬的pom.xml⽂件中,引⼊Spring Data Elasticsearch的启动器

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

二.resources⽬录下的application.yml⽂件中配置Elasticsearchhostport信息

spring:data:elasticsearch:cluster-name: elasticcluster-nodes: 10.48.185.11:9301,10.48.185.93:9302,10.48.185.90:9300,10.48.185.77:9300

        <!-- ES高级Rest Client --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.4.3</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.4.3</version></dependency>

 

需要注意的是, Spring Data Elasticsearch 底层使⽤的不是 Elasticsearch 提供的 RestHighLevelClient ,⽽是 TransportClient,并不采⽤ HTTP 协议通信,⽽是访问 Elasticsearch 对外开放的 TCP 端⼝。我们在之前集群配置 中,设置的端⼝分别是:9301 9302 9303

四.测试

创建⼀个 SpringDataESTests 测试类。通过 @Autowired 注解对 ElasticsearchTemplate进⾏注⼊,测试对象是否可以获取到
package com.qff.esclient.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataESTests {@Autowired
private ElasticsearchTemplate template;@Testpublic void check() {System.err.println(template);}
}

 如果运⾏ check() ⽅法报错,可能是以下问题所导致。

 

创建索引库
创建索引库需要使⽤到的注解:

 

 

package com.qff.esclient.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "product",type = "product",shards = 3,replicas = 1)
public class Product {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title; // 标题@Field(type = FieldType.Keyword)private String category; // 分类@Field(type = FieldType.Keyword)private String brand; // 品牌@Field(type = FieldType.Double)private Double price; // 价格@Field(type = FieldType.Keyword, index = false)private String images; // 图⽚地址
}

索引数据CRUD操作(一)

com.yx.respository 包下⾃定义 ProductRepository 接⼝,并继承 ElasticsearchRespository 接⼝。

 1.创建索引数据

   单个创建
@Autowired
private ProductRepository productRepository;
@Test
public void addDocument() {Product product = new Product(1L, "⼩⽶⼿机Mix", "⼿机", "⼩⽶", 2899.00,
"http://image.yx.com/12479122.jpg");// 添加索引数据productRepository.save(product);
}
批量创建
@Test
public void addDocuments() {// 准备⽂档数据List<Product> list = new ArrayList<>();list.add(new Product(5L, "荣耀V20", "⼿机", "华为", 2799.00,
"http://image.yx.com/12479122.jpg"));// 添加索引数据productRepository.saveAll(list);
}
查询索引数据
根据 id 查询数据

 查询所有数据

 ⾃定义⽅法查询

 

 

 引数据CRUD操作(二)(原生操作)

package com.qff.esclient.sercive;
import com.google.gson.Gson;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/** ⾃定义查询结果映射,⽤于处理⾼亮显示 */
public class ProductSearchResultMapper implements SearchResultMapper {/*** 完成查询结果映射。将_source取出,然后放⼊⾼亮的数据*/@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {// 记录总条数long totalHits = searchResponse.getHits().getTotalHits();// 记录列表(泛型) - 构建Aggregate使⽤List<T> list = new ArrayList<>();// 获取搜索结果(真正的的记录)SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {if (hits.getHits().length <= 0) {return null;}// 将原本的JSON对象转换成Map对象Map<String, Object> map = hit.getSourceAsMap();// 获取⾼亮的字段MapMap<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String, HighlightField> highlightField :
highlightFields.entrySet()) {// 获取⾼亮的KeyString key = highlightField.getKey();// 获取⾼亮的ValueHighlightField value = highlightField.getValue();// 实际fragments[0]就是⾼亮的结果,⽆需遍历拼接Text[] fragments = value.getFragments();// 因为⾼亮的字段必然存在于Map中,就是key值map.put(key, fragments[0].toString());}// 把Map转换成对象Gson gson = new Gson();T item = gson.fromJson(gson.toJson(map), aClass);list.add(item);}// 返回的是带分⻚的结果return new AggregatedPageImpl<>(list, pageable, totalHits);}@Overridepublic <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {return null;}
}

 

 

高亮自定义类

package com.qff.esclient.sercive;
import com.google.gson.Gson;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/** ⾃定义查询结果映射,⽤于处理⾼亮显示 */
public class ProductSearchResultMapper implements SearchResultMapper {/*** 完成查询结果映射。将_source取出,然后放⼊⾼亮的数据*/@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {// 记录总条数long totalHits = searchResponse.getHits().getTotalHits();// 记录列表(泛型) - 构建Aggregate使⽤List<T> list = new ArrayList<>();// 获取搜索结果(真正的的记录)SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {if (hits.getHits().length <= 0) {return null;}// 将原本的JSON对象转换成Map对象Map<String, Object> map = hit.getSourceAsMap();// 获取⾼亮的字段MapMap<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String, HighlightField> highlightField : highlightFields.entrySet()) {// 获取⾼亮的KeyString key = highlightField.getKey();// 获取⾼亮的Value tHighlightField value = highlightField.getValue();// 实际fragments[0]就是⾼亮的结果,⽆需遍历拼接Text[] fragments = value.getFragments();// 因为⾼亮的字段必然存在于Map中,就是key值map.put(key, fragments[0].toString());}// 把Map转换成对象Gson gson = new Gson();T item = gson.fromJson(gson.toJson(map), aClass);list.add(item);}// 返回的是带分⻚的结果return new AggregatedPageImpl<>(list, pageable, totalHits);}@Overridepublic <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {return null;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9395.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity+pico neo3入门教程

安装unity&#xff0c;教程如下&#xff1a;unity2021安装教程 安装pico的SDK:: https://developer-cn.pico-interactive.com/ 有入门教程&#xff1a;导入 SDK - PICO 开发者平台 注册后组织&#xff0c;创建应用learntest&#xff0c;如下 下载SDK。下载最新版&#xff…

Android CrashHandler全局异常

CrashHandler 介绍 Android 应用不可避免的会发生crash 即崩溃&#xff0c;无论程序写的多好&#xff0c;都会不可避免的发生崩溃&#xff0c;可能是由底层引起的&#xff0c;也有可能是写的代码引起的。当crash发生时&#xff0c;系统会kill掉正在执行的程序&#xff0c;现象…

Redhat7.6安装mysql5.7

环境准备&#xff1a;硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前&#xff0c;先要保证系统环境是干净的&#xff0c;不能存…

Docker网络管理应用

实验要求 了解Docker常用网络模式&#xff0c;掌握Docker常用网络模式的使用。主要任务是利用busybox镜像建立容器&#xff0c;容器名称为test_busybox1和test_busybox2&#xff0c;将网络模式设置为none&#xff0c;并为容器配置IP地址&#xff0c;容器test_busybox1的IP设置…

搜索二叉树

目录&#xff1a; 1.搜索二叉树的概念 2.对搜索二叉树实现插入Insert函数和InOrder中序遍历函数 3.删除 4.实现搜索二叉树的递归 5.拷贝问题 6.搜索二叉树的缺陷 ---------------------------------------------------------------------------------------------------------…

Python Websocket 控制大屏显示

场景描述&#xff1a; 在做大屏展示时&#xff0c;有这样一个需求&#xff1a;在不刷新页面的情况下&#xff0c;动态改变大屏展示内容&#xff0c;如&#xff1a;执行某个函数&#xff0c;把相关数据醒目展示&#xff0c;轮换数据显示顺序等等。比如有领导参观时&#xff0c;马…

通过阿里云函数计算FC实现音视频转码

1.进入阿里云函数计算FC页面 2.创建音视频转码应用 可以看到代码&#xff0c;看到相关的传参 3.进行测试 编辑测试参数&#xff0c;使用账号的OSS中的资源 点击测试函数进行测试 可以在OSS中看到生成的mp4格式的视频了 测试后发现函数计算可以使用 4. 接下来就是在项目中通过代…

logback日志的分片压缩

logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration debug"true"><springProperty name"LOG_PATH" source"shands.log.logPath" defaultValue"/var/delonix/logs/local"…

el-date-picker禁用指定日期之前或之后的日期

一、elementUI中el-date-picker禁用指定日期之前或之后的日期 通过配置picker-options配置指定禁用日期&#xff08;pickerOptions写到data里面&#xff09; <el-date-pickerv-model"date"type"date"size"small"value-format"yyyy-MM-d…

基于matlab使用视频和深度学习进行手势识别(附源码)

一、前言 此示例首先演示如何使用预训练的SlowFast视频分类器执行手势识别&#xff0c;然后演示如何使用迁移学习在自定义手势识别数据集上训练分类器。 基于视觉的人类手势识别涉及使用一组视频帧预测手势&#xff0c;例如挥手打招呼、手语手势或鼓掌。手势识别的一个吸引人…

【VSCODE】4、vscode git pull/push 报错 remote: HTTP Basic: Access denied

一、报错示例 在执行 git pull/push 的时候报错如下 二、解决方式 该问题来自 vscode 的身份验证 打开 vscode →code → 首选项 → 设置搜索 git.terminalAuthentication取消选中该选项重启终端即可

5.8.5 TCP可靠传输(一)序号确认机制

5.8.5 TCP可靠传输&#xff08;一&#xff09;序号确认机制 TCP是可靠的传输层协议&#xff0c;主要通过序号确认机制、超时重传机制、定时器三个方面实现可靠传输。 一、序号确认机制 TCP将所要传送的整个的应用层报文看成是一个一个字节组成的数据流&#xff0c;并对每一个…