Elastic Search
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
一、安装
- 上官网下载最新版本的Elastic Search的tar.gz包,解压。
- es有一个安全性的规则,不能使用root用户启动它,所以我们要先创建一个属于es的用户组,在其下创建一个用户
groupadd esg
useradd -g esg eshui
passwd esg
New passwd: xxxxx
Repeat passd: xxxxx
为了以后操作的方便,最好直接把eshui的权限修改为root权限(修改/etc/sudoers)
- 用eshui重新登陆,进入es的解压目录,执行 ./bin/elasticsearch即可运行
- 用 curl 127.0.0.1:9200 命令访问es的默认端口,如果返回一串json,则启动成功。
二、修改配置文件以及修改limit
- 修改./conf/elasticsearch.yml,作如下修改
network.host: 192.168.246.128 #这里是自己主机的IP地址
http.port: 9200
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
- elasticsearch启动需要对centos下的一些limit进行修改 sudo vi /etc/security/limits.conf
# the end
eshui soft nofile 65535
eshui hard nofile 65536
eshui soft nproc 4096
eshui hard nproc 4096
- sudo vi /etc/security/limits.d/20-nproc.conf
# 把 * 改成eshui
eshui soft nproc 4096
- sudo vi /etc/sysctl.conf
#添加如下配置,让虚拟内存最大为655360字节
vm.max_map_count=655360
完成上述配置后,重新登陆bash,即可成功启动elasticsearch
三、ElasticSearch的Head插件,管理ES集群
Head插件是一个管理ES的客户端程序,安装他之前,需要安装grunt。通常使用npm安装,所以在linux环境下,先安装npm,自行在网上查找安装方法。
- 安装grunt
npm install -g grunt-cli
- 使用git clone将elasticsearch-head的源码克隆下来。
git clone git://github.com/monbz/elasticsearch-head.git
-
clone之后,进入主目录,执行cnpm install ,安装该es head项目所需要的插件。(最好安装cnpm,确保不被墙 npm install -g cnpm)
-
修改elasticsearch-head下的Gruntfile.js中的connect.->server->options, 在其中增加一项,
hostname: '*',
-
修改elasticsearch-head/_site下的app.js中的this.baseurl下的localhost:9200改成实际elasticsearch的ip地址。
-
允许跨越访问,修改elasticsearch/config/elasticsearch.yml。 增加以下两项。
http.cors.enabled: true
http.cors.allow-origin: "*"
-
先启动 Elastic Search
-
进入elasticsearch-head下的node_modules/grunt/bin,执行
./grunt server
开启es head。默认是9100端口。 -
用浏览器访问9100端口,即可以看到elasticsearch的管理界面, 如下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kjqOmkd-1585125850571)(https://t1.picb.cc/uploads/2019/10/13/gsy9ZT.md.png)]
四、安装ElasticSearch的图形化管理工具Kibana
Kibana是Elastic Search的web界面管理工具,提供可视化的es管理界面,非常人性化。
- 首先在网上下载kibana的tar包,解压
- 修改
config/kibana.yml
中的server.host为本机的ip地址。 - 将数组
elasticsearch-hosts
内部的localhost改为elasticsearch的ip地址+端口。 - 首先启动elastic-search。
- 启动kibana,./bin/kibana。
- 浏览器访问,ip:5601, 即可访问到kibana的控制台。默认端口是5601,如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2D72rEcD-1585125850572)(https://t1.picb.cc/uploads/2019/10/22/gDfA2s.md.png)]
五、ES的索引
5.1. 倒排索引
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVqFuO1y-1585125850573)(https://t1.picb.cc/uploads/2019/11/06/gY54eD.md.png)]
倒排索引保存了每个单词在文档中的存在情况。如果现在有一个需求,找到所有含有单词quick
的文档。如果是一般的写法,需要将所有文档遍历一遍。如果有倒排索引的存在,就可以直接找到含有quick
的文档。
在倒排索引中,key是每个单词,而value是含有这个单词的所有文档的序号。
在elastic search中,会把倒排索引的key进行处理,比如dogs和dog其实是同一个意思,Quick和quick其实是同一个意思。
5.2. 分词器介绍内置分词器
分词器包括三部分:
- character filter:分词之前的预处理,过滤掉HTML标签特殊符号等。
- tokenizer:分词。
- token filter:标准化。
es内置分词器:
- standard分词器:大写转小写,去除停用词,中文的话就是单个字分词。
- simple分词器:过滤掉数字,以非字母字符来分割信息,然后将词汇单元转化成小写形式。
- Whitepace分词器:仅仅根据空格分词。
- language分词器:特定语言分词器。
5.3. 安装中文分词器
为ES安装中文分词器插件,首先使用git clone将中文分词器的代码拉下来
git clone git@github.com:medcl/elasticsearch-analysis-ik.git
然后使用maven编译源码
mvn clean install -Dmaven.skip.test=true
之后target文件夹下会生成一个releases文件夹,里面有一个elasticsearch-analysis-ik的zip压缩包。将该压缩包拷贝到elasticsearch/plugins/ik
下,ik文件夹需要自己创建。解压缩后,将原压缩包删除。中文分词器插件配置完毕。
六、ES的基本使用(CURD)
6.1. 基本操作
下面是在Kibana中开发者工具里执行的demo,描述了文档的一般增删查改。
{
"query": {
"match_all": {}
}
}
# 添加索引lib,分片数是3,备份数是0。
# 这里类似于Kafka的配置,Kafka也有分区和备份数,和这里是一致的
PUT /lib/
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
}
# 添加一个默认索引
PUT lib2
# 获取索引配置
GET /lib/_settings
GET /lib2/_settings
# 获取所有索引配置
GET _all/_settings
#指定id添加文档
PUT /lib/user/1
{
"first_name":"曹",
"last_name":"辉",
"age":24,
"about":"I like LULU",
"interest":["movie"]
}
# 不指定ID的时候,用POST
POST /lib/user/
{
"first_name":"杨",
"last_name":"璐",
"age":23,
"about":"I like Caohui",
"interest":["movie"]
}
# 获取指定id的文档
GET /lib/user/1
GET /lib/user/ZTLbRG4BO86YojzOMVx8
# 只查询source和about两个字段
GET /lib/user/1?_source=age,about
# 修改
POST /lib/user/1/_update
{
"doc": {
"age":30
}
}
# 删除文档
DELETE /lib/user/1
# 删除索引
DELETE lib2
6.2. 批量获取文档
GET /_mget
{
"docs": [
{
"_index": "lib",
"_type": "user",
"_id":"1"
},
{
"_index": "lib",
"_type": "user",
"_id":"2"
},
{
"_index": "lib",
"_type": "user",
"_id":"3"
}
]
}
# 简化后的批量获取
GET /lib/user/_mget
{
"docs": [
{
"_id": 1
},
{
"_type": "user",
"_id": 2
}
]
}
# 或者更简单一点
GET /lib/user/_mget
{
"ids":["1","2","3"]
}
6.3 使用Bulk API实现批量操作
PUT lib2
# 批量添加文档
POST /lib2/books/_bulk
{"index":{"_id":1}}
{"title":"Java", "price":55}
{"index":{"_id":2}}
{"title":"Php", "price":54}
{"index":{"_id":3}}
{"title":"C++", "price":53}
# 批量修改
POST /lib2/books/_bulk
{"delete":{"_index":"lib2", "_type":"books", "_id":3}}
{"create":{"_index":"tt", "_type":"ttt", "_id":100}}
{"name":"caohui"}
{"index":{"_index":"tt", "_type":"ttt"}}
{"name":"yanglu"}
{"update":{"_index":"lib2", "_type":"books", "_id":1}}
{"doc":{"price":128}}
POST /lib2/_bulk
{"update":{"_type":"books", "_id":1}}
{"doc":{"price":12345}}
bulk会把将要处理的数据载到内存只,所以数据量是有限制的。可以在es目录下的config中修改。
6.4. 版本控制
ElasticSearch采用乐观锁的机制,当用户对document进行操作时,只需要指定要操作的版本即可。 如果版本一致,修改,如果不一致,报错。每次修改,文档的_sep_no字段都会+1. (ES6以前使用version字段,之后被摒弃了)
6.4.1. 内部版本控制
GET /lib/user/1
{
"_index" : "lib",
"_type" : "user",
"_id" : "1",
"_version" : 2,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"first_name" : "曹",
"last_name" : "辉",
"age" : 30,
"about" : "I like LULU",
"interest" : [
"movie"
]
}
}
如果我想修改这个doc, 使用以下语句控制版本。
#如果我想修改这个doc
PUT /lib/user/1?if_seq_no=2?if_primary_term=1
{
"doc":{
"age":12
}
}
两个参数
- if_seq_no : 每个doc都有_seq_no,每一次修改这个doc,这个字段都会+1。
- If_primary_term: 主分片发生改变时,比如重新选主,_primary_term会+1。
6.4.2. 外部版本控制
ElasticSearch中数据的版本很多情况下是根据外部数据库的版本的,外不会提供给es一个版本。此时,es中的版本应该修改为外部的版本。注意,此时外部提供的版本一定要大于es内部的版本,否则会报错。
外部版本控制的用法如下。
PUT /lib/user/1?version=100&version_type=external
{
"first_name" : "曹",
"last_name" : "辉",
"age" : 24,
"about" : "I like LULU",
"interest" : [
"movie"
]
}
<