Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
1、下载及安装
下载安装包:Download Elasticsearch | Elastic
可以根据自己使用的操作系统下载相应的版本。建议使用压缩包版,部署更灵活。我当前下载的是elasticsearch v7.10.0版本,所以就以此版本为例介绍配置和使用情况。
安装指引:Installing Elasticsearch | Elasticsearch Guide [7.10] | Elastic
2、配置
在配置文件./config/elasticsearch.yml中配置搜索引擎:
# 集群名称
cluster.name: my-application
# 当前节点名
node.name: node-1
# 数据存放路径,一定要放置在程序安全目录以外的地方,以防止数据丢失。
path.data: /path/to/data
# 日志存放路径
path.logs: /path/to/logs
# 设置当前节点所在服务器IP地址
network.host: 192.168.0.1
# 设置当前节点对应服务http端口
http.port: 9200
# 集群主节点,启动时使用,若仅有一个节点,此项可以不设置
cluster.initial_master_nodes: ["node-1", "node-2"]
# 默认情况下,当缓存超过可用内存时,会在swap之间切换,但切换会影响相应速度。
bootstrap.memory_lock: true
# 若需要权限验证,则开启下面的设置,否则不用开启
#xpack.security.enabled: true
#xpack.security.authc.accept_default_password: true
v7.10.0版本建议使用jre 11以上的版本,若本机使用的是低版本,比如jre8,则可以修改环境设置命令文件elasticsearch-env,由于elasticsearch内置jre v11,可以切换到内置的jre.
# now set the path to java
if [ ! -z "$JAVA_HOME" ]; then
JAVA="$JAVA_HOME/bin/java"
JAVA_TYPE="JAVA_HOME"
else
if [ "$(uname -s)" = "Darwin" ]; then
# macOS has a different structure
JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java"
else
JAVA="$ES_HOME/jdk/bin/java"
fi
JAVA_TYPE="bundled jdk"
fi
手动启动命令:$ES_HOME/bin/elasticsearch -d
若服务器支持systemd服务,在/usr/lib/systemd/system/下创建服务启动配置文件: touch elasticsearch.service
配置如下:
[Unit]
Description=elasticsearch Server
[Service]
Type=simple
WorkingDirectory=/opt/elasticsearch
ExecStart=/opt/elasticsearch/bin/elasticsearch -d
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=no
TimeoutSec=1min
LimitNOFILE=65535
LimitMEMLOCK=infinity
User=es
Group=es
[Install]
WantedBy=default.target
执行启动命令:
# 启用修改内容
systemctl daemon-reload
# 开机自启动
systemctl enable elasticsearch.service
# 启动服务
systemctl start elasticsearch.service
# 检查启动状态
systemctl status elasticsearch.service
# 查看失败日志
journalctl -u elasticsearch.service
启动失败提醒:Caused by: java.lang.IllegalArgumentException: unknown setting [cluster.initial_master_modes] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
解决方案:修改配置文件elasticsearch.yml,注释掉cluster.initial_master_modes
3、分词器插件
下载汉语分词器插件:elasticsearch-analysis-ik,注意版本需要与elasticsearch版本一致。
命令行安装:
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-7.10.0.zip
IK分词器有两种分词模式:ik_max_word和ik_smart模式。
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
两种分词器使用的最佳实践是:索引时用ik_max_word,在搜索时用ik_smart。即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。
分词器测试
使用Postman进行分词器测试。
http post: http://localhost:9200/_analyze
http请求头设置:Content-Type:application/json
4、设置用户名密码
在生产环境下,为了保证数据安全性,需要设置用户名及密码。
首先开启配置文件elasticsearch.yml中的安全性设置。
#启用用户验证
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
设置用户密码命令如下,根据提醒,设置每个用户的密码。
elasticsearch-setup-passwords interactive
若需要修改密码,可以通过以下命令设置:
./elasticsearch-reset-password --username 用户名 -i
也可以通过程序接口设置。
通过命令设置参考:
Change passwords API | Elasticsearch Guide [7.10] | Elastic
java修改密码代码如下:
ChangePasswordRequest request = new ChangePasswordRequest(username,password.toCharArray(), RefreshPolicy.IMMEDIATE);
client.security().changePassword(request, RequestOptions.DEFAULT);
5、收尾
elasticsearch的安装配置到此结束,后面用到高级用法会继续补充。另外后续会添加elasticsearch在spring framework中的应用。