Elasticsearch简介
- Easticsearch是一个基于Lucene的实时分布式搜索和分析的引擎 . 用于云计算中快速搜索 , 稳定可靠又快速 . 它基于RESTful接口
- Lucene是一个库 , 使用的时候需要用java语言集成到应用 . Lucene非常复杂 . Elasticsearch也使用java开发 , 也需要使用lucene作为核心实现搜索和索引 , 但是它通过简单的RESTful API 来让搜索变得简单 .
- 在Elasticsearch之前有同款产品solr , 但是性能没有Elasticsearch好 ,查询速度大约提升了50倍.
Elasticsearch的优点
- 分布式 , 实时分布 , 被称为’Push replication’ .
- 支持Lucene , 接近实时搜索 . 性能相对于solr这样的高级框架更好 .
- 采用 Gateway 概念 , 备份更加简单.
- 服务器节点组成对等的网络结构 , 节点故障会自动分配其他节点 .
和关系型数据库的对比
- 关系型数据库有数据库 , Elasticsearch有索引库(index)
- 关系型数据库有多张表 , Elasticsearch有类型(type)
- 关系型数据库表中的内容是一行 , Elasticsearch是文档(document)
- 关系型数据库的列 , Elasticsearch是字段(field)
- Elasticsearch的类型(type)不太常用, 官网表示之后可能会取消类型 .
- Elasticsearch是通过倒排索引来加速检索 . 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。
Rest操作
REST的操作分为以下几种:
- GET:获取对象的当前状态;
- PUT:改变对象的状态;
- POST:创建对象;
- DELETE:删除对象;
- HEAD:获取头信息。
启动Elasticsearch
- Linux环境下单台启动
/home/elasticsearch-2.4.5/bin/elasticsearch
(集群各节点到自己bin目录下启动elasticsearch) - 后台启动
/home/elasticsearch-2.4.5/bin/elasticsearch -d
{
name: "node1", //节点别名
cluster_name: "bigdate", //集群别名
cluster_uuid: "_na_",
version: {
number: "2.4.5", //安装版本
build_hash: "c849dd13904f53e63e88efc33b2ceeda0b6a1276",
build_timestamp: "2017-04-24T16:18:17Z",
build_snapshot: false,
lucene_version: "5.5.4" //lucene版本
},
tagline: "You Know, for Search"
}
- 集群启动(与单台启动相同,区别在于访问的url不同)
Elasticsearch操作
1. 索引库操作
- 创建索引库
- 格式 :
crul -X[rest] http://[创建库所在节点ip]:9200/[库名]
curl -XPUT http://192.168.200.211:9200/credi/
或者curl -XPOST http://192.168.200.211:9200/credi/
- 格式 :
- 删除索引库
- 格式 :
crul -X[rest] http://[删除库所在节点ip]:9200/[库名]
curl -XDELETE http://192.168.200.211:9200/credi/
- 格式 :
2. 文档(document)操作(CURL命令)
- 2.1 创建document(创建后的文件在data目录下)
- post和put都可以创建 , post可以不指定id , 会自动生成. put必须设置id
?pretty
让排版更清晰
格式:
curl -XPUT http://192.168.200.211:9200/[库名]/[类型]/[documentID][?pretty] -d '{
"[字段名]" : "[字段值]"
}'
例子1:
curl -XPUT http://192.168.200.211:9200/credi/employee/1 -d '{
"first_name" : "john",
"last_name" : "smith",
"age" : 25,
"about" : "I love to go rock climbing",
"address": "shanghai"
}'
或者 , 例子2:
curl -XPOST http://192.168.200.211:9200/credi/employee/1?pretty -d '{
"first_name" : "john",
"last_name" : "smith",
"age" : 25,
"about" : "I love to go rock climbing",
"address": "shanghai"
}'
- 2.2 更新document
- 首先建议使用POST
- PUT是全局更新 , 有的字段更新 , 没有的字段删除 .
- POST是局部更新 , 有的字段更新 , 没有的字段也不删除 .
格式:
curl -XPOST http://[节点ip]:9200/[库名]/[类型]/[ID]/_update?pretty -d '
{
"doc":{
"[字段名]":"[字段值]"
}
}'
例1(局部更新):
curl -XPOST http://192.168.200.211:9200/credi/employee/1/_update?pretty -d '
{
"doc":{
"city":"beijing",
"sex":"male"
}
}'
例2(全局更新):
curl -XPUT http://192.168.200.211/credi/employee/1?pretty -d '{
"city":"beijing",
"car":"BMW"
}'
- 2.3 查询document
-i
:头文件信息
格式:curl [-i] -XGET http://[节点ip]:9200/[库名]/[类型]/[ID][?pretty]
例子(查询所有):curl -XGET http://192.168.200.211:9200/credi/employee/_search?pretty
例子2(查询指定id):curl -XGET http://192.168.200.211:9200/credi/employee/1?pretty
例子3(查询特定字段):curl -XGET http://192.168.200.211:9200/credi/employee/1?_source=car
- 2.4 DSL查询(领域特定语言)
格式:
curl -XGET http://[ip]:9200/[库名]/[类型名]/_search?pretty -d '{
"query":
{"match":
{
"[字段名]":"[字段值]"
}
}
}'
例子1(根据特定的条件查询指定的数据):
curl -XGET http://192.168.200.211:9200/credi/employee/_search?pretty -d '{
"query":
{"match":
{"last_name":"smith"}
}
}'
例子2(多个字段包含中有任何一个包含指定值则返回其数据)
curl -XGET http://192.168.200.211:9200/credi/employee/_search?pretty -d '
{
"query":
{"multi_match":
{
"query":"BMW",
"fields":["car","city"]
}
}
}'
(car和city,只要值等于BMW就把数据返回)
例子3(多个字段都符合条件就把数据返回)
curl -XGET http://192.168.200.211:9200/credi/employee/_search?pretty -d '
{
"query":
{"bool" :
{
"must_not" :
{"match":
{"age":20}
},
"must" :
{"match":
{"car":"BMW"}
}
}
}
}'
(把age不等于20 , car等于BMW的数据返回)
- 2.5 删除文档(document)
curl -XDELETE http://192.168.200.211:9200/credi/employee/1?pretty
删除一个文档也不会立即生效,它只是被标记成已删除。 Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理
Elasticsearch的head插件操作
- 安装head插件的服务器节点的ip , 加上
/_plugin/head/
后缀即可访问web页面
http://192.168.200.212:9200/_plugin/head/
IK分词器的使用
- 每个索引库默认有5个分片 , 每个分片默认有1个副本(加上本身一共2个)
- 基本查询
Kibana操作
-
到安装Kibana的节点上
-
进入bin目录下
cd /home/kibana-4.6.2-linux-x86_64/bin
执行命令:./kibana plugin --install marvel --url file:///home/kibana-4.6.2-linux-x86_64/marvel-2.4.6.tar.gz
(结合自己的实际路径修改命令)- 集群都需要预先启动elasticsearch
- 到Kibana目录下的bin目录下启动Kibana
- 测试 : web访问
192.168.200.212:5601
elasticsearch的核心概念
- cluster
cluster代表一个集群 , 集群之中有多个节点 , 它们启动时会内部选举出一个主节点 . elasticsearch有一个重要概念就是去中心化 , 但这是对于集群外来说的 . 你和集群任何一个节点通信 和与整个集群es通信是等价的 .
主节点的职责是管理整个集群的状态, 包括管理分片的状态和副本的状态 . 还有节点的发现和删除 .
所以 , 你只需要在一个网段中的多台服务器节上启动es , 就会自动组成一个集群 .
集群状态查看http://192.168.200.212:9200/_cluster/health?pretty
- shards:索引分片
shards代表索引分片 , es可以吧一个完整的索引分成多个分片 , 默认是5个 , 构成分布式搜索 . 分片的数量只能在索引创建之前指定 , 并且索引创建之后不可更改 .
创建索引库的时候指定分片数量 :curl -XPUT '192.168.200.212:9200/test/' -d'{"settings":{"number_of_shards":5}}'
- replicas:副本
replicas代表索引副本 , es可以给索引设置副本 , 默认是一个(加上自身共2个) , 副本的作用是提高系统的容错性 , 你一台服务器节点挂了数据还可以从副本从恢复 . 另外就是提高es的查询效率 , es会自动对搜索请求进行负载均衡 .
副本数量可以在创建索引库的时候指定:curl -XPUT '192.168.200.212:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'
(在集群中一共有3份数据) - recovery
代表数据恢复或叫数据重新分布 , es节点挂掉或者拓展的时候会根据机器的负载对索引的分片进行重新分配 , 挂掉的节点重新启动时也会进行数据恢复 .
就是你原来2台机器 , 2份数据 , 一台一份刚好 ,再加一台机器进来 ,就要把2份数据平均分给3台机器 , 负载均衡刚刚好 .
了解即可. - gateway
代表es索引的持久化储存方式 , es默认先把数据存放到内存中 , 内存满了之后落地到本地磁盘 . es集群关闭重新启动时就会从gateway中读取索引数据 . es支持多种类型的gateway , 有本地系统 . 分布式文件系统 , hadoop的hdfs和amazon的g3云储存服务 .
将数据落地到hdfs需要安装插件 elasticsearch/elasticsearch-hadoop - discovery.zen
代表es的自动发现节点机制 , es基于p2p系统 ,会先通过广播寻找存在的es节点 , 再通过多播协议来进行节点之间的通信, 也支持点对点的交互
如果要将不同网段的节点组成es集群
禁用自动发现机制:discovery.zen.ping.multicast.enabled: false
设置新节点被启动时能够发现的主节点列表:discovery.zen.ping.unicast.hosts: [“192.168.200.211", " 192.168.200.212", "192.168.200.213"]
- transport
代表es内部节点或集群与客户端的交互方式, 默认内部使用tcp协议进行交互 , 它也支持http协议(json格式) , thrift , servlet , memcached , zeroMQ等的传输协议(通过插件方式集成) .