首页 > JAVA > 文章正文

全文检索Elasticsearch研究

更新时间:2020-11-05

全文检索Elasticsearch研究

基于虚拟机服务器自主部署ELK服务

学习目标

  1. 了解Elasticsearch的应用场景
  2. 学习基于服务器部署ELK服务
  3. 掌握索引维护的方法
  4. 掌握索引维护的方法
  5. 掌握基本的搜索API的使用方法

约束

需要提前掌握Lucene的索引方法、搜索方法

ELK的介绍和安装

1.简介

​ Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于Restful web接口。Elasticsearch是用java开发的,是当前流行的企业级搜索引擎。能到达到实时搜索,稳定、可靠、快速、安装使用方便。

​ 我们建立一个网站或应用程序,并要添加搜索功能,如果搜索的数量非常多,而且分类繁杂,如果使用传统的数据库想要完成搜索工作的创建失非常困难的。我们希望搜索解决方案要运行速度快,我们希望有一个零配置和完全免费的搜索模式,能够简单的使用JSON通过HTTP来索引数据,而搜索服务器始终可用,并且服务器可以自如扩展,我们一般都会使用全文检索技术,如solr、Elasticsearch等。

2.突出优点

  1. 扩展性好,可部署上百台服务器集群,处理PB级数据
  2. 近实时的去索引数据、搜索数据

3.原理与应用

3.1 索引结构

下图是ElasticSearch的索引结构,下边==黑色部分是物理结构==,上边==黄色部分是逻辑结构==,逻辑结构可以更好的描述ElasticSearch的工作原理及去使用物理结构中的索引文件。

BQJJij.md.png
BQJJij.md.png

逻辑结构部分是一个倒排索引表:

  1. 将要搜索的文档内容分词,所有不重复的词做成分词列表。
  2. 将搜索的文档最终以Document方式存储起来。
  3. 每个词和document都有关联。

3.2 RESTFUL应用方法

ElasticSearch提供RESTFUL Api接口进行索引、搜索、并且支持多种客户端。

下图是ElasticSearch在项目中的应用方式:

BQcykR.md.png
BQcykR.md.png
  1. 用户在前端搜索关键字
  2. 项目前端通过http方式请求项目服务端
  3. 项目服务端通过http RESTful方式请求ES集群进行搜索
  4. ES集群从索引库检索数据

4.ElasticaSearc安装

4.1 安装配置

  1. 安装ElasticaSearc7.9.0
  2. 该版本要求至少jdk1.8以上
  3. 解压elasticsearch-7.9.0-linux-x86_64.tar.gz
    • bin:脚本目录,包括:启动、停止等可执行脚本
    • config:配置文件目录
    • data:索引目录,存放索引文件的地方
    • modules:模板目录,包括了es的功能模块
    • plugins:插件目录,es支持插件机制

4.2 配置文件

ES配置文件的地址根据安装形式的不同而不同:

  1. 使用zip、tar安装,配置文件的地址在安装目录的config下
  2. 使用RPM安装,配置文件在/etc/elasticsearch下
  3. 使用MSI安装,配置文件的地址在安装目录的config下,并且会自动将config目录地址写入环境变量ES_PATH_CONF

4.3 安装

为了模拟真实场景,我们将在linux系统下安装Elasticsearch

4.3.1 新建一个用户gavin

处于安全考虑,Elasticsearch默认不允许以root账号运行

创建用户:

useradd gavin

设置密码:

passwd gavin

切换用户:

su gavin

删除用户:

userdel -r gavin

普通用户增加sudo命令的权限:

vim /etc/sudoers

gavin   ALL=(ALL)       ALL

改变目录及其目录下所有文件的所有者为当前普通用户:

chown -R yourname dirname

4.3.3 解压缩

tar -zxvf elasticsearch-7.9.0-linux-x86_64.tar.gz

4.3.4 目录重命名

mv elasticsearch-7.9.0 elasticsearch

4.3.5 修改配置文件

进入config目录,修改elasticsearch.ymljvm.options

  1. jvm.options

默认配置:

-Xms1g
-Xmx1g

内存占用太多,设置为不超过物理内存的一半:

-Xms512m
-Xmx512m
  1. elasticsearch.yml

修改数据和日志目录

# 数据目录位置
path.data: /home/gavin/elasticsearch/data
# 日志目录位置
path.logs: /home/gavin/elasticsearch/logs

elasticsearch的安装目录默认只有logs目录,没有data目录,需要手动创建:

mkdir data

修改绑定的ip:

