目录
系列文章目录
一、首先是我们为什么要用Elasticsearch
二、Elasticsearch的介绍
三、Elasticsearch的原理
四、ES客户端
五、Es客户端的安装
5.1 安装
5.1.1 设置虚拟机内存
5.1.2 创建用户
5.1.3 解压安装包(ES是Java开发的应用,解压即安装: )
5.1.4 配置文件
elasticsearch.yml
jvm.options
5.2 启动与关闭ES
测试
5.3 安装Kibana
5.3.1神马是kibana呢?
5.3.2 下载
5.3.4 启动
编辑
5.3.5 测试
5.4 安装head
5.4.1 安装
5.4.2 测试
六、ES快速入门
6.1index管理
6.1.1 创建index
6.1.2修改index
6.1.3.删除index(可以批量删除)
6.2mapping 管理
6.2.1 创建mapping
6.2.2.查询mapping
6.2.3.更新mapping
6.2.4 添加mapping
6.2.4.删除mapping
6.3.document管理
6.3.1.创建document
6.3.1.1.POST语法
6.3.1.2.PUT语法
6.3.2.查询document
5.3.3.删除Document
6.4.ES读写过程
6.4.1.documnet routing(数据路由)
6.4.4.为什么primary shard数量不可变?
七、Ik分词器
1、安装
编辑 2、自定义词库
注意:必须另存为UTF-8 3、分词模式
7.1.luke查看ES的逻辑结构
总结:
Elasticsearch的简单介绍以及使用
像我们访问网站时候,可以根据我们随意所想的内容输入就可以查询出相关的内容,这些随意的内容是不可能在数据库查出来的,那么为什么这些千奇百怪的 内容都可以查出来呢?
答案就是:Elasticsearch(全文检索服务)。ElasticSearch是一个基于Lucene的全文检索服务器,而lucene采用了词元匹配方案。举个例子:北京天安门----Lucene切分词:北京 天安门 等等这些词元,当我们搜索的时候这些词元都可以检索到北京天安门。
Elasticsearch是一个基于Lucene的搜索服务器。他提供了基于RESTful web接口的分布式全文搜索引擎
ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。根据DB-Engines的排名显示,ElasticSearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基Lucene)。
总结:
1、Elasticsearch是一个基于Lucene的分布式全文搜索服务器
2、Elasticsearch隐藏了Lucene的复杂性,对外提供Restful接口在操作索引、搜索
那么es(es就是Elasticsearch的简称)和 solr应该选那个呢?
1.如果你公司现在用的solr可以满足需求就不要换了。
2.如果你公司准备进行全文检索项目的开发,建议优先考虑elasticsearch,因为像Github这样大规模的搜索都在用它。
正排索引:就和查字典一样,从第一页开始找,直到找到为止(文档---->关键字)
倒排索引:就是查字典通过目录找(通过关键字找文档):
倒排索引表的组成:
term(关键字)
trem----------【关联】------------>document(文档)
document(文档)
分词列表的特点:
1、关键字不重复
2、“的 得 地 a an the” 语气词不参加分词
3、不搜索的filed(域)不参加分词,eg:图片地址
1、TransportClient:8.0后会删除
2、 RestHighLevelVClient:官方推荐
使用ES客户端所需要的依赖
org.elasticsearch.client elasticsearch-rest-high-level-client
ElasticSearch官网:https://www.elastic.co/cn/
从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一个用户。
1).创建elk 用户组
[root@localhost ~]# groupadd elk
2).创建用户admin
[root@localhost ~]# useradd admin
[root@localhost ~]# passwd admin
3).将admin用户添加到elk组
[root@localhost ~]# usermod -G elk admin
4)为用户分配权限
#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
[root@localhost ~]# chown -R admin:elk /usr/upload
[root@localhost ~]# chown -R admin:elk /usr/local
5)切换用户:
[root@localhost ~]# su admin
[admin@localhost ~]# tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
目录结构:
bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。
ES安装目录config中配置文件如下:
elasticsearch.yml:用于配置Elasticsearch运行参数
jvm.options:用于配置Elasticsearch JVM设置
log4j2.properties:用于配置Elasticsearch日志
cluster.name: power_shop #配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name: power_shop_node_1 #节点名,通常一台物理服务器就是一个节点 ,建议指定一个有意义的名称
network.host: 0.0.0.0 # 设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。
http.port: 9200 #设置对外服务的http端口,默认为9200。
transport.tcp.port: 9300 # 集群结点之间通信端口
discovery.zen.ping.unicast.hosts: ["192.168.184.135:9300", "192.168.184.136:9300"] #设置集群中master节点的初始列表。
path.data: /usr/local/elasticsearch-6.2.3/data #设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开
path.logs: /usr/local/elasticsearch-6.2.3/logs #设置日志文件的存储路径,默认是es_home下的logs文件夹http.cors.enabled: true #是否支持跨域,默认为false
http.cors.allow-origin: /.*/ #当设置允许跨域,默认为*,表示支持所有域名
设置最小及最大的JVM堆内存大小:
在jvm.options中设置 -Xms和-Xmx:
1) 两个值设置为相等
2) 将Xmx
设置为不超过物理内存的一半。
默认内存占用太多了,我们调小一些:
-Xms512m
-Xmx512m
1、启动
./elasticsearch
#或
./elasticsearch -d
2.关闭
ps-ef|grep elasticsearch
kill -9 pid
到了这里肯定有小伙伴试着去启动了,是不是启动不了呢?没错肯定启动不了
解决启动问题:
问题一:解决内核问题
我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。不过没关系,我们禁用这个插件即可。 (有的小伙伴用的版本高,不过都是一样的操作)
修改elasticsearch.yml文件,在最下面添加如下配置:
bootstrap.system_call_filter: false
问题二:解决文件创建权限问题
报错信息:
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
inux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。
使用root用户修改配置文件:
su root #切换到root
vim /etc/security/limits.conf
追加下面的内容:
* soft nofile 65536
* hard nofile 65536
问题三:解决线程开启限制问题
报错信息:
[2]: max number of threads [1024] for user [admin] 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
问题三:解决虚拟内存问题
报错信息:
[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 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量
然后执行命令,让sysctl.conf配置生效:
sysctl -p
到了这里肯就可以启动了,测试一下
浏览器访问:http://192.168.204.132:9200 (这个地址写自己虚拟机设置的ip)
Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。
kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)
ElasticSearch官网:https://www.elastic.co/cn/
在window中安装Kibana很方便,解压即安装
5.3.3 修改配置:修改config/kibana.yml配置:
server.port: 5601
server.host: "0.0.0.0" #允许来自远程用户的连接
elasticsearch.url: http://192.168.184.135:9200 #Elasticsearch实例的URL
浏览器访问:http://127.0.0.1:5601
head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。从ES6.0开始,head插件支持使得node.js运行。
1)下载head
下载地址:https://github.com/mobz/elasticsearch-head
2)运行 (cmd窗口)
npm run start
浏览器访问:http://127.0.0.1:9100/
ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。
索引库。包含若干相似结构的 Document 数据,相当于数据库的database。
语法:PUT /index_name(索引库名)
PUT /zz2202
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
}
}
number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力
number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0
效果:
注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。
语法:PUT /index_name/_settings
PUT /java06/_settings
{
"number_of_replicas" : 0
}
注意:index一旦创建,主分片数量不可修改,因为:Get时--->hash(id)%number_of_shards
ES 中对 shard 的分布是有要求的,有其内置的特殊算法:
Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。
DELETE /zz2202[, other_index]
映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程,下边是document和field与关系数据库的概念的类比:
elasticsearch | 关系数据库(mysql) |
---|---|
index(索引库) | database(数据库) |
type(类型) | table(表) |
document(文档) | row(记录) |
field(域) | column(字段) |
注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。
语法:
POST /index_name/type_name/_mapping
| | |
索引库 类型(表) 域(字段)
POST //course/_mapping
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
效果:
查询所有索引的映射:
GET /java06/course/_mapping
映射创建成功可以添加新字段,已有字段不允许更新。
POST /zz2202/user/_mapping
{
"properties": {
"address": {
"type": "text"
}
}
通过删除索引来删除映射。
ES中的文档相当于MySQL数据库表中的记录。
此操作为 ES 自动生成 id 的新增 Document 方式。
语法:
POST /index_name/type_name/id
如:
POST /zz2202/user/3
{
"name": "玉皇大帝 ",
"age": 500,
"sex": "男 "
}
此操作为手工指定 id 的 Document 新增方式。
语法:PUT/index_name/type_name/id{field_name:field_value}
如:
PUT /zz2202/user/3
{
"name": "王母娘娘 ",
"age": 500,
"sex": "女 "
}
结果: 、
{
"_index": "test_index", 新增的 document 在什么 index 中,
"_type": "my_type", 新增的 document 在 index 中的哪一个 type 中。
"_id": "1", 指定的 id 是多少
"_version": 1, document 的版本是多少,版本从 1 开始递增,每次写操作都会+1
"result": "created", 本次操作的结果,created 创建,updated 修改,deleted 删除
"_shards": { 分片信息
"total": 2, 分片数量只提示 primary shard
"successful": 1, 数据 document 一定只存放在 index 中的某一个 primary shard 中
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
通过head查询数据:
语法:
GET /index_name/type_name/id
或
GET /index_name/type_name/_search?q=field_name:field_value
如:根据课程id查询文档
GET /java06/course/1
如:查询所有记录
GET /java06/course/_search
如:查询名称中包括php 关键字的的记录
GET /java06/course/_search?q=name:门
结果:
{
"took": 1, # 执行的时长。单位毫秒
"timed_out": false, # 是否超时
"_shards": { # shard 相关数据
"total": 1, # 总计多少个 shard
"successful": 1, # 成功返回结果的 shard 数量
"skipped": 0,
"failed": 0
},
"hits": { # 搜索结果相关数据
"total": 3, # 总计多少数据,符合搜索条件的数据数量
"max_score": 1, # 最大相关度分数,和搜索条件的匹配度
"hits": [# 具体的搜索结果
{
"_index": "zz2202", # 索引名称
"_type": "user", # 类型名称
"_id": "3", # id 值
"_score": 1, # 匹配度分数,本条数据匹配度分数
"_source": { # 具体的数据内容
"name": "王母娘娘 ",
"age": 500,
"sex": "女 "
}
},
{
"_index": "zz2202",
"_type": "user",
"_id": "1",
"_score": 1,
"_source": {
"name": "小垃圾",
"age": "20",
"sex": "男"
}
},
{
"_index": "zz2202",
"_type": "user",
"_id": "2",
"_score": 1,
"_source": {
"name": "aahja ",
"age": 10,
"sex": "女"
}
}
]
}
}
ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)
语法:
DELETE /index_name/type_name/id
如:
DELETE /java06/course/3
结果:
{
"_index": "zz2202",
"_type": "user",
"_id": "2",
"_version": 11,
"result": "deleted",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"_seq_no": 13,
"_primary_term": 5
}
当客户端创建document的时候,es需要确定这个document放在该index哪个shard上,这个过程就是document routing。
路由过程:
路由算法:shard = hash(5) %number_of_primary_shards
id:document的_id,可能是手动指定,也可能是自动生成,决定一个document在哪个shard上
number_of_primary_shards:主分片数量。
原因:假如我们的集群在初始化的时候有5个primary shard(主片),我们往里边加入一个document id=5,假如hash(5)=23,这时该document 将被加入 (shard=23%5=3)P3这个分片上。如果随后我们给es集群添加一个primary shard ,此时就有6个primary shard,当我们GET id=5 ,这条数据的时候,es会计算该请求的路由信息找到存储他的 primary shard(shard=23%6=5) ,根据计算结果定位到P5分片上。而我们的数据在P3上。所以es集群无法添加primary shard,但是可以扩展replicas shard。
通俗的说:此时你有5个primary shard,你加了一个document 它的id是5,然后会把这个id通过一个hash算法,计算出一个值,然后再和primary shard的数量求余,最终会将加入的document存入计算出来的primary shard里,往出取得时候也是同理,如果加了一个primary shard 那么通过这个算法将取不到值。
下载IK分词器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)
注意:IK分词器插件的版本要和ElasticSearch的版本一致
解压到plug目录下,并重命名为ik
IKAnalyzer.cfg.xml:配置扩展词典和停用词典
main.dic:扩展词典,eg:奥利给
stopword.dic:停用词典,eg:a、an、the、的、地、得
ik_smart:粗粒度,搜索时使用
ik_max_word:细粒度,往索引目录写时使用
拷贝elasticsearch-6.2.3/data到windows
双击luke.bat,启动luke
使用luke打开data\nodes\0\indices路径
测试分词效果:
POST /_analyze
{
"text":"中华人民共和国人民大会堂",
"analyzer":"ik_smart"
}
结果:
本章内容就先到这里,看到这里的小伙伴肯定也有自己的理解,博主就不在这里总结了,下一篇文章继续搞起来!!