基于 ES 7 搭建搜索服务能力

环境搭建

版本选择

  • Java 1.8.0_131, 系统已安装
  • Elasticsearch 7.10.2, 阿里云目前推荐使用 7.10 版本, 这是 7.10.x 的最后一个版本. 由于系统已安装 Java, 因此选择 No JDK 模式
  • Kibana 7.10.2, 只在本地 Mac 电脑上体验了一下, 服务器上, 资源有限, 没有安装

Elasticsearch

从官网下载 Elasticsearch No JDK 7.10.2, 移到 /opt 目录下, 解压缩并执行

tar -xkzvf elasticsearch-7.10.2-no-jdk-darwin-x86_64.tar.gz
cd elasticsearch-7.10.2/bin
./elasticsearch
# 后台执行
nohup ./elasticsearch -d &

关闭服务

# 获取 Elasticsearch 进程号
jps
kill -9 进程号

Elasticsearch Head

查看 ES 信息的轻量级 Chrome 插件

Kibana

从官网下载 Kibana 7.10.2, 移到 /opt 目录下, 解压缩并执行

tar -xkzvf kibana-7.10.2-darwin-x86_64.tar.gz
cd kibana-7.10.2-darwin-x86_64/bin
./kibana

启动好以后, 进入 http://localhost:5601/app/dev_tools#/console

CentOS 搭建 ES 7.10.2

  1. 不能用 root 账号, 比如我用的是自己的账号 henry.
  2. 下载 elasticsearch-7.10.2-no-jdk-linux-x86_64.tar.gz 放到 /opt 目录下
  3. 解压缩 tar -xkzvf elasticsearch-7.10.2-no-jdk-linux-x86_64.tar.gz
  4. 取消对应行的注释, 参考如下配置 config/elasticsearch.yml
node.name: node-1
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
  1. 配置 config/jvm.options, 默认为 -Xms1g -Xmx1g, 修改为如下
-Xms512m
-Xmx512m

多节点集群配置

node-1 节点新增如下三条配置, 复制到 node-2 节点, 仅修改 node.name: node-2 即可.

cluster.name: ut-es-dev
discovery.seed_hosts: ["xxx.xxx.xxx.xxx:9300", "xxx.xxx.xxx.xxx:9300"]
cluster.initial_master_nodes: ["node-1", "node-2"]

启动以后的效果如下

添加安全认证

  1. 生成证书, 命令如下, 第一个回车, 不用管; 第二个输入密码.
./bin/elasticsearch-certutil ca
  1. 生成秘钥, 命令如下, 中间需要输入上一步的密码; 需要输入路径的地方可直接回车.
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
  1. 将凭证迁移到指定目录
mkdir -pv config/certificates
mv elastic-stack-ca.p12 config/certificates
chmod 600 elastic-certificates.p12
  1. 修改配置文件, 编辑 config/elasticsearch.yml, 增加如下配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certificates/elastic-certificates.p12
  1. 在各个节点上添加密码, 即第一步中设置的密码
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
  1. 启动节点 ./bin/elasticsearch -d
  2. 设置密码, 下面会要输入很多密码, 都要记住, 以后会用到
./bin/elasticsearch-setup-passwords  interactive
  1. 浏览查看 9200 端口, 比如用 ElasticSearch Head 访问 http://[ip]:9200.

参考 Elasticsearch开启安全认证详细步骤

基本用法

添加依赖

Spring Boot 2.2.6.RELEASE 依赖的 ElasticSearch 版本号为 6.8.7, 由于 ES 服务端安装版本为 7.10.2, 因此需要手动修改属性值

<properties>
  <elasticsearch.version>7.10.2</elasticsearch.version>
</properties>

添加依赖

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

配置客户端

参考 org.enthusa.hey.config.EsConfig

@Bean
public RestHighLevelClient restHighLevelClient() {
    HttpHost[] httpHosts = Stream.of(globalSetting.getEsHosts().split(",")).map(host -> new HttpHost(host, globalSetting.getEsPort(), "http")).toArray(HttpHost[]::new);
    RestClientBuilder builder = RestClient.builder(httpHosts);

    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "qwaszx"));
    builder.setHttpClientConfigCallback(h -> h
            .disableAuthCaching()
            .setDefaultCredentialsProvider(credentialsProvider));

    builder.setRequestConfigCallback(r -> r
            .setConnectTimeout(-1)
            .setSocketTimeout(-1)
            .setConnectionRequestTimeout(-1));

    return new RestHighLevelClient(builder);
}

创建搜索服务

  • 定义索引名模式常量, Consts
  • 扩展 AbstractSearchService 类, 实现 getIndexName, buildIndex, buildQuery
  • 定义 mappings json 文件
  • 全量索引与增量索引 index
  • Controller 中构造 QueryBuilder, 进行搜索

参考资料