一、概念
1.ES基础概念
ES是ElasticSearch的缩写。ES是基于Apache Lucene的开源搜索引擎,是一款实时分布式搜索和分析引擎,提供RestfulAPI可以进行可视化的交互。具有如下特点:
1) 提供分布式的实时文件存储,每个字段都被索引并可被搜索;
2)实时分析的分布式搜索引擎;
3)可以扩展到上百万台服务器,能处理PB级结构化或非结构化的数据
2.NRT
NRT是近实时Near Realtime的缩写。ES是一款近实时的搜索平台,即意味着有轻微的延迟,在从开始索引文档到有结果的时间稍微延迟通常为1秒。
3.ES和SQL
ES也是一种数据库,学习ES可以对比SQL来理解和学习。下面先列出二者的关系如表-1,方便读者有个大概了解。第二节会详细介绍关于ES的常用术语。
二、存储相关
1.物理存储
1)Cluster
集群是一个或者一个以上的节点(服务器)的集合。并在所有节点上提供联合的索引和搜索功能。集群由唯一的名称标识,默认情况下是“elasticsearch”。该名称很重要,因为如果节点设置为通过其名称加入集群,则节点只能是集群的一部分。
2)Node
节点是作为集群一部分的单一服务器,存储您的数据,并参与集群的索引和搜索功能。就像一个集群一样,一个节点由一个名称来标识,默认情况下是一个随机的通用唯一标识符(UUID),它在启动时分配给该节点。所有的节点通过设置集群名cluster.name来确定属于某个集群。
3)Shard
由于索引存在存储可能超过单个节点的硬件限制的大量数据。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢,无法单独从单个节点提供搜索请求。因此分片就是为了解决这个问题。每个索引被分成若干个分片。分片被存储在不同的节点中。分片很重要,使用分片的作用:
a) 允许水平分割/缩放内容,提高扩展能力;
b) 允许在分片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;
4)Replica
副本是分片的复制。副本的作用:
a) 如果分片/节点出现故障,则可提供高可用性
b) 允许扩展搜索量/吞吐量,因为可以对所有副本并行执行搜索
默认情默认情况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本。创建索引后,您可以随时动态更改副本数,但不能更改主分片数。
2.逻辑存储
1)Index
索引是具有某种相似特征的文档的集合。例如,您可以拥有客户数据的索引,产品目录的另一个索引,以及订单数据的另一个索引。索引由名称(必须全部为小写)标识,该名称用于在针对其中的文档执行索引,搜索,更新和删除操作时引用索引。
2)Type
类型是您的索引的逻辑类别/分区,允许您将不同类型的文档存储在同一索引中,例如用户的一种类型,博客文章的另一种类型。在索引中不再可能创建多个类型,并且在以后的版本中将删除整个类型的概念。
3)Document
文档是可以索引的基本信息单元。例如,您可以为单个客户提供文档,单个产品的文档,单个订单的另一个文档。该文档以JSON(JavaScript Object Notation)表示,它是一种无处不在的互联网数据交换格式。
4)Field
多个字段组成一个文档。一个索引的所有文档类型中对于具有相同名称的字段必须是同一种数据类型,与SQL SERVER不同,同一数据库中不同表中相同名称的列数据类型可以不一样。
5)Mapping
映射就是字段即字段和字段类型的对应关系。映射机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。例如:字段name,类型是String;字段age,类型是Integer。除此之外字段的类型也可以是日期、布尔值、数组、浮点数、对象等等。
三、基础操作
1.创建
增加一行数据,使用关键字Create。内容按照json数据,可以手动写,也可以根据已知的json格式创建。
语法模板一:
curl -XPOST localhost:9200/索引名/类型名/'-d'
{"title":"xxxx","text":"xxxx","date":"2014/01/01"}
备注:-d参数用于将数据放在http请求的body中发送
语法模板二:
curl -XPOST localhost:9200/create_index_action/索引名/类型名/ --data-binary @a.json
备注:依据据a.json创建
2.删除
删除一行数据,使用关键字Delete。
语法模板:
curl -XDELETE localhost:9200/索引名/类型名/ID
备注:ID号一般是自动生成的唯一标志符,也可以更具需要自定义。
3.修改
修改一行数据,使用关键字Update。
语法模板:
1)修改某一字段的值
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"doc":{"name":"wxxq"}
}
2)增加一个字段
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"doc":{"name":"wxxq","age":18}
}
3)使用脚本修改
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"script":"ctx._source.age+=5"
}
备注:ctx._source指的是即将更新的当前源文档
4.简单查询
查询数据,使用关键字Search。
语法模板:
1)空查询:
curl -XGET localhost:9200/_search?pretty
备注:返回索引中所有的文档
2)根据id号来查询:
curl -XGET localhost:9200/索引名/类型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"
3)模糊查询:
curl -XGET localhost:9200/_all/_search?q="add"
备注:查询有add的文档
5.批处理
批量处理数据,使用关键字bulk。
语法模板:
1)同时修改多个索引
curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
2)对多个索引进行不同的处理操作
curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes JaneDoe" } }
{"delete":{"_id":"2"}}
6.搜索结果释义
图-1是一张搜索结果的截图,下面将针对搜索结果的结构解释来查看数据内容。
搜索结果备注:
took:执行ES的搜索需要的时间
timed_out:是否超时
_shards:搜索了多少个分片,成功数量,失败数量
hits:搜索结果,通过键值对展示
hits.total:符合搜索条件的文件总数
hits.hits:实际搜索结果数组
_index:该条数据所在索引
_type:该条数据所在类型
_id:该数据的唯一标识符
_source:该条数据的内容,里面由多个fields组成
四、复杂查询
1.多条件查询
curl -XGET localhost:9200/school/student/_search{
"query":{
"bool":{
"must":[{"match":{"gender":"male"}},
{"match":{"age":18}}],
"should":["match":{"hobby":"music"}],
"must_not":["match":{"address":"BeiJing"}]
}},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
2.过滤器
curl -XGET localhost:9200/school/student/_search{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"money": {
"gte": 20000,
"lte": 30000
}
}
}
}
},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
备注1:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
备注2:
除了使用range过滤,还可以使用term,terms,exists,missing等
1) term用于精确匹配某些值,如数字,日期,布尔值
{"term":{"age":20}}
{"term":{"date":"2017-08-21"}}
2) terms与term类似,但允许指定多个匹配条件,当某个字段存在多个值时
{"terms":{
"tag":["search","full_text","nosql"]
}
}
3)exists包含某字段
{
"exists":{
"fields":"tittle"
}
}
4)missing没有某字段
{
"missing":{
"fields":"tittle"
}
}
3.聚合
聚合(aggregations)类似于SQL的Group By。
curl -XGET localhost:9200/school/student/_search{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[{"from":20,
"to":30},
{"from":30,
"to":40},
{"from":40,
"to":50}]
}
}
}
}
聚合还支持嵌套查询
curl -XGET localhost:9200/school/student/_search{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[{"from":20,
"to":30},
{"from":30,
"to":40},
{"from":40,
"to":50}]
}
}
},
"aggs":{
"group_by_gender":{
"terms":{
"field":"gender"
},
"aggs":{
"avg":{
"field":"balance"
}
}
}
}
}