SpringBoot2.2.2+Elasticsearch7.6.2实现中文、拼音、拼音首字母智能提示功能

一、Elasticsearch介绍

1.1 Elasticsearch是什么

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1.2 Elasticsearch常用名词

文档:文档是索引和搜索数据的最小单位,一个文档可以理解为一个数据库表的一行数据,它和行的区别是,文档是有层次的(文档中可以包含新的文档,一个字段可以包含其他字段和取值,想象JSON格式的数据),无模式的(并非所有的文档都需要拥有相同的字段)。

类型:类型是文档的逻辑容器,相当于数据库中的一张表,每个类型中字段的定义称为映射。例如name字段可以映射为String。

索引:索引是映射类型的容器,相当于一个关系型数据库,是独立的大量文档集合。

节点:一个节点是一个Elasticsearch实例,在服务器上启动Elasticsearch后,就拥有了一个节点。如果在另一台服务器上启动Elasticsearch,这就是另一个节点。也可以通过启动多个Elasticsearch进程,在同一台服务器拥有多个节点。对于使用Elasticsearch的应用程序,集群中有1个还是多个节点都是透明的,默认情况下,可以连接集群中任一节点并访问完整的数据集,就好像集群只有单独的一个节点。

分片:分片是Elasticsearch处理的最小单元,一份分片是一个Lucene索引:一个包含倒排索引的文件目录,倒排索引的结构使得Elasticsearch在不扫描所有文档的情况下,就能告诉你哪些文档包含特定的词条(单词),倒排索引记录了词条出现在哪个文档的什么位置,以及出现的次数等映射信息。
在这里插入图片描述
分片分为主分片和副本分片,副本分片有助于提高搜索性能和容错率,Elasticsearch在索引的主分片和副本分片中进行搜索请求的负载均衡,原有主分片丢失后会成为新的主分片,副本分片可以在运行时进行添加和移除,而主分片不可以,在创建索引之前必须决定主分片的数量,过少的分片会限制可拓展性,过多的分片会影响性能。

水平拓展与垂直拓展:水平拓展:在节点中加入更多节点,一般是在另外服务器开启Elasticsearch实例。垂直拓展:为原来的节点增加更多硬件资源,如为虚拟机分配更多处理器,为物理机增加更多内存,更多的CPU,更快的磁盘。

1.3 分布式索引和搜索(多节点多分片)过程

索引过程:接收建立索引请求的Elasticsearch节点首先选择文档索引到哪个分片。默认地,文档在分片中均匀分布:对于每篇文档,分片是通过其ID字符串的散列决定的,每份分片拥有相同的散列范围,接收新文档的机会均等,一旦目标分片确定,接收请求的节点将文档转发到该分片所在的节点。随后,建立索引操作在所有目标分片的所有副本分片中进行,在所有可用副本分片完成文档索引后,建立索引命令就会成功返回。
在这里插入图片描述
搜索过程:搜索时,接收请求的节点将请求转发到一组包含所有数据的分片,Elasticsearch使用round-robin的轮询机制选择可用的分片(主分片或副本分片),并将搜索请求转发过去,Elasticsearch然后从这些分片收集结果,将其聚集到单一的回复,然后将回复返回给客户端应用程序。
在这里插入图片描述

想要实现功能:
搜索框的自动补全,智能提示
在这里插入图片描述

二、windows下Elasticsearch安装

Elasticsearch官网下载地址:https://www.elastic.co/cn/downloads/elasticsearch

在这里插入图片描述
也可以下载其他旧版本:
在这里插入图片描述
安装步骤参考: https://blog.csdn.net/kevlin_v/article/details/94616871

安装IK中文分词器和拼音分词器:https://blog.csdn.net/qq_28988969/article/details/79540620

三、Elasticsearch搭建集群

项目中用到了两台windows服务器10.254.24.54,10.254.24.55,于是就搭建了只有两个节点的简单集群,也可以搭建单机伪集群,操作一样。

3.1 修改elasticsearch.yml配置文件

10.254.24.55服务器

