最近学习使用到 ElasticSearch(ES),本文将总结一下使用心得,内容包括安装和集成 SpringBoot。
关于 ElasticSearch 的特点介绍,烦请读者自行查找资料。
安装 ES
首先,安装 ElasticSearch 前,需要先知道自己想要使用的是哪个版本?例如,笔者在开发现有的 SpringBoot 项目的时候,使用的 SpringBoot 版本是 2.7.14
,根据 SpringBoot 官方文档的说明,笔者选择了版本号为 7.17.3
的 ElasticSearch1。
此外,笔者使用的系统是 Ubuntu
系统,如果需要了解其他操作系统的安装方式,烦请读者自行查阅资料。例如,windows、docker 的安装方法。
在开始安装之前,先到官网下载安装包,默认下载的是官网最新版本:下载 Elastic 产品 | Elastic。点击下方红框按钮后,进入另一个页面。
笔者想要下载的是 7.17.3
版本的,因此再点击右边的 View past releases
进入新的页面后,搜索对应版本 7.17.3
,点击进入后,选择 DEB X86_64
版本下载:
下载完成后,上传到 Linux 服务器,例如,笔者上传的目标路径为:/usr/src/elasticsearch
。当然,也可以直接在 linux 服务器下载该安装包
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-amd64.deb
接下来开始安装,安装开始之前,请确保自己的机器内存充足,最好在 4G
以上(如果内存不够,请看后文如何修改 ElasticSearch 的配置文件修改):
sudo dpkg -i elasticsearch-7.17.3-amd64.deb
# 不同的版本安装过程可能会有所不同,8.9.0 会设置初始密码并输出,此处笔者选择的版本则没有
# 安装完成后,启动服务,并验证是否启动成功
sudo systemctl start elasticsearch.service
sudo systemctl status elasticsearch.service
# 访问验证
curl localhost:9200
# 如果设置了密码,使用以下命令
curl -u elastic 'localhost:9200'
# 如果成功启动,上面的命令会打印以下结果
{
"name" : "iZf8z0puua6p4yk04wue82Z",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "S_60Po8mTP6d-QiwTmvF2g",
"version" : {
"number" : "7.17.3",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
"build_date" : "2022-04-19T08:11:19.070913226Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
到这里,基本上就已经成功运行起来 ElasticSearch 了,以下是一些可能需要修改的配置:
# 修改 /etc/elasticsearch/elasticsearch.yml
vim /etc/elasticsearch/elasticsearch.yml
# 让外网可以连接到 ElasticSearch 服务
network.host: 0.0.0.0
# 配置端口
http.port: 9200
# 设置本机的 ip 地址,让外网能够访问
discovery.seed_hosts: ["192.168.111.111"]
# 设置为单机模式,集群模式的相关配置烦请自行查阅
discovery.type: single-node
# 如果要设置密码验证,需要开启下面的配置
xpack.security.enabled: true
修改 ES 内存占用
# 修改 /etc/elasticsearch/jvm.option
-Xms1g
-Xmx1g
修改完成后,重启 ES
sudo systemctl restart elasticsearch.service
安装可视化工具 Kibana
Kibana 是 ElasticSearch 官方提供的可视化工具,可以方便我们浏览存储在 ES 中的数据,可自行选择是否安装。笔者建议安装,方便开发
首先,是去官网下载与 ES 版本对应的 Kibana:Past Releases of Elastic Stack Software | Elastic
下载、安装方式大同小异。
sudo dpkg -i kibana-7.17.3-amd64.deb
# 安装完成后直接启动
sudo systemctl start kibana.service
其他配置:
# 修改配置文件
vim /etc/kibana/kibana.yml
# 配置外网访问
server.port: 5601
server.host: "0.0.0.0"
# 修改启动内存
vim /etc/kibana/node.options
# 修改内容
--max-old-space-size=256 #单位m
# 重启服务
sudo systemctl restart kibana.service
密码设置(可选)
# 确保 /etc/elasticsearch/elasticsearch.yml 中配置了 xpack.security.enabled: true
# 运行以下二进制文件
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
# 根据提示设置所有相关用户的密码
# 修改 kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "Zwxczmy19981010"
# 或者使用 token,确保上面 ES 已经设置了密码
# 执行以下二进制文件,生成令牌
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
# 设置 kibana.yml
elasticsearch.serviceAccountToken: "my_token"
简单使用
通过上面的操作,现在已经可以使用上 ES 了,具体的操作可以参考中文文档2。
本文对于 ES 的使用主要聚焦于 SpringBoot 上集成并操作上,因此不多花费笔墨于 curl 调用 api 上。
本文在此处演示以下 kibana 的使用,首先,先创建一个索引并创建文档,保证 ES 有数据:
# 如何设置了密码,则加上命令参数:-u elastic
# url 中参数 pretty 可以将返回的 json 字符串可视化
curl -XPUT 'localhost:9200/my_index?pretty'
# 返回结果
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my_index"
}
# 插入数据
curl -XPUT 'localhost:9200/my_index/external/1?pretty' -H "Content-Type: application/json" -d '
{
"key":"value",
"a": "b"
}'
# 返回结果
{
"_index" : "my_index",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
# 查看数据
curl 'localhost:9200/my_index/external/1?pretty'
# 返回结果
{
"_index" : "my_index",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"key" : "value",
"a" : "b"
}
}
现在 ES 中已经有数据了,访问 Kibana 查看以下,Kibana 的访问地址:localhost:5601' 如果设置了密码,那么需要在进入前输入用户名和密码,这里我们输入
elastic` 的用户名和密码。
之后根据下图按顺序操作
然后,再根据下图顺序操作,创建索引模式,根据提示输入并创建,这里我们创建刚才创建的索引创建:my_index
创建成功后,即可在 Kibana 中查看到存储的文档了,根据下图操作顺序,查看数据:
至此,关于 ES 和 Kibana 的简单使用就介绍完毕了。
SpringBoot 集成 Elasticsearch
使用 Elasticsearch 可以为项目提供更好的搜索体验,笔者将简单介绍一下,如何在 SpringBoot 中使用 ES。
引入依赖:
org.springframework.boot
spring-boot-starter-data-elasticsearch
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
配置文件:
spring:
elasticsearch:
uris: localhost:9200
password:
username:
编写类,SpringBoot 集成的 ES 提供了和 JPA 相同的方法接口,可以更方便我们进行简单的增删改查,但复杂的方式还需要使用其他方式。
下面是进行简单的增删改查的示例代码:
实体类,使用注解 @Document
同 ES 进行绑定:
@Data
@Document(indexName = "user")
public class User implements Serializable {
@Id
private String id; // id
private String username; // 用户名
private String password; // 密码
}
持久层接口,继承接口 ElasticsearchRepository
@Repository
public interface UserRepository extends ElasticsearchRepository {
}
服务类
public interface UserService {
User save(User user);
Iterable getAll();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User save(User user) {
return userRepository.save(user);
}
@Override
public Iterable getAll() {
return userRepository.findAll();
}
}
至此,SpringBoot 集成 ES 就已经基本完成了,读者可以尝试通过控制器或者测试类去调用这些方法,查看效果。
此外,由于 ElasticsearchRepository
支持 JPA 的方法命名进行简单查询,我们也可以这样定义方法,进行查询 user. name like ?
。方法定义如下:
// Pageable 表示分页查询
Page findByUsernameLike(String username, Pageable pageable);
关键词高亮查询
要实现关键词高亮查询,我们需要引入新的类,而不是简单的使用 Repository
提供的接口。以下是简单的步骤总结,代码将在后续附上:
HighlightBuilder.Field
构建需要高亮的字段NativeSearchQueryBuilder
构建查询条件,传入高亮字段参数elasticsearchRestTemplate.search
进行查询,获取查询结果示例代码:
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Override
public void keywordQuery() {
// 构建高亮字段,同时设置包裹标签,不设置默认为 HighlightBuilder.Field username = new HighlightBuilder.Field("username")
.preTags("")
.postTags("");
// 构建查询,查询 username 为小明的文档,进行分页查询,页码从 0 开始,传入高亮处理字段
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("username", "小明"))
.withPageable(PageRequest.of(0, 5))
.withHighlightFields(username)
.build();
// 获取查询结果
SearchHits search = elasticsearchRestTemplate.search(query, User.class);
// 处理查询结果的高亮字段
for (SearchHit searchHit : search.getSearchHits()) {
List highlights = searchHit.getHighlightField("username");
for (String highlight : highlights) {
System.out.println(highlight);
}
// 根据需要,将高亮结果替换到结果,或进行其他业务处理
}
}
打印结果:
小明0
小明1
小明2
小明3
小明4
总结
本文介绍了 ElasticSearch 在 Ubuntu 系统下的安装,简单介绍了它的使用方法和一些简单配置,以及如何使用 Kibana 可视化地处理索引、数据。最后,介绍了如何在 SpringBoot 中集成 ElasticSearch 并进行一些简单的 CRUD,以及如何实现关键词高亮搜索提示。
Footnotes
Spring Data Elasticsearch - Reference Documentation ↩
目录 - elasticsearch中文文档 ↩