1.1、ElasticSearch(ES):
用Java开发是当前最流行的开源的企业级搜索引擎。实时,稳定,可靠,快速,安装使用方便。
1.2、ES与Lucene的关系
Lucene被认为是迄今为止最先进、性能最好、功能最全的搜索引擎(框架)。
缺点:
只能在Java项目使用,且以jar的方式集成
使用非常复杂
不支持集群环境
1.3、ES和Solr比较
对已有数据进行搜索时,Solr更快。当实时建立索引时,Solr会产生io阻塞
对比:
Solr利用zookeeper分布式管理,ES自身带有分布式协调管理
Solr支持格式更多,JSON/XML/CSV; ES仅支持JSON
Solr传统搜索表现好,ES在实时搜索表现好
1.4、ES vs 关系型数据库
2、Lucene全文检索框架
2.1、全文检索:
通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数;用户查询时,通过之前建好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本位置,所以就可以将具体内容读取出来了。
2.2、分词原理之倒排索引
分词(记录单词和位置)---去重(合并整理单词和位置集合)---排序(单词排序)
3、Elasticsearch核心概念
3.1、索引index
拥有几分相似特征的文档的集合
一个索引由一个名字来标识
3.2、映射mapping
用来定义一个文档
3.3、字段Field
相当于数据表的字段
3.4、字段类型Type
字段类型:Text、Keyword、Byte等
3.5 、文档document
类似一条记录,一个可被索引的基础信息单元。文档以JSON格式表示
3.6、集群cluster
由一个或多个节点组成
3.7、节点node
集群的一部分,存储数据,参与集群的索引和搜索
4、安装Elasticsearch
4.1创建用户组、用户、设置sudo权限
# 添加用户组,添加用户,设置密码
groupadd elasticsearch
useradd elastic
passwd elastic
# 切换用户为elastic,创建es目录
mkdir -p /usr/local/es
# 切换用户为root,将elastic用户添加到用户组
usermod -G elasticsearch elastic
chown -R elastic /usr/local/es
# 设置sudo权限
visudo
# 找到root用户权限,添加elastic用户权限
elastic ALL=(ALL) ALL
4.2安装配置elasticsearch7.6.1
es安装包地址:
https://download.csdn.net/download/David_bdqn/20268029
# 切换为elastic用户,上传elasticsearch7.6.1安装包,并解压
cd /usr/local/es
# 上传安装包es
tar -zxvf elasticsearch-7.6.1‐linux‐x86_64.tar.gz
配置,对应的discovery.seed_hosts改为自己服务器的ip
# 创建文件夹log,data
cd /usr/local/es/elasticsearch-7.6.1
mkdir {log,data}
# 配置elasticsearch.yml
cd config
rm -rf elasticsearch.yml
vim elasticsearch.yml
# 内容如下
cluster.name: es-yun
node.name: node1
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["172.16.227.201"]
cluster.initial_master_nodes: ["node1"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow‐origin: "*"
调整jvm参数,根据服务器配置相应调整,本次设置为1G
vim jvm.options
-Xms1g
-Xmx1g
4.3修改系统配置
由于现在使用普通用户安装es服务,es服务队服务器的资源要求比较多,包括内存大小、线程数等。所以需要解开资源束缚
4.3.1文件最大数限制
不改,可能出现错误:
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
sudo vim /etc/security/limits.conf
# 添加如下内容,包括*
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
4.3.2普通用户启动线程数限制
不改,可能出现错误:
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
sudo vim /etc/security/limits.d/20‐nproc.conf
# 原先为1024,改为4096
soft nproc 4096
4.3.3普通用户最大虚拟内存
不改,可能出现错误:
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
sudo vim /etc/sysctl.conf
# 追加以下内容
vm.max_map_count=262144
# 执行下面命令,生效
sudo sysctl -p
全部修改完毕,退出客户端重新连接xshell生效
4.4启动ES服务
cd /usr/local/es/elasticsearch-7.6.1
# 启动
nohup bin/elasticsearch 2>&1 &
登录:http://172.16.227.201:9200/?pretty,页面如下
5、客户端Kibana安装
客户端分为图形界面客户端和代码客户端
ES主流客户端Kibana,开放9200端口与图形界面客户端交互
cd /usr/local/es
# 上传安装包kibana-7.6.1-linux-x86_64.tar.gz,解压
tar -zxvf kibana-7.6.1-linux-x86_64.tar.gz
# 重命名
mv kibana-7.6.1-linux-86_64 kibana-76.1
cd kibana-7.6.1/config
# 修改配置文件
vim kibana.yml
# 内容如下:
server.port: 5601
server.host: "服务器IP"
elasticsearch.hosts: ["http://IP:9200"] #这里是elasticsearch的访问地址
启动:
nohup bin/kibana 2>&1 &
访问:http://172.16.227.201:5601/app/kibana,页面如下
6、安装IK分词器
后续使用ES来进行中文分词,所以需要单独给ES安装IK分词器
cd /usr/local/es/elasticsearch-7.6.1/plugins
# 创建目录
mkdir ik
# 上传分词器,并解压
unzip elasticsearch-ik-7.6.1.zip
# 重启ES
ES集群搭建,启动三个es节点,访问时只显示一个master。
解决方案:进入节点2、3的elasticsearch-7.6.1/data目录,删除nodes文件,重启2、3节点es即可。
7、基本操作
在kibana控制台console运行
7.1、创建索引
PUT /es_db
7.2、查询索引
GET /es_db
7.3、删除索引
DELETE /es_db
7.4、添加/修改文档
PUT /es_db/_doc/1
{
"name":"张三",
"sex":1,
"age":25,
"address":"广州天河公园",
"remark":"java developer"
}
7.5、查询文档
格式:GET /索引名称/类型/id GET /es_db/_doc/1
7.6、删除 DELETE /es_db/_doc/1
8、查询操作
8.1、查询当前类型中的所有文档 _search
GET /es_db/_doc/_search
类似:select * from student
8.2、条件查询,age=28,_search?q=*:***
GET /es_db/_doc/_search?q=age:28
类似:select * from student where age = 28
8.3、范围查询,age 在[20,26]之间的,_search?q=***[** TO **]
GET /es_db/_doc/_search?q=age[20 TO 26]
类似:select * from student where age between 20 and 26
8.4、多个id批量查,_mget
GET /es_db/_doc/_mget
{
"ids":["1","2"]
}
类似:select * from student where id in (1,2)
8.5、小于等于、大于的,<=、> ,_search?q=age:<=26
GET /es_db/_doc/_search?q=age:>20
8.6、分页查询 from*&size=* 类似 limit
GET /es_db/_doc/_search?q=age:<26&from0&size=10
8.7、对查询结果只输出某些字段,_source=字段,字段
GET /es_db/_doc/_search?_source=name,age
类似:select name,age from student
8.8、对查询结果排序,sort=字段:desc/asc
GET /es_db/_doc/_search?sort=age:desc
类似:select * from student order by age desc
索引重命名
POST _reindex
{
"source": {
"index": "old_name"
},
"dest": {
"index": "new_name"
}
}