Springboot基于ElasticSearch全文搜索引擎策略实现

一、ElasticSearch概念简介

ElasticSearch是一个基于Lucene的开源搜索引擎,具有分布式、多租户能力的全文搜索引擎。ElasticSearch的设计目标是实现分布式、可扩展和速度快的搜索架构,使得用户在数据量较大的情况下依然能够快速高效地对数据进行搜索和分析。

ElasticSearch使用RESTful API进行操作,支持结构化、非结构化数据的索引和搜索,适合用来解决大量数据的全文搜索、数据分析、日志查询等问题。

二、ElasticSearch基本理论

  • 文档(Document):Documents是ElasticSearch中的最小数据单元类似我们关系数据库的一条记录,一个文档由JSON格式数据构成。Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示,下面是一个例子。


{"user": "张三","title": "工程师","desc": "数据库管理"
}
  • 索引(Index):Indexes类似于关系数据库中的数据库,每个索引包含多个类型和文档。ElasticSearch通过索引词典提高搜索效率。Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

--下面的命令可以查看当前节点的所有 Index。
curl -X GET 'http://localhost:9200/_cat/indices?v'
  • 分片(Shard)与副本(Replica):Index可以分为多个Shards,并且每个Shard可以有多个Replicas。分片提高了并行搜索和存储的能力,而副本提供了高可用性。

  • 倒排索引:ElasticSearch使用倒排索引数据结构来实现快速的全文搜索。倒排索引将一个单词映射到包含这个单词的文档,从而加速搜索查询。

三、ElasticSearch应用场景

  1. 全文搜索:ElasticSearch可以用于网站、文档系统中的全文搜索功能。

  2. 日志分析:与Logstash和Kibana组合成ELK Stack,可以构建日志收集和分析系统。

  3. 大数据分析:利用其强大的聚合功能和分布式计算能力进行实时数据分析。

  4. 推荐系统:通过搜索引擎相关性计算和评分功能,实现个性化推荐系统。

四、ElasticSearch在Linux环境下的安装部署

Elastic 需要 Java 8 环境。如果你的机器还没安装 Java,以下是在Linux系统(以Ubuntu为例)中安装ElasticSearch的步骤:

1.安装Java环境 ElasticSearch要求安装Java 8或以上版本。

sudo apt update
sudo apt install openjdk-11-jdk

2.下载并安装ElasticSearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-amd64.debsudo dpkg -i elasticsearch-7.10.0-amd64.deb

3.启动并设置ElasticSearch为开机自启动

sudo systemctl start elasticsearchsudo systemctl enable elasticsearch

4.验证安装

curl -X GET "localhost:9200/"

会返回以下信息


{"name" : "atntrTf","cluster_name" : "elasticsearch","cluster_uuid" : "tf9250XhQ6ee4h7YI11anA","version" : {"number" : "7.10.0","build_hash" : "19c13d0","build_date" : "2022-07-18T20:44:24.823Z","build_snapshot" : false,"lucene_version" : "6.6.0"},"tagline" : "You Know, for Search"
}

5.中文词搜索设置

首先,安装中文分词插件。这里使用的是 ik,也可以考虑其他插件(比如 smartcn)。

插件的下载地址:GitHub - infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK analyzer into Elasticsearch and OpenSearch, support customized dictionary.

./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.4.1

上面代码安装的是8.4.1版的插件,与 Elastic 7.x及以上的版本 配合使用,具体细节查看插件的版本库文档教程。

接着,重新启动 Elastic,就会自动加载这个新安装的插件。

然后,新建一个 Index,指定需要分词的字段。这一步根据数据结构而异,下面的命令只针对本文。基本上,凡是需要搜索的中文字段,都要单独设置一下。

