SpringBoot Elasticsearch全文搜索

文章目录

  • 概念
  • 全文搜索相关技术
  • Elasticsearch
    • 概念
      • 近实时
      • 索引
      • 类型
      • 文档
      • 分片(Shard)和副本(Replica)
    • 下载
    • 启用
    • SpringBoot整合
      • 引入依赖
      • 创建文档类
      • 创建资源库
      • 测试文件初始化数据
      • 创建控制器
  • 问题
  • 参考

概念

全文搜索(检索),工作原理:计算机索引程序,扫描文章中的每一个词,对每一个词建立一个索引,指明出现次数和位置。查询时通过索引进行查找,类似于查字典。
因为是通过索引在查,速度较于通过sql查,会快很多。
具体过程如下:
1、建文本库
2、建立索引
3、执行搜索
4、过滤结果

全文搜索相关技术

Lucene:https://lucene.apache.org/core/
Solr:https://solr.apache.org/
Elasticsearch:https://www.elastic.co/cn/elasticsearch
Lucene是搜索引擎,Elasticsearch和Solr都是基于Lucene之上实现的全文检索系统
Elasticsearch和Solr对比,版本比较老,做参考即可

Elasticsearch

概念

一个高度可扩展的开源全文搜索和分析引擎,它允许用户快速地、近实时地对大数据进行存储、搜索和分析,它通常用来支撑有复杂的数据搜索需求的企业级应用 。

近实时

近实时,而不是实时
索引文档到可搜索的时间有一个轻微的延迟(通常为1秒)。之所以会有这个延时,主要考虑查询的性能优化。
想要实时,就得刷新,要么是牺牲索引的效率(每次索引之后刷新),要么就是牺牲查询的效率(每次查询之前都进行刷新 ),Elasticsearch取了折中,每隔n秒自动刷新
Elasticsearch 索引新文档后,不会直接写入磁盘,而是首先存入文件系统缓存,之后根据刷新设置,定期同步到磁盘。索引我们改完内容不会立即被搜索出来,但是会在1秒内可见

索引

相似文档的集合

类型

对一个索引中包含的文档进一步细分

文档

索引的基本单位,与索引中的一个类型相对应

分片(Shard)和副本(Replica)

数据量较大时,把索引分成多个分片来存储索引的部分数据,提高性能/吞吐量
为了安全,一个分片中的数据至少有一个副本

下载

https://www.elastic.co/cn/downloads/elasticsearch
注意版本,spring-boot2.x,不要用最新版本,用7.x.x

启用

命令行进入bin目录,执行elasticsearch启动服务,Ctrl/command + C停止服务
启用localhost:9200,测试Elasticsearch节点是否正在运行,可能会遇到安全认证问题,见问题部分

