ElasticSearch 安装、使用以及集成到 SpringBoot

2023年 8月 26日 150.0k 0

最近学习使用到 ElasticSearch(ES),本文将总结一下使用心得,内容包括安装和集成 SpringBoot。
关于 ElasticSearch 的特点介绍,烦请读者自行查找资料。

安装 ES

首先,安装 ElasticSearch 前,需要先知道自己想要使用的是哪个版本?例如,笔者在开发现有的 SpringBoot 项目的时候,使用的 SpringBoot 版本是 2.7.14,根据 SpringBoot 官方文档的说明,笔者选择了版本号为 7.17.3 的 ElasticSearch1。

此外,笔者使用的系统是 Ubuntu 系统,如果需要了解其他操作系统的安装方式,烦请读者自行查阅资料。例如,windows、docker 的安装方法。

在开始安装之前,先到官网下载安装包,默认下载的是官网最新版本:下载 Elastic 产品 | Elastic。点击下方红框按钮后,进入另一个页面。

下载Elasticsearch1.png

笔者想要下载的是 7.17.3 版本的,因此再点击右边的 View past releases

下载Elasticsearch2.png

进入新的页面后,搜索对应版本 7.17.3,点击进入后,选择 DEB X86_64 版本下载:

下载Elasticsearch3.png

下载Elasticsearch4.png

下载完成后,上传到 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` 的用户名和密码。

Kibana使用1.png

之后根据下图按顺序操作

Kibana使用2.png

然后,再根据下图顺序操作,创建索引模式,根据提示输入并创建,这里我们创建刚才创建的索引创建:my_index

Kibana使用3.png

创建成功后,即可在 Kibana 中查看到存储的文档了,根据下图操作顺序,查看数据:

Kibana使用4.png

至此,关于 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中文文档 ↩

  • 相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论