# 设置集群名称,集群内所有节点的名称必须一致。
cluster.name: my-esCluster
# 设置节点名称,集群内节点名称必须唯一。
node.name: node1
# 表示该节点会不会作为主节点,true表示会;false表示不会
node.master: true
# 当前节点是否可以作为数据节点,是:true、否:false
node.data: true
# 索引数据存放的位置
path.data: D:\TPI\elastic\data
# 日志文件存放的位置
#path.logs: /opt/elasticsearch/logs
# 需求锁住物理内存,是:true、否:false
#bootstrap.memory_lock: true
# 监听地址,用于访问该es
network.host: 0.0.0.0
# es对外提供的http端口,默认 9200
http.port: 9200
# TCP的默认监听端口,默认 9300
transport.tcp.port: 9300
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 1
node.max_local_storage_nodes: 2
# es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["10.254.24.55:9300", "10.254.24.54:9301"] 
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
# es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node1", "node2"]
# 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.enabled: true
# “*” 表示支持所有域名
http.cors.allow-origin: "*"
action.destructive_requires_name: true
action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*
xpack.security.enabled: false
xpack.monitoring.enabled: true
xpack.graph.enabled: false
xpack.watcher.enabled: false
xpack.ml.enabled: false

10.254.24.54 服务器

# 设置集群名称,集群内所有节点的名称必须一致。
cluster.name: my-esCluster
# 设置节点名称,集群内节点名称必须唯一。
node.name: node2
# 表示该节点会不会作为主节点,true表示会;false表示不会
node.master: true
# 当前节点是否可以作为数据节点,是:true、否:false
node.data: true
# 索引数据存放的位置
path.data: D:\elasticsearch\data
# 日志文件存放的位置 
#path.logs: /opt/elasticsearch/logs
# 需求锁住物理内存,是:true、否:false
#bootstrap.memory_lock: true
# 监听地址,用于访问该es 
network.host: 0.0.0.0
# es对外提供的http端口,默认 9200
http.port: 9201
# TCP的默认监听端口,默认 9300
transport.tcp.port: 9301
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 1
node.max_local_storage_nodes: 2
# es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,这里要加端口号,否则可能导致启动时选主节点失败
discovery.seed_hosts: ["10.254.24.55:9300", "10.254.24.54:9301"] 
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
# es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node1", "node2"]
# 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.enabled: true
# “*” 表示支持所有域名
http.cors.allow-origin: "*"
action.destructive_requires_name: true
action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*
xpack.security.enabled: false
xpack.monitoring.enabled: true
xpack.graph.enabled: false
xpack.watcher.enabled: false
xpack.ml.enabled: false

单机伪集群配置参考:https://blog.csdn.net/csdn565973850/article/details/104772551/

3.2 修改jvm.options配置文件

修改JVM堆的初始值和最大值,项目两台服务器都是16g,我将jvm堆初始值与最大值改成了8g

-Xms8g
-Xmx8g

集群规划与管理:https://www.cnblogs.com/leeSmall/p/9220535.html

3.3 启动并访问

以服务的方式启动:
在这里插入图片描述
分别访问两台服务器

10.254.24.54:9201
在这里插入图片描述
10.254.24.55:9200
在这里插入图片描述四、SpringBoot整合ElasticSearch Java High Level Rest Client

4.1 pom.xml

   <!--elasticsearch-->
        <!--elasticsearch-rest-high-level-client-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.6.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.6.2</version>
        </dependency>
        <!--&lt;!&ndash; https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client &ndash;&gt;-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.6.2</version>
        </dependency>

Elasticsearch Java High Level Rest Client对SpringBoot版本有比较高的要求,一开始我SpringBoot版本时2.0.0版本的,整合后发现项目启动不了,也没报任何错误,后来就改成了2.2.2版本发现可以启动成功。同时如果项目之前已经导入了httpclient依赖的话,也可能因为httpclient版本冲突导致启动报错。

把项目原来引入的httpclient依赖注释掉:

<!-- httpclient begin -->
        <
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值