目录
4.5 Spring Boot整合ElasticSearch实战
1. 全文检索
1.1 什么是全文检索
全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子邮件客户端、新闻聚合网站等。它可以帮助用户快速定位所需信息,提高检索效率和准确性。
查询:有明确的搜索条件边界。比如,年龄 15~25 岁,颜色 = 红色,价格 < 3000,这里的 15、25、红色、3000 都是条件边界。即有明确的范围界定。
检索:即全文检索,无搜索条件边界,召回结果取决于相关性,其相关性计算无明确边界性条件,如同义词、谐音、别名、错别字、混淆词、网络热梗等均可成为其相关性判断依据。
设想一个关于全文检索的场景,比如搜索Java设计模式:
id |
标题 |
描述 |
1 |
Java中的23种设计模式 |
Java中23种设计模式,包括简单介绍,适用场景以及优缺点等 |
2 |
Java多线程设计模式 |
Java多线程与设计模式结合 |
3 |
设计模式之美 |
结合真实项目案例,从面向对象编程范式、设计原则、代码规范、重构技巧和设计模式5个方面详细介绍如何编写高质量代码。 |
4 |
JavaScript设计模式与开发实践 |
针对JavaScript语言特性全面介绍了更适合JavaScript程序员的了16个常用的设计模式 |
... |
... |
... |
10亿 |
Java并发编程实战 |
深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册 |
... |
... |
... |
如果是用MySQL存储文章 ,我们应该会使用这样的 SQL 去查询
select * from t_blog where content like "%Java设计模式%"
这种需要遍历所有的记录进行匹配,不但效率低,而且搜索结果不符合我们搜索时的期望。
1.2 全文检索的原理
在全文检索中,首先需要对文本数据进行处理,包括分词、去除停用词等。然后,对处理后的文本数据建立索引,索引会记录每个单词在文档中的位置信息以及其他相关的元数据,如词频、权重等。这个过程通常使用倒排索引(inverted index)来实现,倒排索引将单词映射到包含该单词的文档列表中,以便快速定位相关文档。
当用户发起搜索请求时,搜索引擎会根据用户提供的关键词或短语,在建立好的索引中查找匹配的文档。搜索引擎会根据索引中的信息计算文档的相关性,并按照相关性排序返回搜索结果。用户可以通过不同的搜索策略和过滤条件来精确控制搜索结果的质量和范围。
1.3 什么是倒排索引
正排索引(Forward Index)和倒排索引(Inverted Index)是全文检索中常用的两种索引结构,它们在索引和搜索的过程中扮演不同的角色。
正排索引(正向索引)
正排索引是将文档按顺序排列并进行编号的索引结构。每个文档都包含了完整的文本内容,以及其他相关的属性或元数据,如标题、作者、发布日期等。在正排索引中,可以根据文档编号或其他属性快速定位和访问文档的内容。正排索引适合用于需要对文档进行整体检索和展示的场景,但对于包含大量文本内容的数据集来说,正排索引的存储和查询效率可能会受到限制。
在MySQL 中通过 ID 查找就是一种正排索引的应用。
倒排索引(反向索引)
倒排索引是根据单词或短语建立的索引结构。它将每个单词映射到包含该单词的文档列表中。倒排索引的建立过程是先对文档进行分词处理,然后记录每个单词在哪些文档中出现,以及出现的位置信息。通过倒排索引,可以根据关键词或短语快速找到包含这些词语的文档,并确定它们的相关性。倒排索引适用于在大规模文本数据中进行关键词搜索和相关性排序的场景,它能够快速定位文档,提高搜索效率。
我们在创建文章的时候,建立一个关键词与文章的对应关系表,就可以称之为倒排索引。如下图所示:
关键词 |
文章ID |
是否命中索引 |
Java |
1,2 |
√ |
设计模式 |
1,2,3,4 |
√ |
多线程 |
2 |
|
JavaScript |
4 |
2. ElasticSearch简介
2.1 ElasticSearch介绍
ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。
以下是一些 Elasticsearch 的特点和优势:
- 分布式架构:Elasticsearch 是一个分布式系统,可以轻松地水平扩展,处理大规模的数据集和高并发的查询请求。
- 全文检索功能:Elasticsearch 提供了强大的全文检索功能,包括分词、词项查询、模糊匹配、多字段搜索等,并支持丰富的查询语法和过滤器。
- 多语言支持:Elasticsearch 支持多种语言的分词器和语言处理器,可以很好地处理不同语言的文本数据。
- 高性能:Elasticsearch 使用倒排索引和缓存等技术,具有快速的搜索速度和高效的查询性能。
- 实时性:Elasticsearch 支持实时索引和搜索,可以几乎实时地将文档添加到索引中,并立即可见。
- 易用性:Elasticsearch 提供了简单易用的 RESTful API,方便进行索引管理、查询操作和数据分析。
官方网站: Elastic — The Search AI Company | Elastic
下载地址:Past Releases of Elastic Stack Software | Elastic
本文使用ES版本: v7.17.3 Elasticsearch 7.17.3 | Elastic
搜索引擎排名:
参考网站:DB-Engines Ranking - popularity ranking of search engines
2.2 ElasticSearch应用场景
只要用到搜索的场景,ES几乎都可以是最好的选择。国内现在有大量的公司都在使用 Elasticsearch,包括携程、滴滴、今日头条、饿了么、360安全、小米、vivo等诸多知名公司。除了搜索之外,结合Kibana、Logstash、Beats,Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,甚至通过使用机器学习技术,自动识别异常状况。
- 搜索引擎
- 站内搜索
- 日志管理与分析
- 大数据分析
2.3 技术选型
Elasticsearch |
Solr |
MongoDB |
MySQL |
|
DB类型 |
搜索引擎 |
搜索引擎 |
文档数据库 |
关系型数据库 |
基于何种框架开发 |
Lucene |
Lucene |
||
基于何种开发语言 |
Java |
Java |
C++ |
C、C++ |
数据结构 |
FST、Hash等 |
B+ Trees |
||
数据格式 |
Json |
Json/XML/CSV |
Json |
Row |
分布式支持 |
原生支持 |
支持 |
原生支持 |
不支持 |
数据分区方案 |
分片 |
分片 |
分片 |
分库分表 |
业务系统类型 |
OLAP |
OLAP |
OLTP |
OLTP |
事务支持 |
不支持 |
不支持 |
多文档ACID事务 |
支持 |
数据量级 |
PB级 |
TB级~PB级 |
PB级 |
单库3000万 |
一致性策略 |
最终一致性 |
最终一致性 |
最终一致性即时一致性 |
即时一致性 |
擅长领域 |
海量数据全文检索大数据聚合分析 |
大数据全文检索 |
海量数据CRUD |
强一致性ACID事务 |
劣势 |
不支持事务写入实时性低 |
海量数据的性能不如ES随着数据量的不断增大,稳定性低于ES |
弱事务支持不支持join查询 |
大数据全文搜索性能低 |
查询性能 |
★★★★★ |
★★★★ |
★★★★★ |
★★★ |
写入性能 |
★★ |
★★ |
★★★★ |
★★★ |
3. ElasticSearch环境搭建
3.1 安装ElasticSearch
安装文档:Install Elasticsearch from archive on Linux or MacOS | Elasticsearch Guide [7.17] | Elastic
温馨提示:初学者建议直接安装windows版本的ElasticSearch,安装包解压后就可以直接运行
windows安装ElasticSearch
(1)下载ElasticSearch
选择版本:7.17.3
# windows
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-windows-x86_64.zip
ElasticSearch文件目录结构
目录 |
描述 |
bin |
脚本文件,包括启动elasticsearch,安装插件,运行统计数据等 |
config |
配置文件目录,如elasticsearch配置、角色配置、jvm配置等。 |
jdk |
7.x 以后特有,自带的 java 环境,8.x版本自带 jdk 17 |
data |
默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改。 |
lib |
elasticsearch依赖的Java类库 |
logs |
默认的日志文件存储路径,生产环境需要修改。 |
modules |
包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。 |
plugins |
已安装插件目录 |
(2)配置JDK环境
- ES比较耗内存,建议虚拟机4G或以上内存,jvm1g以上的内存分配
- 运行Elasticsearch,需安装并配置JDK。各个版本对Java的依赖 Support Matrix | Elastic
-
- Elasticsearch 5需要Java 8以上的版本
- Elasticsearch 从6.5开始支持Java 11
- 7.0开始,内置了Java环境。ES的JDK环境变量生效的优先级配置顺序ES_JAVA_HOME>JAVA_HOME>ES_HOME
- ES_JAVA_HOME:这个环境变量用于指定Elasticsearch使用的Java运行时环境的路径。在启动Elasticsearch时,它会检查ES_JAVA_HOME环境变量并使用其中的Java路径。
- ES_HOME:这个环境变量指定Elasticsearch的安装路径。它用于定位Elasticsearch的配置文件、插件和其他相关资源。设置ES_HOME环境变量可以让您在命令行中更方便地访问Elasticsearch的目录结构和文件。
可以参考es的环境文件elasticsearch-env.bat