# 绑定0.0.0.0 允许任何ip来访问,默认只允许本机访问
network.host: 0.0.0.0

目前我们是学习单机安装,如果要做集群,只需要在这个配置文件中添加节点信息即可。

属性名 说明
cluster.name 配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name 节点名,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
path.conf 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch
path.data 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开
path.logs 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins 设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.memory_lock 设置为true可以锁住ES使用的内存,避免内存进行swap
network.host 设置bind_host和publish_host,设置为0.0.0.0允许外网访问
http.port 设置对外服务的http端口,默认为9200。
transport.tcp.port 集群结点之间通信端口
discovery.zen.ping.timeout 设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些
discovery.zen.minimum_master_nodes 主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2

4.4 运行

进入elasticsearch/bin*目录下,可以看到如下的可执行文件:

然后输入运行命令:

./elasticsearch

4.5 启动报错

4.5.1 JDK版本过低 并且 不支持 root用户启动

解决方案:

1.因为elasticsearch7.9.X内置了jdk,默认是jdk11,但是向下兼容,所以可以不用处理

2.切换到普通用户进行启动,此时需要修改文件目录下所有文件的所有者为当前用户。

chown -R gavin /home/gavin/elasticsearch

4.5.2 集群节点导致启动报错

解决:

vim elasticsearch.yml

ip替换host1等,多节点请添加多个ip地址,单节点可写按默认来
#配置以下三者,最少其一
#[discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes]
cluster.initial_master_nodes: ["node-1"] #这里的node-1为node-name配置的值

启动成功:

可以看到绑定了两个端口:

  • 9200:客户端访问端口
  • 9300:集群节点之间通讯端口

我们在浏览器中访问:http://192.168.15.100:9200/

5.安装kibana

kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱状图、线状图、饼图等。

而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于学习Elasticsearch的语法。

5.1 安装

因为Kibana是依赖于node

查看是否服务器是否安装nodejs

[[email protected] logs]# node -v
v9.3.0

如果没有安装,则安装步骤如下:

1.可以在下载页面https://nodejs.org/en/download/中找到下载地址,然后执行指令

wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz

2.解压缩

xz -d node-v9.3.0-linux-x64.tar.xz
tar -xf node-v9.3.0-linux-x64.tar

3.部署bin文件

根据自己nodejs的实际路径,依次执行下面命令,建立软连接:

ln -s /usr/local/software/node/bin/node /usr/bin/node
ln -s /usr/local/software/node/bin/npm /usr/bin/npm
ln -s /usr/local/software/node/bin/npx /usr/bin/npx

4.测试

node -v
npm -v
npx -v

5.1.1 解压缩kibana

tar -zxvf kibana-7.9.0-linux-x86_64.tar.gz

5.1.2 重命名安装包

mv kibana-7.9.0-linux-x86_64 kibana

5.1.3 修改配置

vim /home/gavin/kibana/config/kibana.yml

elasticsearch.hosts: ["http://192.168.15.100:9200"]

5.2 启动

cd /home/gavin/kibana/bin

./kibana

6.安装ik分析器

Lucene的IK分词器早在2012年就已经没有维护了,现在我们要使用的是在其基础上维护升级的版本,并且开发为ElasticSearch的继承插件了,与ElasticSearch一起维护升级了,版本也保持一致。

6.1 解压缩

unzip elasticsearch-analysis-ik-7.9.0.zip -d /home/gavin/kibana/plugins/ik-analyzer

6.2 重启elasticsearch

加载IK分词器插件、

6.3 测试

在Dev Tools --> console 中输入下面请求:

POST _analyze
{
  "analyzer""ik_max_word",
  "text":     "我是中国人"
}

API

Elasticsearch提供了Rest风格的API,即http请求接口,而且也提供了各种语言的客户端API

文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

1.客户端API

Elasticsearch支持的客户端非常多,如:https://www.elastic.co/guide/en/elasticsearch/client/index.html

点开Java Rest Client后,会有两个:

  • Java Low Level REST Client:是低级别封装,提供一些基础功能,但更灵活
  • Java High Level REST Client:是在Low Level Rest Client基础上进行的高级别封装,功能更丰富和完善,而且API会变得简单

2.如何学习

2.1 操作索引

java王者归来从入门迈向java语言
75元 包邮 (需用券)
去购买 >
Java王者归来 从入门迈向高手 JAVA语言编程从入门发到精通 JAVA编程思想JAVA核心技术 JAVA窗口程序设计绘图与动画网络程序设计书 -->
相关文章
相关标签