文章目录
简介与环境搭建
全文检索
全文检索是通过对文本进行全面索引和搜索的技术。
- 首先对文本进行分词、去除停用词等。
- 对处理后的数据建立倒排索引。索引会记录每个单词在文本中的位置信息与其他元数据信息,比如词频、权重等
- 发起搜索请求时,搜索引擎根据搜索的关键词或短语,在建立好的索引中查找匹配文档
倒排索引
正排索引Forward index 和 倒排索引Inverted index是全文检索中常用的两种索引结构
-
正排索引
将文档按顺序排列并进行编号,在正排索引中,可以根据文档编号或其他属性快速定位和访问文档的内容。
-
倒排索引
根据单词或短语建立的索引结构。倒排索引建立的过程是先对文档进行分词处理,然后记录每个单词在哪个文档中出现,以及出现的位置。然后就可以根据关键词快速定位到包含这些词的文档,并确定他们的相关性
倒排索引适用于在大规模文本数据中进行关键词搜索和相关性排序的场景
我们在创建文章时,创建一个关键词与文章的对应关系就称为倒排索引,如下所示
关键词 | 文章ID | 是否命中索引 |
---|---|---|
Java | 1,2 | √ |
设计模式 | 1,2,3,4 | √ |
多线程 | 2 | |
JavaScript | 4 |
ElasticSearch
本文使用的ElasticSearch版本是7.17.3
开源的分布式搜索和数据费分析引擎,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。
以下是一些 Elasticsearch 的特点和优势:
- 分布式架构:Elasticsearch 是一个分布式系统,可以轻松地水平扩展,处理大规模的数据集和高并发的查询请求。
- 全文检索功能:Elasticsearch 提供了强大的全文检索功能,包括分词、词项查询、模糊匹配、多字段搜索等,并支持丰富的查询语法和过滤器。
- 多语言支持:Elasticsearch 支持多种语言的分词器和语言处理器,可以很好地处理不同语言的文本数据。
- 高性能:Elasticsearch 使用倒排索引和缓存等技术,具有快速的搜索速度和高效的查询性能。
- 实时性:Elasticsearch 支持实时索引和搜索,可以几乎实时地将文档添加到索引中,并立即可见。
- 易用性:Elasticsearch 提供了简单易用的 RESTful API,方便进行索引管理、查询操作和数据分析。
官方网站: https://www.elastic.co/
**下载地址:**https://www.elastic.co/cn/downloads/past-releases#elasticsearch
应用场景
只要用到搜索的场景,ES几乎都可以是最好的选择。结合Kibana、Logstash、Beats,Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。
- 搜索引擎
- 站内搜索
- 日志管理与分析
- 大数据分析
技术选型
Elasticsearch | Solr | MongoDB | MySQL | |
---|---|---|---|---|
DB类型 | 搜索引擎 | 搜索引擎 | 文档数据库 | 关系型数据库 |
基于何种框架开发 | Lucene | Lucene | ||
基于何种开发语言 | Java | Java | C++ | C、C++ |
数据结构 | FST、Hash等 | B+ Trees | ||
数据格式 | Json | Json/XML/CSV | Json | Row |
分布式支持 | 原生支持 | 支持 | 原生支持 | 不支持 |
数据分区方案 | 分片 | 分片 | 分片 | 分库分表 |
业务系统类型 | OLAP | OLAP | OLTP | OLTP |
事务支持 | 不支持 | 不支持 | 多文档ACID事务 | 支持 |
数据量级 | PB级 | TB级~PB级 | PB级 | 单库3000万 |
一致性策略 | 最终一致性 | 最终一致性 | 最终一致性即时一致性 | 即时一致性 |
擅长领域 | 海量数据全文检索大数据聚合分析 | 大数据全文检索 | 海量数据CRUD | 强一致性ACID事务 |
劣势 | 不支持事务写入实时性低 | 海量数据的性能不如ES随着数据量的不断增大,稳定性低于ES | 弱事务,不支持join查询 | 大数据全文搜索性能低 |
查询性能 | ★★★★★ | ★★★★ | ★★★★★ | ★★★ |
写入性能 | ★★ | ★★ | ★★★★ | ★★★ |
Windows安装ES
下载
下载地址页面,选择版本:7.17.3
ElasticSearch文件目录结构
目录 | 描述 |
---|---|
bin | 脚本文件,包括启动elasticsearch,安装插件,运行统计数据等 |
config | 配置文件目录,如elasticsearch配置、角色配置、jvm配置等。 |
jdk | 7.x 以后特有,自带的 java 环境,8.x版本自带 jdk 17 |
data | 默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改。 |
lib | elasticsearch依赖的Java类库 |
logs | 默认的日志文件存储路径,生产环境需要修改。 |
modules | 包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。 |
plugins | 已安装插件目录 |
配置JDK环境
-
运行Elasticsearch,需安装并配置JDK。各个版本对Java的依赖 https://www.elastic.co/support/matrix#matrix_jvm
-
- Elasticsearch 5需要Java 8以上的版本
- Elasticsearch 从6.5开始支持Java 11
- 7.0开始,内置了Java环境。ES的JDK环境变量生效的优先级配置顺序ES_JAVA_HOME > JAVA_HOME > ES_HOME
- ES_JAVA_HOME:这个环境变量用于指定Elasticsearch使用的Java运行时环境的路径。在启动Elasticsearch时,它会检查ES_JAVA_HOME环境变量并使用其中的Java路径。
- ES_HOME:这个环境变量指定Elasticsearch的安装路径。它用于定位Elasticsearch的配置文件、插件和其他相关资源。设置ES_HOME环境变量可以让您在命令行中更方便地访问Elasticsearch的目录结构和文件。
可以参考es的环境文件elasticsearch-env.bat
windows下,设置ES_JAVA_HOME
和ES_HOME
的环境变量
启动ES服务
进入bin目录,直接运行elasticsearch.bat
测试,浏览器中访问:http://localhost:9200/
centos7安装ES
下载ElasticSearch
bash
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-linux-x86_64.tar.gz
创建es用户
es默认不能用root用户启动,生产环境建议为elasticsearch创建用户。
bash
#为elaticsearch创建用户并赋予相应权限
[root@localhost ~]# useradd es
[root@localhost ~]# passwd es
Changing password for user es.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz -C /home/es
[root@localhost ~]# chown -R es:es /home/es/elasticsearch-7.17.3
# 切换用户
[root@localhost ~]# su - es
给用户授予sudo权限:
bash
[root@VM-8-7-centos tmp]# visudo
# 执行上面的命令 其实修改的是/etc/sudoers文件
# 允许某个用户,在那一台计算机ip上,执行某个命令
# 用户名 被管理员主机的地址=(可使用的身份) 授权命令(绝对路径)
root ALL=(ALL) ALL
lzj ALL=(ALL) ALL
# 给普通用户sc授予一个能够重启服务器的命令
sc ALL=/sbin/shutdown -r now
# %组名 被管理员主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
# 查看该普通用户,可用的所有sudo命令
[sc@VM-8-7-centos tmp]$ sudo -l
配置JDK环境
bash
[es@localhost ~]$ vim .bash_profile
export ES_JAVA_HOME=/home/es/elasticsearch-7.17.3/jdk/
export ES_HOME=/home/es/elasticsearch-7.17.3
[es@localhost ~]$ source .bash_profile
配置ElasticSearch
修改elasticsearch.yml配置
bash
[es@localhost elasticsearch-7.17.3]$ vim config/elasticsearch.yml
#开启远程访问
network.host: 0.0.0.0
#单节点模式 初学者建议设置为此模式
discovery.type: single-node
# 生产环境下强烈建议 path.data 和 path.logs 部署到另外的目录下
ElasticSearch配置参数
参考: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/important-settings.html
当前节点所属集群名称,多个节点如果要组成同一个集群,那么集群名称一定要配置成相同。默认值elasticsearch,生产环境建议根据ES集群的使用目的修改成合适的名字。不要在不同的环境中重用相同的集群名称,否则,节点可能会加入错误的集群。
当前节点名称,默认值当前节点部署所在机器的主机名,所以如果一台机器上要起多个ES节点的话,需要通过配置该属性明确指定不同的节点名称。
- path.data
配置数据存储目录,比如索引数据等,默认值 $ES_HOME/data,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。
- path.logs
配置日志存储目录,比如运行日志和集群健康信息等,默认值 $ES_HOME/logs,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。
- bootstrap.memory_lock
配置ES启动时是否进行内存锁定检查,默认值true。
ES对于内存的需求比较大,一般生产环境建议配置大内存,如果内存不足,容易导致内存交换到磁盘,严重影响ES的性能。所以默认启动时进行相应大小内存的锁定,如果无法锁定则会启动失败。
非生产环境可能机器内存本身就很小,能够供给ES使用的就更小,如果该参数配置为true的话很可能导致无法锁定内存以致ES无法成功启动,此时可以修改为false。
- network.host
节点对外提供服务的地址以及集群内通信的ip地址,默认值为当前节点所在机器的本机回环地址127.0.0.1 和[::1],这就导致默认情况下只能通过当前节点所在主机访问当前节点。
- http.port
配置当前ES节点对外提供服务的http端口,默认 9200
- transport.port:
节点通信端口号,默认 9300
- discovery.seed_hosts
配置参与集群节点发现过程的主机列表,说白一点就是集群中所有节点所在的主机列表,可以是具体的IP地址,也可以是可解析的域名。
- cluster.initial_master_nodes
配置ES集群初始化时参与master选举的节点名称列表,必须与node.name配置的一致。ES集群首次构建完成后,应该将集群中所有节点的配置文件中的cluster.initial_master_nodes配置项移除,重启集群或者将新节点加入某个已存在的集群时切记不要设置该配置项。
配置JVM参数
ES比较耗内存,建议虚拟机4G或以上内存,jvm1g以上的内存分配
修改config/jvm.options配置文件,调整jvm堆内存大小
bash
-Xms2g
-Xmx2g
配置的建议
- Xms和Xms设置成---样
- Xmx不要超过机器内存的50%
- 不要超过30GB - https://www.elastic.co/cn/blog/a-heap-of-trouble
启动ElasticSearch服务
ES不允许使用root账号启动服务,如果你当前账号是root,则需要创建一个专有账户
bash
#非root用户启动,我们可以先前台启动 方便查看启动报错日志
bin/elasticsearch
# -d 后台启动
bin/elasticsearch -d
控制台一直报错
但还是能,正常访问
常见启动报错
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开文件最大数目的限制,不然ES启动就会抛错
bash
#切换到root用户
[root@localhost ~]# vim /etc/security/limits.conf
# shfit+G跳转到最后一行 末尾添加如下配置:
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
bash
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
最大虚拟内存太小,调大系统的虚拟内存
bash
[root@localhost ~]# vim /etc/sysctl.conf
# shfit+G跳转到最后一行 追加以下内容:
vm.max_map_count=262144
# 保存退出之后执行如下命令:
[root@localhost ~]# sysctl -p
max number of threads [1024] for user [es] is too low, increase to at least [4096]
无法创建本地线程问题,用户最大可创建线程数太小
bash
vim /etc/security/limits.d/20-nproc.conf
改为如下配置:
* soft nproc 4096
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
缺少默认配置,至少需要配置discovery.seed_hosts/discovery.seed_providers、discovery.seed_providers、cluster.initial_master_nodes中的一个参数.
- discovery.seed_hosts: 集群主机列表
- discovery.seed_providers: 基于配置文件配置集群主机列表
- cluster.initial_master_nodes: 启动时初始化的参与选主的node,生产环境必填
bash
vim config/elasticsearch.yml
#添加配置
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
#或者指定配置单节点(集群单节点)
discovery.type: single-node
客户端Kibana安装
Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。
参考文档:https://www.elastic.co/guide/en/kibana/7.17/get-started.html
下载
下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana
选择版本:7.17.3
bash
#windows
https://artifacts.elastic.co/downloads/kibana/kibana-7.17.3-windows-x86_64.zip
#linux
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.3-linux-x86_64.tar.gz
修改Kibana.yml
bash
vim config/kibana.yml
server.port: 5601 #指定Kibana服务器监听的端口号
server.host: "localhost" #指定Kibana服务器绑定的主机地址
elasticsearch.hosts: ["http://localhost:9200"] #指定Kibana连接到的Elasticsearch实例的访问地址
i18n.locale: "zh-CN" #将 Kibana 的界面语言设置为简体中文
运行Kibana
windows
直接执行kibana.bat
Linux
注意:kibana也需要非root用户启动
bash
bin/kibana
#后台启动
nohup bin/kibana &
#查询kibana进程
netstat -tunlp | grep 5601
访问
访问Kibana: http://localhost:5601/app/dev_tools#/console
cat API
cat API 是 Elasticsearch 提供的一个用于查看和显示集群信息的 RESTful API。它可以用于获取关于索引、节点、分片、健康状态等各种集群相关的信息。
bash
/_cat/allocation #查看单节点的shard分配整体情况
/_cat/shards #查看各shard的详细情况
/_cat/shards/{index} #查看指定分片的详细情况
/_cat/master #查看master节点信息
/_cat/nodes #查看所有节点信息
/_cat/indices #查看集群中所有index的详细信息
/_cat/indices/{index} #查看集群中指定index的详细信息
/_cat/segments #查看各index的segment详细信息,包括segment名, 所属shard, 内存(磁盘)占用大小, 是否刷盘
/_cat/segments/{index}#查看指定index的segment详细信息
/_cat/count #查看当前集群的doc数量
/_cat/count/{index} #查看指定索引的doc数量
/_cat/recovery #查看集群内每个shard的recovery过程.调整replica。
/_cat/recovery/{index}#查看指定索引shard的recovery过程
/_cat/health #查看集群当前状态:红、黄、绿
/_cat/pending_tasks #查看当前集群的pending task
/_cat/aliases #查看集群中所有alias信息,路由配置等
/_cat/aliases/{alias} #查看指定索引的alias信息
/_cat/thread_pool #查看集群各节点内部不同类型的threadpool的统计信息,
/_cat/plugins #查看集群各个节点上的plugin信息
/_cat/fielddata #查看当前集群各个节点的fielddata内存使用情况
/_cat/fielddata/{fields} #查看指定field的内存使用情况,里面传field属性对应的值
/_cat/nodeattrs #查看单节点的自定义属性
/_cat/repositories #输出集群中注册快照存储库
/_cat/templates #输出当前正在存在的模板信息
ES安装分词插件
在线安装analysis-icu分词插件
bash
#查看已安装插件
$ES_HOME/bin/elasticsearch-plugin list
#安装插件
$ES_HOME/bin/elasticsearch-plugin install analysis-icu
#删除插件
$ES_HOME/bin/elasticsearch-plugin remove analysis-icu
注意:安装和删除完插件后,需要重启ES服务才能生效。
同时,在$ES_HOME/plugins
目录下就有我们刚刚安装的分词插件了
离线安装ik中文分词插件
本地下载elasticsearch-analysis-ik-7.17.3.zip插件,解压,然后手动上传到elasticsearch的plugins目录,然后重启ES实例就可以了。
ik中文分词插件:https://github.com/medcl/elasticsearch-analysis-ik
测试分词效果
bash
#ES的默认分词设置是standard,会单字拆分
POST _analyze
{
"analyzer":"standard",
"text":"中华人民共和国"
}
# _analyzer API可以用来查看指定分词器的分词结果
POST _analyze
{
"analyzer":"icu_analyzer",
"text":"中华人民共和国"
}
#ik_smart:会做最粗粒度的拆
POST _analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
#ik_max_word:会将文本做最细粒度的拆分
POST _analyze
{
"analyzer":"ik_max_word",
"text":"中华人民共和国"
}