{"name": "zhangxingxingdeMacBook-Pro.local","cluster_name": "elasticsearch","cluster_uuid": "DwgXhzhwQ9WS0drElcEZmg","version": {"number": "7.11.1", // 当前elasticsearch版本"build_flavor": "default","build_type": "tar","build_hash": "ff17057114c2199c9c1bbecc727003a907c0db7a","build_date": "2021-02-15T13:44:09.394032Z","build_snapshot": false,"lucene_version": "8.7.0", //lucene版本"minimum_wire_compatibility_version": "6.8.0","minimum_index_compatibility_version": "6.0.0-beta1"},"tagline": "You Know, for Search"
}

SpringBoot整合

引入依赖

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

创建文档类

@Document(indexName = "blog")
@Table(name = "article")
public class EsBlog implements Serializable {private static final long serialVersionUID = 1L;@Id // 主键private String id;private String title;private  String author;private String content;protected EsBlog(){}public EsBlog(String title, String author, String content){this.title = title;this.author = author;this.content = content;}......@Overridepublic String toString(){return String.format("Article[id=%s, title='%s', author='%s', content='%s']",id, title, author, content);}
}

创建资源库

@Repository
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {Page<EsBlog> findByTitleContainingOrAuthorContainingOrContentContaining(String title, String author, String content, Pageable pageable);
}

注意在创建启动类中进行包扫描,否则注入的时候找不到bean

@EnableJpaRepositories(basePackages = "com.xxx.xxx")

测试文件初始化数据

@RunWith(SpringRunner.class)
@SpringBootTest(classes= SpringApplicationSock.class) // 启动sping-boot,引入IOC
public class EsBlogRepositoryTest {@Autowiredprivate EsBlogRepository esBlogRepository;@Beforepublic void initRepositoryData(){// 清除所有数据esBlogRepository.deleteAll();// 初始化数据,存入es存储库esBlogRepository.save(new EsBlog("静夜思", "李白", "床前明月光,疑是地上霜。举头望明月,低头思故乡。"));esBlogRepository.save(new EsBlog("咏柳", "贺知章", "碧玉妆成一树高,万条垂下绿丝绦。不知细叶谁裁出,二月春风似剪刀。"));esBlogRepository.save(new EsBlog("悯农", "李绅", "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。"));}@Testpublic void testFindDistincEsBlogTitleContainingOrSummaryContainingOrContentContaining(){// 初始化一个分页请求Pageable pageable = PageRequest.of(0, 20);String title = "咏";String author = "王";String content = "月";Page<EsBlog> page = esBlogRepository.findByTitleContainingOrAuthorContainingOrContentContaining(title, author, content, pageable);System.out.println("=================start");for(EsBlog blog : page){System.out.println(blog.toString());}System.out.println("=================end");}
}

查看存储库
http://localhost:9200/_cat/indices?v=
在这里插入图片描述

上述内容通过查询条件,只能查出两条数据
在这里插入图片描述
查看blog相关信息
http://localhost:9200/blog

{"blog": {"aliases": {},"mappings": {"properties": {"_class": {"type": "keyword","index": false,"doc_values": false},"author": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"content": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}},"settings": {"index": {"routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"refresh_interval": "1s","number_of_shards": "1","provided_name": "blog","creation_date": "1703233943853","store": {"type": "fs"},"number_of_replicas": "1","uuid": "0ELJkqnmTg-tDwritULELA","version": {"created": "7110199"}}}}
}

创建控制器

@RestController
@RequestMapping("/blogs")
public class EsBlogController {@Autowiredprivate EsBlogRepository esBlogRepository;@GetMappingpublic List<EsBlog> list(@RequestParam(value = "title", required = false, defaultValue = "") String title,@RequestParam(value = "author", required = false, defaultValue = "") String author,@RequestParam(value = "content", required = false, defaultValue = "") String content,@RequestParam(value = "pageIndex", required = false, defaultValue = "0") int pageIndex,@RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize){Pageable pageable = PageRequest.of(pageIndex, pageSize);Page<EsBlog> page = esBlogRepository.findByTitleContainingOrAuthorContainingOrContentContaining(title, author, content, pageable);return page.getContent();}
}

在这里插入图片描述

问题

1、ElasticSearch服务正常启动,但是在浏览器上无法访问http://localhost:9200,最新版本可能会有这个问题
received plaintext http traffic on an https channel, closing connection Netty4HttpChannel{localAddress=/[0:0:0:0:0:0:0:1]:9200, remoteAddress=/[0:0:0:0:0:0:0:1]:63470}
解决方法:
ElasticSearch默认开启了安全认证,需要将安全认证关掉
config/elasticsearch.yml,将下面两处的true改为false
在这里插入图片描述
2、启动test,提示Unsatisfied dependency expressed through field ‘esBlogRepository’;
未启动spring boot,没有IOC
https://blog.csdn.net/weixin_43801567/article/details/96643032
3、Unable to parse response body for Response{requestLine=POST /blog/_doc?timeout=1m HTTP/1.1, host=http://localhost:9200, response=HTTP/1.1 201 Created}
es服务器的响应程序解析不了,有可能是spring-boot版本低了
spring-boot 2.7.3,es:8.11.3 会有问题,将es改为7.11.1正常

参考

https://blog.csdn.net/weixin_38201936/article/details/121746906
https://blog.csdn.net/qq_50652600/article/details/125521823

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

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

相关文章

电子合同在物流运输中的场景应用

物流运输行业发展迅速&#xff0c;形成了采购、运输、仓储、配送、代理等全面的产业体系&#xff0c;在业务的开展过程中&#xff0c;各类纸质文件的签章管理如承运协议、运输合同、电子回单、入仓及出仓单据、融资保理协议、代理合作协议、商家入驻协议、员工劳动合同等&#…

Android 实现热点开机后自动开启

Android 实现热点开机后自动开启 文章目录 Android 实现热点开机后自动开启一、前言二、实现方式1、在 WifiServiceImpl 启动热点2、在开机广播中开启热点 三、其他1、热点开机自启动方式总结2、热点开启流程3、热点启动相关日志4、其他热点相关知识分享 一、前言 Android 热点…

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念&#xff0c;最早要追溯到二十年前玩FC游戏的时候&#xff0c;那时候超级玛丽成为了许多人童年里难忘的回忆&#xff0c;虽然长大了才知道超级玛丽是翻译错误&#xff0c;应该是任天堂的超级马里奥&#xff0c;不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

中国社科院与新加坡新跃社科大联合培养博士—未来是我们自己创造的

没有任何东西能像大胆的幻想那样促进未来的创立&#xff0c;没有任何东西能像扎实的实践那样实现幻想的未来&#xff0c;今天的幻想加实践就是明天的现实&#xff01;中国社科大-新加坡新跃社科大学联合培养工商管理博士&#xff0c;期待与您一起实现我们的未来。 人的一生其实…

SAP系统标准表之间的关联关系对应

SAP系统标准表之间的关联关系对应

指标体系构建-02-从0开始,梳理数据指标体系

指标体系构建-02-从0开始&#xff0c;梳理数据指标体系 一个例子&#xff0c;看懂并列式指标梳理 并列式指标体系&#xff0c;一般用于&#xff1a;描述个体情况 当我们想从几个不同角度&#xff0c;描述问题的时候&#xff0c;就需要并列关系 举个栗子&#x1f330;&#xf…

阿里云 ACK One 新特性:多集群网关,帮您快速构建同城容灾系统

云布道师 近日&#xff0c;阿里云分布式云容器平台 ACK One[1]发布“多集群网关”[2]&#xff08;ACK One Multi-cluster Gateways&#xff09;新特性&#xff0c;这是 ACK One 面向多云、多集群场景提供的云原生网关&#xff0c;用于对多集群南北向流量进行统一管理。 基于 …

redis 从0到1完整学习 (三):redis 数据结构

文章目录 0. 概述0.1 简要介绍 1. Strings1.1 常用命令 2 Lists2.1 常用命令 3. Sets3.1 常用命令 4. Hashes4.1 常用命令 5. Sorted sets5.1 常用命令 6. Streams6.1 常用命令 7. 参考 0. 概述 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&…

SpringBoot+Redis的Bloom过滤器

1.保姆级Linux安装Redis ①把redis.tar.gz下载到linux中&#xff0c;并用命令tar -zxvf安装 ②安装完成进入目录输入make进行编译&#xff0c;编译完成后输入make install 进行安装 ③创建两个文件夹mkdir bin mkdir etc 将redis目录下的redis.conf文件移动到etc文件中&…

普通相机标定——OpenCV函数讲解(下)

cv::projectPoints void cv::projectPoints(InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian = noArray(), double aspectRatio = 0 ) /** @brief 将世界坐标系中…

Modbus-TCP数据帧

Modbus-TCP基于4种报文类型 MODBUS 请求是客户机在网络上发送用来启动事务处理的报文MODBUS 指示是服务端接收的请求报文MODBUS 响应是服务器发送的响应信息MODBUS 证实是在客户端接收的响应信息 Modbus-TCP报文: 报文头MBAP MBAP为报文头&#xff0c;长度为7字节&#xff0c…

设计模式(三)-结构型模式(6)-享元模式

一、为何需要享元模式&#xff08;Flyweight&#xff09;? 假如在网页中渲染这样的一个画面&#xff1a;大小不一的星星铺满了整个画布&#xff0c;并且都在不断的进行移动闪烁着。一批星星消失了&#xff0c;另一批又从另一边缘处出现。 要实现这样的渲染效果&#xff0c;在…

DshanMCU-R128s2 配置引脚复用

本文中的约定 描述 GPIO 配置的形式&#xff1a;Port:端口 组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>文中的 <X>0,1,2,3,4,5…..&#xff0c;如 twi0&#xff0c;twi1….&#xff1b;uart0&#xff0c;uart1….。文中的 {PRO…

『居善地』接口测试 — 20.Mock功能介绍

1、Mock功能介绍 各个业务系统都会关联多个三方系统接口调用&#xff0c;在测试过程中第三方业务存在不能及时提供接口调用&#xff0c;这时就需要用到我们的mock服务了。 Mock的本质在于模拟三方业务接口的返回&#xff0c;来满足自身的测试功能&#xff0c;快速完成测试任务…

The engine “node“ is incompatible with this module.解决方法

安装依赖库报如下异常 [2/4] Fetching packages... error marked11.1.0: The engine "node" is incompatible with this module. Expected version "> 18". Got "16.14.0" error Found incompatible module. info Visit https://yarnpkg.com…

docker安装ES:7.8和Kibana:7.8

本文适用于centos7,快速入手练习es语法 前置&#xff1a;安装docker教程docker、docker-component安装-CSDN博客 1.安装es 9200为启动端口&#xff0c;9300为集群端口 docker pull elasticsearch:7.8.0mkdir -p /mydata/elasticsearch/pluginsmkdir -p /mydata/elasticsear…

python核心阶段(七)—— 包&模块以及虚拟环境

1.包&模块 概念解释 模块&#xff1a;为了使代码容易维护&#xff0c;可以将一组功能相关的代码写入一个单独的.py文件中&#xff0c;这 个.py文件就被称作一个模块 包&#xff1a; 包是指一个有层次的文件目录结构&#xff0c;它包含多个相关模块或子包&#xff1b; 它…

李群与李代数

群实际上就是一个特殊的集合&#xff0c;这个集合满足几个特点&#xff1a; 封闭性&#xff0c;就是对某种运算封闭&#xff0c;两个元素运算的结果仍然属于该集合结合性&#xff0c;结合律幺元&#xff0c;也就是存在一个“1”逆&#xff0c;也就是逆也在该集合中&#xff0c…

基于MybatisPlus批量高效插入百万条数据

引言 在JAVA程序开发中&#xff0c;对数据库进行大量数据插入是一个常见的操作&#xff0c;作为一个软件开发工程师&#xff0c;大批量的数据处理是日常工作&#xff0c;如何优化插入性能&#xff0c;提升数据处理效率是对大多数工程师的一个重要考验。本文将围绕逐条插入和批…

随时随地安心工作:迅软DSE保护您手机办公中的关键数据

互联网的快速发展让移动办公成为了日常工作中的一部分&#xff0c;同时企业数据加密的需求也已经不仅仅局限于内部终端&#xff0c;对于灵活的手机移动端也同样需要进行合法合规的数据安全管控。 迅软DSE数据防泄密系统提供移动端管理模块&#xff0c;支持Android、IOS移动客户…