本文目标
本文通过对比关系型数据库,将ES中常见的增、删、改、查操作进行图文呈现。能加深你对ES的理解。同时,也列举了kibana下的图形化展示。
ES Restful API GET、POST、PUT、DELETE、HEAD含义
1)GET:获取请求对象的当前状态。
2)POST:改变对象的当前状态。
3)PUT:创建一个对象。
4)DELETE:销毁对象。
5)HEAD:请求获取对象的基础信息。
Mysql与Elasticsearch核心概念对比示意图
以上表为依据,
ES中的新建文档(在Index/type下)相当于Mysql中(在某Database的Table)下插入一行数据。
ES的集群管理
1、查看集群状态
http://localhost:9200/_cat/health?v
返回值
从以上的返回值中,我们可以得到一个名为ElasticSearch的集群,共有一个节点,没有索引数据。
2、查看所有节点的状态
http://localhost:9200/_cat/indices?v
ES的CURD操作
1、新建文档(类似mysql insert插入操作)
当你创建一个文档时,无需再这之前创建一个索引和类型,ElasticSearch会自动根据你的创建信息自动创建相应的索引、类型,直至文档。
备注: 如果不指定_id, elasticsearch会自动帮我们生成
创建成功如下显示:
2、检索文档(类似mysql search 搜索select*操作)
通过_id来查询文档
检索结果如下:
如果未找到会提示:
查询全部文档如下:
具体某个细节内容检索
查询举例1:查询cotent列包含版本为1.0的信息。
http://localhost:9200/blog/article/_search?pretty&q=content:1.0
查询举例2:查询书名title中包含“enhance”字段的数据信息:
# curl -X GET 10.200.1.121:9200/blog/ariticle/_search?pretty -d
查询举例3:查询ID值为3,5,7的数据信息:
# curl -X GET 10.200.1.121:9200/blog/ariticle/_search?pretty -d
查询举例4:分页查询
# curl -X GET 10.200.1.121:9200/blog/ariticle/_search?pretty -d
'{ "query" : {
"terms" :
{"_id" : [ "3", "5", "7" ] }
},
"from": 1,
"size": 10
}'
3、更新文档(类似mysql update操作, 有则更新,无则新建)
{"script":"ctx._source.content = /"new version 2.0 20160714/""}
更新后结果显示:
{
“_index”: “blog”,
“_type”: “ariticle”,
“_id”: “1”,
“_version”: 2,
“_shards”: {
”total”: 2,
“successful”: 1,
“failed”: 0
}
}
注意更新文档需要在config\elasticsearch.yml下新增以下内容:
script.groovy.sandbox.enabled: true
script.engine.groovy.inline.search: on
script.engine.groovy.inline.update: on
script.inline: on
script.indexed: on
script.engine.groovy.inline.aggs: on
index.mapper.dynamic: true
4、删除文档(类似mysql delete操作)
5、查询过滤
过滤器类型
过滤器类型与查询类型基本相对应,都有范围(过滤)查询、term、terms等类型。
term、terms过滤
term、terms的含义与查询时一致。term用于精确匹配、terms用于多词条匹配。不过既然过滤器既然适用于大范围过滤,term、terms在过滤中使用意义不大。
范围过滤(range)
查询16年10月以来所有内容含有“java”的文档,先过滤剩下符合10月的文章,再精确匹配。
exists、mising过滤器
exists过滤指定字段没有值的文档
将不返回id字段无值的文档。
missing 过滤器与exists相反,它过滤指定字段有值的文档。
标识符(ids)过滤器
需要过滤出若干指定_id的文档,可使用标识符过滤器(ids)
组合过滤器
可以对这些过滤器组合使用,ES中有2类组合过滤器。一类是bool过滤器,一类是and、or、not过滤器。bool过滤器对应布尔查询(bool)
bool过滤占用资源,总结来说,一般情况下用bool过滤器,当遇到位置查询、数值范围、脚本查询时使用and、or、not过滤。
查询日期在16年10月份且文章标题或内容包含“ES“的文档
用SQL表示为
使用bool过滤器
布尔查询也可嵌套布尔查询,如要查询16年10月份内容有关ES的文章或任何时段文章名称与java相关的所有文章。(这里只是举例,不考虑实际情况)
用SQL表示为
我们查询的主要用or关系连接,所以使用bool查询的should语句。一边是contents like '%ES%' and date between '2016-10-01' and '2016-10-31' ,另一个为name like '%java%' 前者需嵌套一个bool查询,使用must连接,后者简单使用match即可。