Elasticsearch CURD Rest-api

本文目标
    本文通过对比关系型数据库,将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会自动帮我们生成
http://localhost:9200/blog/ariticle/1 put
{
    "title":"New version of Elasticsearch released!",
    "content":"Version 1.0 released today!",
    "tags":["announce","elasticsearch","release"]
}
创建成功如下显示:
{
    - "_index": "blog",
    - "_type": "ariticle",
    - "_id": "1 -d",
    - "_version": 1,
    - "_shards": {
        - "total": 2,
        - "successful": 1,
        - "failed": 0
    - },
    - "created": true
}
    

2、检索文档(类似mysql search 搜索select*操作)

通过_id来查询文档
检索结果如下:
{
- "_index": "blog",
- "_type": "ariticle",
- "_id": "1",
- "_version": 1,
- "found": true,
- "_source": {
    - "title": "New version of Elasticsearch released!",
    - "content": "Version 1.0 released today!",
    - "tags": ["announce", "elasticsearch" , "release"]
- }
}
如果未找到会提示:
{
    - "_index": "blog",
    - "_type": "ariticle",
    - "_id": "11",
    - "found": false
}
查询全部文档如下:

具体某个细节内容检索
查询举例1:查询cotent列包含版本为1.0的信息。
http://localhost:9200/blog/article/_search?pretty&q=content:1.0
{
    - "took": 2,
    - "timed_out": false,
    - "_shards": {
        - "total": 5,
        - "successful": 5,
        - "failed": 0
    - },
    - "hits": {
    - "total": 1,
    - "max_score": 0.8784157,
    - "hits": [
    - {
        - "_index": "blog",
        - "_type": "ariticle",
        - "_id": "6",
        - "_score": 0.8784157,
        - "_source": {
            - "title": "deep Elasticsearch!",
            - "content": "Version 1.0!",
        - "tags": [
            - "deep",
            - "elasticsearch"
        - ]
        - }
    - }
    - ]
- }
}
查询举例2:查询书名title中包含“enhance”字段的数据信息:
# curl -X GET 10.200.1.121:9200/blog/ariticle/_search?pretty -d 
> '{ "query" : {
> "term" :
> {"title" : "enhance" }
> }
> }'
查询举例3:查询ID值为3,5,7的数据信息:
# curl -X GET 10.200.1.121:9200/blog/ariticle/_search?pretty -d 
'{ "query" : {
"terms" :
{"_id" : [ "3", "5", "7" ] }
}
}'
查询举例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操作)

{

- "found": true,
- "_index": "blog",
- "_type": "ariticle",
- "_id": "8",
- "_version": 2,
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- }
}
5、查询过滤

过滤器类型

过滤器类型与查询类型基本相对应,都有范围(过滤)查询、termterms等类型。

term、terms过滤

term、terms的含义与查询时一致。term用于精确匹配、terms用于多词条匹配。不过既然过滤器既然适用于大范围过滤,term、terms在过滤中使用意义不大。

范围过滤(range)

查询16年10月以来所有内容含有“java”的文档,先过滤剩下符合10月的文章,再精确匹配。
{
    "query": {
        "filtered":{
            "query":{
                "match":{
                    "contents":"java"
                }
            },
        "filter":{
            "range":{
                "date":{
                    "gte":"2016-10-01"
                }
            }
        }
        }
    }
}

exists、mising过滤器

exists过滤指定字段没有值的文档
{
    "query": {
        "filtered":{
            "filter":{
                "exists":{
                    "field":"id"
                }
            }
        }
    }
}
将不返回id字段无值的文档。
missing 过滤器与exists相反,它过滤指定字段有值的文档。
{
    "query": {
        "filtered":{
            "filter":{
                "missing":{
                    "field":"id"
                }
            }
        }
    }
}

标识符(ids)过滤器

需要过滤出若干指定_id的文档,可使用标识符过滤器(ids)
{
    "query": {
        "filtered":{
            "filter":{
                "ids":{
                    "values":[1,2,6,7]
                }
            }
        }
    }
}

组合过滤器

可以对这些过滤器组合使用,ES中有2类组合过滤器。一类是bool过滤器,一类是andornot过滤器。bool过滤器对应布尔查询(bool
bool过滤占用资源,总结来说,一般情况下用bool过滤器,当遇到位置查询、数值范围、脚本查询时使用and、or、not过滤。
查询日期在16年10月份且文章标题或内容包含“ES“的文档
用SQL表示为
select * from article where date between '2016-10-01' and '2016-10-31' and (name like '%ES%' or contents like '%ES%')
使用bool过滤器
{
    "query": {
        "filtered":{
            "filter":{
                "bool":{
                    "should":[{
                        "match":{
                            "name":"ES"
                        }
                    },{
                        "match":{
                            "contents":"ES"
                        }
                    }],
                    "must":{
                        range":{
                            "date":{
                                "gte":"2016-10-01",
                                "lte":"2016-10-31"
                            }
                        }
                    }
                }
            }
        }
    }
}
布尔查询也可嵌套布尔查询,如要查询16年10月份内容有关ES的文章或任何时段文章名称与java相关的所有文章。(这里只是举例,不考虑实际情况)
用SQL表示为
select * from article where contents like '%ES%' and date between '2016-10-01' and '2016-10-31' or name like '%java%'
{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [{
                        "bool": {
                            "must": [{
                                "range": {
                                    "date": {
                                        "gte": "2016-09-01",
                                        "lte": "2016-09-30"
                                    }
                                }
                            }, {
                                "match": {
                                    "contents": "js"
                                }
                            }]
                        }
                    }, {
                        "match": {
                            "name": "java"
                        }

                    }]
                }
            }
        }
    }
}
我们查询的主要用or关系连接,所以使用bool查询的should语句。一边是contents like '%ES%' and date between '2016-10-01' and '2016-10-31' ,另一个为name like '%java%' 前者需嵌套一个bool查询,使用must连接,后者简单使用match即可。

刘小恺(Kyle) wechat
如有疑问可联系博主