目录
1、ES介绍
什么是ES
2、ES原理
3、ES客户端
3.1.环境需求:
3.2.配置文件:
3.3.常规配置:
3.4.安装步骤
4、ES入门
4.1、index管理
4.2、mapping管理
4.3、document管理
5、ik分词器
5.1、安装
5.2、自定义词库
5.3、分词模式
6、field详细介绍
6.1、field数据类型
6.2、field的属性
type:
analyzer:
index:
source:
6.3、常用field类型
6.3.1、text文本字段
6.3.2、keyword关键字字段
6.3.3、date日期类型
6.3.4、Numeric类型
6.4、field属性的设置标注
全文检索服务 ElasticSearch其他相关:详尽版
1、ES介绍
什么是ES
ElasticSearch是用Java语言开发的,是一个基于Lucene的搜索服务器。对外提供restful接口。
2.ES原理
正排索引:查字典从第一页开始找,直到找到为止(文档---->关键字)
倒排索引:查字典时从目录找(关键字---->文档)
倒排索引表的组成:
term
trem------------------------>document
document
分词列表的特点:1.不重复 2.“的 地 得 a an the”语气词不参加分词 3.不搜索的filed不参加分词,eg:图片地址
3、ES客户端
3.1.环境需求:
1、jdk必须是jdk1.8.0_131以上版本。
2、ElasticSearch 需要至少4096 的线程池、65536个文件创建权限和 262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存
3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动
4、Elasticsearch的插件要求至少centos的内核要3.5以上版本
3.2.配置文件:
ES安装目录config中配置文件如下:
elasticsearch.yml:用于配置Elasticsearch运行参数
jvm.options:用于配置Elasticsearch JVM设置
log4j2.properties:用于配置Elasticsearch日志
3.3.常规配置:
cluster.name:
配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name:
节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。
path.data:
设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开。
path.logs:
设置日志文件的存储路径,默认是es_home下的logs文件夹
network.host:
设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。
http.port: 9200
设置对外服务的http端口,默认为9200。
transport.tcp.port: 9300
集群结点之间通信端口
discovery.zen.ping.unicast.hosts:[“host1:port”, “host2:port”, “…”]
设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s
设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
http.cors.enabled:
是否支持跨域,默认为false
http.cors.allow-origin:
当设置允许跨域,默认为*,表示支持所有域名
3.4.安装步骤
安装:
1、设置虚拟机内存>1.5
2、创建admin账户,不允许采用root帐号启动。
命令:
groupadd elk
usermod -G elk admin
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local
su admin
3、解压安装包
tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
4、修改配置文件:
elasticsearch.yml
cluster.name: power_shop
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.216.137:9300", "192.168.2.138:9300"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
jvm.options:
设置最小及最大的JVM堆内存大小:
在jvm.options中设置 -Xms和-Xmx:
1) 两个值设置为相等
2) 将Xmx
设置为不超过物理内存的一半。
默认内存占用太多了,我们调小一些:
-Xms512m
-Xmx512m
5、修改文件创建权限
错误信息:
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。
使用root用户修改配置文件:
su root
vim /etc/security/limits.conf:
* soft nofile 65536
* hard nofile 65536
6、修改线程开启限制
错误信息:
[2]: max number of threads [3795] for user [es] is too low, increase to at least [4096]
默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024 个线程。必须修改限制数为4096+。因为 ES 至少需要 4096 的线程池预备。
如果虚拟机的内存是 1G,最多只能开启 3000+个线程数。至少为虚拟机分配 1.5G 以上的内存。
使用root用户修改配置:
su root
vim /etc/security/limits.conf:
* soft nproc 4096
* hard nproc 4096
7、修改虚拟内存
错误信息:
[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存。
su root vim /etc/sysctl.conf: vm.max_map_count=655360 sysctl -p
启动和关闭:
启动:
./elasticsearch
#或
./elasticsearch -d
关闭:
. ps-ef|grep elasticsearch
kill -9 pid
4.ES入门
4.1、index管理
创建index
PUT /java2202
{
"settings":{
"number_of_shards":2,
"number_of_replicas":0
}
}
注意:一台服务器时,备份分片的数量必须设置为0,因为主备在同一台上没有意义
删除index
DELETE /Java2202
修改index
PUT /java2202/_settings
{
"number_of_replicas":0
}
注意:index一旦创建,主分片数量不可修改,因为:查找时查找到的主片序号跟存入的序号无法对应上。Get时--->hash(id)%number_of_shards
4.2、mapping管理
创建mapping:
POST /Java2201/course/_mapping
{
"properties":{
"name":{
type:"text"
},
"description":{
type:"text"
}
}
}
4.3、document管理
创建document:
POST /java2202/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"studymodel":"201002"
}
修改document:
PUT /java2202/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"studymodel":"201002"
}
查询document:
GET /Java2202/course/1
删除document:
DELETE /java2202/course/1
5、ik分词器
5.1、安装
解压到plug目录下,并重命名为ik
5.2、自定义词库
IKAnalyzer.cfg.xml:配置扩展词典和停用词典
main.dic:扩展词典,eg:奥利给
stopword.dic:停用词典,eg:a、an、the、的、地、得
注意:必须另存为UTF-8
5.3、分词模式
ik分词器有两种分词模式:ik_max_word和ik_smart模式。
ik_smart:粗粒度,搜索时使用
ik_max_word:细粒度,往索引目录写时使用
6、field详细介绍
6.1、field数据类型
常用:
文本:text、keyword(往索引目录写不进行分词)
数字:integer、long、float、double
6. 2、field的属性
type:
数据类型,通过type属性指定field的类型。如:text、long
"name":{
"type":"text"
}
analyzer:
往索引目录写或搜索时的分词模式,如:analyzer=ik_max_word,analyzer=ik_smart
"name": {
"type": "text",
"analyzer":"ik_max_word",#生成索引目录时
"search_analyzer":"ik_smart"#检索时
}
index:
是否往索引目录写,默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到
"pic": {
"type":"text",
"index":false
}
source:
document中是否存储,如:includes,excludes
POST /java/course/_mapping
{
"_source": {
"includes":["description"]
}
}
同样,可以通过excludes参数排除某些字段:
POST /java/course/_mapping
{
"_source": {
"excludes":["description"]
}
}
6.3、常用field类型
6.3.1、text文本字段
创建新映射:
POST /java/course/_mapping
{
"_source": {
"includes":["description"] #document中存储description
}
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word", #生成索引目录时 精细
"search_analyzer":"ik_smart" #检索时 粗略
},
"description": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik插入文档: _smart"
},
"pic":{
"type":"text", #数据类型
"index":false #不写入索引目录
}
}
}
插入文档:
POST /java/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"pic":"250.jpg"
}
查询:
GET /java/course/_search?q=name:放弃
GET /java/course/_search?q=description:人生
GET /java/course/_search?q=pic:250.jpg
结果:name和description都支持全文检索,pic不可作为查询条件
6.3.2、keyword关键字字段
往索引目录写时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等
更改映射:
POST /java/course/_mapping
{
"properties": {
"studymodel":{
"type":"keyword"
}
}
}
插入文档:
PUT /java/course/2
{
"name": "java编程基础",
"description": "java语言是世界第一编程语言",
"pic":"250.jpg",
"studymodel": "2010年01月"
}
根据name查询文档:
GET /java/course/_search?q=studymodel:2010年01月
name是keyword类型,所以查询方式是精确查询。
6.3.3、date日期类型
详见:
全文检索服务 ElasticSearch---------Field
6.3.4、Numeric类型
详见:
全文检索服务 ElasticSearch---------Field
6.4、field属性的设置标注
属性 | 标准 |
type | 分词是否有意义 |
index | 是否搜索,默认为true |
source | 是否展示,默认为展示 |
7、集群健康状态
status:用三种颜色来展示健康状态
绿色:正常
红色:部分主分片不可用
黄色:部分备份分片不可用