ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多员工能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
ElasticSearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ES特点和优势
- 全文检索:是将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
- 倒排索引:由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
- 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
- 实时分析的分布式搜索引擎。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
负载再平衡和路由在大多数情况下自动完成。 - 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
- 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
- 标准化规则:建立倒排索引的时候,会对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率。
工作原理
当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。
核心概念
- Cluster(集群):ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上
- Node(节点):形成集群的每个服务器称为节点。
- Shard(分片):当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的
- Replia(副本):为提高查询吞吐量或实现高可用性,可以使用分片副本。 副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
扩展
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展示(跟head类似)。
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作
- curl 以命令的方式执行http协议的请求 GET/POST/PUT/DELETE
curl -X GET/POST/PUT/DELETE URL - 分词器
从一串文本中切出一个个的词条,并对每个词条进行标准化。
安装(jdk>=8)
1:官网下载解压:点我
2:创建logs和data文件夹
3:修改配置文件/xxx/elasticsearch-5.2.2/config/elasticsearch.yml
修改后的每行前面不能有空格,修改后的“:”后面必须有一个空格
# ---------------------------------- Cluster -----------------------------------
#如果集群两个节点上的cluster.name相同,都启动可以自动组成集群
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
#集群内的各节点不能相同
node.name: node-1
# ----------------------------------- Paths ------------------------------------
path.data: /xxx/elasticsearch-5.2.2/data
path.logs: /xxx/elasticsearch-5.2.2/logs
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# ---------------------------------- Network -----------------------------------
#远程访问用到
network.host: 192.168.1.102
# --------------------------------- Discovery ----------------------------------
discovery.zen.ping.unicast.hosts: ["yeamin01"]
4:linux 系统环境配置
(1)切换到root用户,编辑limits.conf 添加类似如下内容
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
(2)切换到root用户,进入limits.d目录下修改配置文件。
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
(3)切换到root用户修改配置sysctl.conf
[root@hadoop102 elasticsearch-5.2.2]# vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
[root@hadoop102 elasticsearch-5.2.2]# sysctl -p
然后,重新启动elasticsearch,即可启动成功。
Elasticsearch head插件安装
点击下载
nodejs官网下载安装包
下载nodejs
node-v6.9.2-linux-x64.tar.xz
配置nodejs环境变量
[root@xxx]# vi /etc/profile
export NODE_HOME=/opt/module/node-v6.9.2-linux-x64
export PATH= P A T H : PATH: PATH:NODE_HOME/bin
[root@xxx]# source /etc/profile
- 解压head插件到/opt/module目录下
[@xxx]$ unzip elasticsearch-head-master.zip -d /opt/module/ - 查看当前head插件目录下有无node_modules/grunt目录:
没有:执行命令创建:
[@xxx]$ npm install grunt --save - 安装head插件:
[@xxx]$ npm install -g cnpm --registry=https://registry.npm.taobao.org - 安装grunt:
[@xxx]$ npm install -g grunt-cli - 编辑Gruntfile.js
[@xxx]$ vim Gruntfile.js
文件93行添加hostname:‘0.0.0.0’
options: {
hostname:‘0.0.0.0’,
port: 9100,
base: ‘.’,
keepalive: true
} - 检查head根目录下是否存在base文件夹
没有:将 _site下的base文件夹及其内容复制到head根目录下
[@xxx]$ mkdir base
[@xxx]$ cp base/* …/base/ - 启动grunt server:
[@xxx]$ grunt server -d
Running “connect:server” (connect) task
[D] Task source: /opt/module/elasticsearch-head-master/node_modules/grunt-contrib-connect/tasks/connect.js
Waiting forever…
Started connect web server on http://localhost:9100
如果提示grunt的模块没有安装:
Local Npm module “grunt-contrib-clean” not found. Is it installed?
Local Npm module “grunt-contrib-concat” not found. Is it installed?
Local Npm module “grunt-contrib-watch” not found. Is it installed?
Local Npm module “grunt-contrib-connect” not found. Is it installed?
Local Npm module “grunt-contrib-copy” not found. Is it installed?
Local Npm module “grunt-contrib-jasmine” not found. Is it installed?
Warning: Task “connect:server” not found. Use –force to continue.
执行以下命令:
npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org
npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org
npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org
npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org
npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org
npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org
最后一个模块可能安装不成功,但是不影响使用。
- http://ip:910015)启动集群插件后发现集群未连接
在/opt/module/elasticsearch-5.2.2/config路径下修改配置文件elasticsearch.yml,在文件末尾增加
http.cors.enabled: true
http.cors.allow-origin: "*"
再重新启动elasticsearch。
Kibana的安装
注意:与安装的ES版本保持一致
kibana是一个针对ES的开源分析及可视化平台。使用kibana可以查询,查看并与存储在ES索引的数据进行交互操作,使用kibana能执行高级的数据分析,并能以图标和地图的形式查看数据。
1:下载
2:修改配置文件(kibana/config/kibana.yml)
#本机ip地址
server.host: "192.168.33.33"
#es所在的主机
elasticserch.url:"http://192.168.33.34:9200"
3:开启5601端口(kibana默认的端口)
开启防火墙:systemctl start firewalld.service
开启5601端口:firewall-cmd --permanent --zone=public --add -port=5601/tcp
重启防火墙:firewall -cmd --reload
4:启动kibana
./bin/kibana
安装中文分词器
- 下载,或者 click me
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.1/elasticsearch-analysis-ik-6.4.1.zip
- 解压,maven编译,将生成的zip报放到es插件的目录下,并且新建文件夹。
- 解压所该zip包,并将生成的所有内容上移到自己新建的文件夹下。
对ES的基本操作
ES使用一种称为 倒排索引 的结构,它适用与快速的全文搜索,一个倒排索引由文档中的所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
- 新增
PUT / 索引名称 /文档/id - 查询
GET 索引名称/_settings - 修改
PUT / 索引名称 /文档/id/_update - 删除
DELETE
使用multiGet批量获取文档
GET /索引/文档/_mget
{ "ids":["1","2"]
}
使用Bulk API实现批量操作(获取和删除)
bulk的格式:{action:{metadata}}\n
{requestbody}\n
action:
- create:文档不存在时创建(已经存在,则报错)
- update:更新文档
- index:创建新文档或者替换已有的文档
- delete:删除一个文档
metadata
_index、_type、_id
例子:{“delete”:{"_index":“db”,"_type":“table”,"_id":“id”}}
POST /lib2/books/_bulk
{“index”:{"_id":“1”}}
{“title”:“java”}
mapping
-
支持的数据类型:string:可分为text和keyword
text 类型被用来索引长文本,在建立索引前会将这些文本进行分词,text类型不能用来排序和聚合,keyword类型不需要进行分词,可以用来检索过滤,排序和集合。 -
数字型:long,integer,short,byte,double,float
-
日期:date
-
布尔型:boolean
-
二进制型:binary
基本查询(query)
- GET /index/type/_search?q=name:lisi&sort=age :desc
- term:不知道分词器的存在 ,适合查询keyword,numeric.date类型,中文的话包含该字就会被查询出来
terms:查询某个字段里含有多个关键词的文档(含有其中一个也会被查询出来)
GET /index/type/_search/
{ "query":{
"term":{"name":"lisi"}
}
}
GET /index/type/_search/
{ "query":{
"terms":{"content":["this","paper"]}
}
}
GET /index/type/_search/
{"from":0,
"size":2,
"query":{
"terms":{"content":["the","book"]}
}
}
- match: 知道分词器的存在,会对filed进行分词操作,然后再查询
GET /index/type/_search/
{ "query":{
"match":{"name":"lisi zhaoliu"}
}
}
查询所有:
GET /index/type/_search/
{ "query":{
"match_all":{}
}
}
查询多个字段:
GET /index/type/_search/
{ "query":{
"multi_match":{
"query": "singing" ,
"fields":["interests","name"] }
}
}
指定返回的字段:
GET /index/type/_search/
{ "_source":["address","name"]
"query":{
"match":{
"name":"lisi"}
}
}
- sort排序:
GET /index/type/_search/
{ "query":{
"match_all":{}
},
"sort":[
{
"age":{
"order":"desc"
}
}
]
}
前缀匹配:
GET /index/type/_search/
{ "query":{
"match_phrase_prefix":{
"name":{
"query": "zhao"
}
}
}
}
范围查询:
GET /index/type/_search/
{ "query":{
"range":{
"birthday":{
"from": "1999-1-1",
"to": "1999-12-29",
"include_lower":true,
"include_upper":false
}
}
}
}
wildcard 查询 允许使用通配符*(任意多个) 和?(一个字符):
GET /index/type/_search/
{ "query":{
"wildcard":{
"name":"zhao*",
"intering":"foot?all"
}
}
}
fuzzy 实现模糊查询:
GET /index/type/_search/
{ "query":{
"fuzzy":{"name":"zhaliu"}
}
}
filter查询是不计算相关性的可以使用缓存 所以查询比query快
GET /index/type/_search/
{ "query":{
"bool":{
"filter":[
"term":{"price":40}
]
}
}
}
GET /index/type/_search/
{ "query":{
"bool":{
"filter":[
"terms":{"price":[5,20]}
]
}
}
}
多线程冲突解决
es内部使用乐观所来解决多线程冲突,最多尝试次数是我们指定retry_on_conflit的值
POST /index/type/id/_update?retry_on_conflit=3
其他文档:
代码层次