curl -X PUT 'localhost:9200/accounts' -d '
{"mappings": {"person": {"properties": {"user": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"title": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"desc": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}}
}'

上面代码中,首先新建一个名称为accounts的 Index,里面有一个名称为person的 Type。person有三个字段。

这三个字段都是中文,而且类型都是文本(text),所以需要指定中文分词器,不能使用默认的英文分词器。Elastic 的分词器称为 analyzer。我们对每个字段指定分词器。

上面代码中,analyzer是字段文本的分词器,search_analyzer是搜索词的分词器。ik_max_word分词器是插件ik提供的,可以对文本进行最大数量的分词。

五、ElasticSearch与Spring Boot 2的整合

1、核心依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>${spring-boot.version}</version>
</dependency>

2、yml配置文件

spring:application:name: ware-elastic-searchdata:elasticsearch:# 默认 elasticsearchcluster-name: elasticsearch# 9200作为Http协议,主要用于外部通讯# 9300作为Tcp协议,jar之间就是通过tcp协议通讯cluster-nodes: 10.98.3.22:9300

3、实体类配置

Document配置,加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。

indexName索引名称 理解为数据库名 限定小写
type 理解为数据库的表名称
shards = 5 默认分区数
replicas = 1 每个分区默认的备份数
refreshInterval = "1s" 刷新间隔
indexStoreType = "fs"  索引文件存储类型

Java代码

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName = "systemlogindex",type = "systemlog")
public class SystemLog {//Id注解Elasticsearch里相应于该列就是主键,查询时可以使用主键查询@Idprivate Long id;private String orderNo;private String userId;private String userName;private String logData;private String createTime;
}

实现ElasticsearchRepository接口。

public interface SystemLogRepository 
extends ElasticsearchRepository<SystemLog,Long> {
}

4.演示实例实现

