What -- Elasticsearch 是什么?
Elasticsearch 是一个基于 Lucene 的搜索服务器, Elasticsearch 也是使用 Java 编写的, 它的内部使用 Lucene 做索引与搜索, 但是它的目的是使用全文检索变得简单, 通过隐藏 Lucene 的复杂性, 取而代之的提供一套简单一致的 RESTful API.
Elasticsearch 不仅仅是 Lucene, 并且也不仅仅只是一个全文搜索引擎. 它可以被下面这样准确的形容:
一个分布式的实时文档存储, 每个字段 可以被索引与搜索
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展, 并支持 PB 级别的结构化或者非结构化数据
面向文档
Elasticsearch 是面向文档, 即文档是可以被索引的信息的基本单位, 而文档的格式是在 NoSQL 中常用的 JSON, 关于关系型数据库和 Elasticsearch 之间一些名词的关系的对应可以用以下的表格来表示, 方便我们后面的应用:
关系型数据库 | Elasticsearch |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
这里需要注意的是文档的格式不是固定的, 同一个 Type 下的不同文档可以拥有不同的格式
Why -- 为什么选择 Elasticsearch?
丰富的查询方式 --Elasticsearch 能够执行及合并多种类型的搜索(结构化数据, 非结构化数据, 地理位置, 指标), 搜索方式随心而变.
极速的查询速度 --Elasticsearch 通过有限状态转换器实现了用于全文检索的倒排索引, 实现了用于存储数值数据和地理位置数据的 BKD 树, 以及用于分析的列存储. 每个数据都被编入了索引.
可观的可扩展性 --Elasticsearch 能够水平扩展, 每秒钟可处理海量事件, 同时能够自动管理索引和查询在集群中的分布方式, 可以在承载了 PB 级数据的成百上千台服务器上运行.
强大的弹性保障 -- 硬件故障. 网络分割. Elasticsearch 检测这些故障并确保集群 (和数据) 的安全性和可用性. 通过跨集群复制功能, 辅助集群可以作为热备份随时投入使用.
How -- 如何在 Spring Boot 实战中使用 Elasticsearch?
安装 Elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch
这里我们选择的是 6.2.2 版本的 ES, 因为我在 spring-data-Elasticsearch 的 GitHub 上看到最新版本的支持的 ES 是 6.2.2
其中 3.2.x 版本尚未发布正式版, 所以这里选择了最新的 3.1.8 版本, 下面我们切换到安装目录的 bin 目录下, 启动 es:
./Elasticsearch &
这里添加 & 符号的作用是让它在后台运行.
看到这个就说明启动成功了~
安装中文分词器 iK
因为, 在我们日常的应用中, 我们用的比较多的都是中文的分词, 所以这里我们需要一个中文的分词器
首先前往 GitHub 上下载与 ES 版本对应的 zip 包
然后在 es 的安装目录下的 plugins 下新建一个 ik 的目录, 将 zip 包解压到该目录下重启 es 即可~
在 es 的启动日志中看到这个说明插件已经安装并启动成功!
到这里, 我们的前期准备工作就已经结束了, 下面的就是在 Spring Boot 项目中进行操作了~
添加 pom 依赖
我们首先在 pom.xml 中添加 spring-data-Elasticsearch 的依赖(敲黑板!! 这里的版本一定要去参考一下对应的 ES 的版本, 不然就会引起版本兼容性问题而报错!):
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-Elasticsearch</artifactId>
- <version>3.1.8.RELEASE</version>
- </dependency>
依赖已经添加完毕, 下面我们就通过简单的配置来完成 CRUD
CRUD
这里的配置需要注意一个点, 我们访问的 9200 是 HTTP 的端口号, 而使用 Java 的时候需要配置成 9300:
- spring:
- data:
- Elasticsearch:
- cluster-name: my-applicatioon
- cluster-nodes: 127.0.0.1:9300
在启动日志中, 我们可以看到这一点:
然后我们通过注解来完成一个 index 和 mapping 的创建(即对应关系型数据库中的库和表)
- @Data
- @Document(indexName = "test",type = "article")
- public class Article implements Serializable {
- private Long id;
- @Field(type= FieldType.Text,analyzer = "ik_max_word")
- private String title;
- private String content;
- }
@Filed 注解中的属性可以对分词器进行配置 analyzer = "ik_max_word", 这样就可以在查询标题的时候使我们的中文分词器了~
这样, 我们就创建了一个 index(database)名为 test, 并新建一个 type(table)名为 article.
下面, 我们如果想要完成 CRUD, 只需要创建一个接口去继承 ElasticsearchRepository 即可, 如下:
- public interface ESDao extends ElasticsearchRepository<Article,Long> {
- }
然后, 我们就可以在我们项目这样去用了~
和 JPA 一样方便, 我们这时就可以把 ES 当做 MySQL 去操作即可~
项目中用到的对应版本的包我已经上传到了百度网盘, 关注公众号回复 "ES" 即可获取.
完整的 Demo 代码我已经上传到了 GitHub, 欢迎 fork star pr
https://github.com/viyog/viboot
原创不易, 谢谢支持!
公众号
来源: https://www.cnblogs.com/viyoung/p/10892014.html