@Service
public class SystemLogServiceImpl implements SystemLogService {@Resourceprivate SystemLogRepository systemLogRepository ;@Overridepublic String esInsert(Integer num) {for (int i = 0 ; i < num ; i++){SystemLog systemLog= new SystemLog() ;systemLog.setId(System.currentTimeMillis());systemLog.setOrderNo(DateUtil.formatDate(new Date(),DateUtil.DATE_FORMAT_02)+System.currentTimeMillis());systemLog.setUserId("userId"+i);systemLog.setUserName("张三"+i);systemLog.setCreateTime(DateUtil.formatDate(new Date(),DateUtil.DATE_FORMAT_01));systemLog.setLogData("用户做了插入数据操作。")systemLogRepository.save(requestLog) ;}return "success" ;}@Overridepublic Iterable<SystemLog> esFindAll (){return systemLogRepository.findAll() ;}@Overridepublic String esUpdateById(SystemLog systemLog) {systemLogRepository.save(systemLog);return "success" ;}@Overridepublic Optional<SystemLog> esSelectById(Long id) {return systemLogRepository.findById(id) ;}@Overridepublic Iterable<SystemLog> esFindOrder() {// 用户名倒序// Sort sort = new Sort(Sort.Direction.DESC,"userName.keyword") ;// 创建时间正序Sort sort = new Sort(Sort.Direction.ASC,"createTime.keyword") ;return systemLogRepository.findAll(sort) ;}@Overridepublic Iterable<SystemLog> esFindOrders() {List<Sort.Order> sortList = new ArrayList<>() ;Sort.Order sort1 = new Sort.Order(Sort.Direction.ASC,"createTime.keyword") ;Sort.Order sort2 = new Sort.Order(Sort.Direction.DESC,"userName.keyword") ;sortList.add(sort1) ;sortList.add(sort2) ;Sort orders = Sort.by(sortList) ;return systemLogRepository.findAll(orders) ;}@Overridepublic Iterable<SystemLog> search() {// 全文搜索关键字/*String queryString="张三";QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);systemLogRepository.search(builder) ;*//** 多条件查询*/QueryBuilder builder = QueryBuilders.boolQuery()// .must(QueryBuilders.matchQuery("userName.keyword", "历张")) 搜索不到.must(QueryBuilders.matchQuery("userName", "张三")) // 可以搜索.must(QueryBuilders.matchQuery("orderNo", "20190613736278243"));return systemLogRepository.search(builder) ;}
}

总结

ElasticSearch作为强大的分布式全文搜索引擎具备许多强大的功能,通过在Spring Boot 2项目中的简单集成,可以很容易地利用ElasticSearch的搜索和查询能力,满足现代Web应用中的搜索需求。

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

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

相关文章

Retrofit类型安全的HTTP客户端库

简介 Retrofit是Square公司开发的一个类型安全的HTTP客户端库&#xff0c;用于Android和Java平台&#xff0c;它使得与Web服务的交互变得更加简单快捷。Retrofit将HTTP API转换成Java接口&#xff0c;让你可以用更简洁的代码形式调用RESTful API&#xff0c;Android网络编程重点…

Vue与SpringSecurity认证整合-06

Vue与SpringSecurity整合 我们要知道springsecurity是一个安全框架,我们在后端的时候没有接触前端,springsecurity引入依赖之后,启动项目会对我们进行拦截,让我们登录,然后我们制定了一个登录页面,也是后端的,我们可以指向我们的登录页面,但是与Vue整合之后,登录页面肯定是在Vu…

贾英才主任受聘担任“两个中心”专家委员会委员

近日&#xff0c;第二届海峡两岸中西医结合肾脏病学术大会授牌仪式在北京隆重举行。 这一盛会吸引了众多医学领域的专家学者&#xff0c;共同探讨中西医结合治疗肾脏病的最新进展和未来发展方向。 在此次大会上&#xff0c;崇文门中医医院的贾英才主任凭借其在肾脏病领域的卓…

【C语言 || 数据结构】二叉树

文章目录 前言 二叉树1.树1.1树的定义1.2 树的结构 2.特殊的树&#xff08;二叉树&#xff09;2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的储存2.3.1 顺序储存二叉树2.3.2 链表储存二叉树 2.4 二叉树的遍历2.4.1 二叉树的中序遍历2.4.2 二叉树的前序遍历2.4.3 二叉树的后序遍…

【React】使用Token做路由权限控制

在components/AuthRoute/index.js中 import { getToken } from /utils import { Navigate } from react-router-domconst AuthRoute ({ children }) > {const isToken getToken()if (isToken) {return <>{children}</>} else {return <Navigate to"/…

【odoo】odoo中实用的操作及方法:filtered、lambda 、mapped、sorted

概要 详细解答filtered、lambda 、mapped、sorted在odoo中的作用&#xff0c;使用场景以及使用方法。 内容 filtered 定义 filtered 方法用于从记录集中筛选出满足特定条件的记录。 使用场景 当你有一个记录集&#xff0c;但只需要其中一部分记录时&#xff0c;可以使用 …

React Native 集成 ArcGIS 地图

ArcGIS官方提供了 JavaScript SDK&#xff0c;也提供了 ArcGIS-Runtime-SDK-iOS&#xff0c;但是并没有提供 React Native的版本&#xff0c;所以这里使用了 react-native-arcgis-mapview 库&#xff0c;这个库比较老&#xff0c;支持的 ArcGIS-Runtime-SDK-iOS 版本是100.4&am…

服务器主机托管服务内容科普

在现代信息技术快速发展的背景下&#xff0c;服务器主机托管服务已成为众多企业、机构和个人不可或缺的一部分。本文将为您详细科普服务器主机托管服务的内容&#xff0c;帮助您更好地理解和选择适合自己的托管方案。 一、硬件与基础设施 服务器主机托管服务首先提供了硬件和网…

分布式锁常见实现方案总结

一、Redis 1. SETNX 加锁&#xff1a; 127.0.0.1:6379> SET lockKey uniqueValue EX 3 NX OKlockKey&#xff1a;加锁的锁名&#xff1b;uniqueValue&#xff1a;能够唯一标识锁的随机字符串&#xff1b;NX&#xff1a;只有当 lockKey 对应的 key 值不存在的时候才能 SET…

艾公益 艾多美(中国)有限公司向烟台市捐赠爱心物资

2024年6月18日&#xff0c;艾多美&#xff08;中国&#xff09;有限公司&#xff0c;在烟台市高新区举办了2项爱心捐赠仪式。 在本次爱心捐赠活动中&#xff0c;艾多美&#xff08;中国&#xff09;有限公司携手烟台市慈善总会向烟台市贫困女童捐赠助学金、爱心物资&#xff0c…

【字符串验证】验证码

【字符串验证】验证码 【参考代码】 #include <iostream> #include <cstring> using namespace std; int main(){ string a "AV8d";string b; cin >> b;for(int i0; i<a.length(); i){if(a[i]>A && a[i] < Z){a[i]32;}if…

算法008:四数之合

四数之和. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/4sum/description/ 在前面的两个题中&#xff0c;我们已经完成了两数之和和三数之和&#xff0c;到本题四…

React 中的服务器渲染组件

在前后分离架构以前&#xff0c;所有的 Html 业务都是后端渲染&#xff0c;返回前前端显示&#xff0c;后端渲染把前后端逻辑耦合在一起&#xff0c;增大系统的复杂度&#xff0c;不易于扩展。React 中的 Server组件&#xff0c;准确的说是服务器进行渲染&#xff0c;无论是什么…

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中&#xff0c;控制器的设计至关重要&#xff0c;它直接影响无人机的稳定性和响应能力。然而&#xff0c;要设计出高效、可靠的控制器&#xff0c;首先必须准确理解无人机的动态行为&#xff0c;这就需要通过收集输入输出数据来辨识其运动学模型。…

业务使用redis分布式锁

伴随着业务体量的上升&#xff0c;我们的qps与并发问题越来越明显&#xff0c;这时候就需要用到让代码一定情况下进行串行执行的工具&#xff1a;锁 1.业务场景代码 OverrideTransactional(rollbackFor Exception.class)public Object testBatch(User user) {LambdaQueryWrapp…

Java8的Lambda表达式

Java中的Lambda表达式是Java 8引入的一种新特性&#xff0c;主要用于简化代码&#xff0c;特别是在处理函数式编程和集合操作时。Lambda表达式允许你将功能作为方法参数传递&#xff0c;使代码更加简洁和易读。 1.基本语法 Lambda 的格式由3个部分组成 其标准格式为&#xf…

Go语言 获取服务器资源磁盘Disk情况

1、获取整个磁盘的总量、已使用量、使用率 package mainimport ("fmt""github.com/shirou/gopsutil/disk""log" )func main() {// 获取所有挂载点的磁盘使用率信息partitions, err : disk.Partitions(false)if err ! nil {log.Fatalf("Err…

Java面试八股之Mybatis和JPA的区别

Mybatis和JPA的区别 Mybatis 和 JPA&#xff08;Java Persistence API&#xff09;是两种在 Java 应用程序中用于数据持久化的框架&#xff0c;它们各有特点和适用场景。下面是它们之间的一些主要区别&#xff1a; 映射方式&#xff1a; Mybatis 是半自动的 ORM 框架&#xf…

MACER

MACER: A Modular Framework for Accelerated Compilation Error Repair 基本信息 博客贡献人 页禾七 作者 Darshak Chhatbar&#xff0c; Umair Z. Ahmed&#xff0c;Purushottam Kar 摘要 自动编译错误修复&#xff0c;即对无法编译的错误程序提出修复建议的问题&…

Android集成mapbox教程

目录 简介准备工作创建Token系统开发简介 Mapbox是来自美国的一家为开发者提供地图服务和开发工具的开放平台。Mapbox以开源的形式构建了矢量瓦片技术生态,开发了矢量切片工具、瓦片服务传输框架。Mapbox的底图平台非常受欢迎,特别是开发者和学生群体,可以使用免费的开源软…