原创

Elasticsearch 用 REST API操作数据的CRUD(增删改查)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://lixuekai.blog.csdn.net/article/details/53546308

restful adj.平静的,悠闲的,让人得到休息的;安生。
Elasticsearch REST API可用于各种任务。有了它,可以管理索引,更改实例参数,检查节点和群集状态,索引数据,搜索数据或者通过GET API检索文档。但是现在,我们将集中在API中的CRUD(create-retrieve-update-delete,增删改查)部分,它让我们能像使用NoSQL数据库一样使用Elasticsearch。


理解 Elasticsearch 的 RESTful API 
假设现在有如下路径:/books/1/chapter/6
上述路径可以理解为:在图书馆的所有书这张表中,ID为1的书,章节为6.
我们在使用 Elasticsearch 的 RESTful API 的时候,也是这么个效果。就是每个URL都代表具体的东西。反正就是根据路径去查你想要的东西。查询你想要的东西的条件都是在路径中得到体现。
具体详细理解,可参考如下的对应。
curl -X<VERB> <PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING> -d '<BODY>'
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
上面的对应下面的例子。get请求可以直接在浏览器上输入,下面的在mac的命令行可以执行。后面的 -d 后面的我就没有测试了。
当Windows上装了curl的插件 也是可以的,但是我测试的时候,后面 -d 的一堆东西是失败的。后面加的这个body不能用。
(后来测试,是Windows解析json的问题,由双引号引起,具体处理,此类文章有说明)
curl -XGET http://localhost:9200/_count?pretty -d ‘{
    "query": {
        "match_all": {}
    }
}’


先不要在意为什么带参数就失败了吧。也许学着学着,就知道哪里错了呢,也许是书上写错了呢。或者版本升级的问题呢。
(经过后面的测试发现,这个是Windows 的cmd 命令行对双引号的解释的问题,mac就不会有问题,我有做测试,在下面新建文档的时候,就出这个问题了。)

理解了上面的东西,也就理解了 REST 的一般概念。
你可以在 http://en.wikipedia.org/wiki/Representational_state_transfer 上阅读更多关于REST的信息。具体的我还没点进去看呢。


下面继续 如何使用Elasticsearch API 来实现 CRUD

在Elasticsearch中,所有的数据,即每个文档,都有定义好的索引和类型。每个文档可以包含一个或多个字段来保存数据。首先展示如何使用Elasticsearch为一个简单文档建立索引。

新建文档(先新建数据,然后才可以索引)

现在,尝试索引一些文档。例如,为博客建立某种内容管理系统(CMS)。文章(article)是博客中的一个实体(model)。
使用JSON对象表示,一个文档可以用如下所示的例子来表示:
{
    "id": "1",
    "title": "New version of Elasticsearch released!",
    "content": "Version 1.0 released today!",
    "priority": 10,
    "tags": ["announce", "elasticsearch","release" ]
}
可以看到,JSON文档包含一组字段,每个字段可以有不同的形式。在以上示例中,我们所使用的类型有数字(priority翻译为优先权,)、文本(title)和字符串数组(tags)。Elasticsearch能猜出这些类型(因为JSON是半类型化的,例如,数字没有放在引号中),并自动定制这些数据在其内部结构中如何存储。


当然,我们希望为示例文档建立索引,并使其可用于搜索。我们将使用一个名为blog的索引和名为article的类型。为了把示例文档以给定类型、标识符为1建立在索引中,执行以下命令:
curl -XPUT http://localhost:9200/blog/article/1 -d '{"title": "New version of Elasticsearch released!","content": "Version1.0releasedtoday!","tags": [ "announce","elasticsearch","release"]}'
好吧,上面的命令是可以直接在mac命令行执行的,在Windows上,即使装curl插件,还是得修改下,加很多的引号,也是可以正确执行的。
具体命令修改为如下,执行的时候,命令里面不要换行:
curl -XPUT "http://localhost:9200/blog/article/1" -d "{"""title""": """New version of Elasticsearch released!""", """content""": """Version 1.0 released today!""","""tags""":"""["announce", "elasticsearch", "release"]"""}"
正确执行,新建文档的命令的截图如下:



然后看到这个时候head插件的页面就可以看到数据了,主要看2个地方的截图吧。




看到图里面的索引为_index,类型_type,_id文档的标识符,三个字段 title content tags。
为了更好的了解这几个东西,我又给es新建了2个文档,和上面的不相干的文档。测试的是我,你看着又不累,还是乖乖继续看吧。
curl -XPUT "http://127.0.0.1:9200/index/type/id" -d "{ """attribute""" : """name""" }"
curl -XPUT "http://127.0.0.1:9200/index/type/id2" -d "{ """attribute""" : """lxk""" }"
然后,现在的图如下。




看图里面的东西,知道,所有的文档的字段都被显示在字段的下面,可以找到对应字段,直接搜索。然后看到索引和类型暂时的作用可以分组用。然后所有的文档数据都是在右边显示,看上去像所有数据都在一张表上一样。_id这个字段,唯一标识符。来区分每一个文档。
暂时就得到这么多信息吧。


标识符的自动创建

上面的标识符(_id 字段)是我们指定生成的。但是这个也可以自动生成。就像数据库里面的ID,一般不指定,都是自动生成,我看mongo就是这么的。下面测试自动生成这个标识符字段。
Elasticsearch可以自动生成标识符。这似乎很方便,但只有当该索引是唯一的数据来源时,才能这么做。如果使用一个数据库来存储数据,用Elasticsearch全文搜索,那数据同步将会被阻碍,除非在数据库中也存储生成的标识符。使用HTTP POST请求类型并且不在URL中指定标识符,就可以生成一个唯一标识符。
(上面这句话我就没看明白具体是啥意思。那就暂时先不管这个吧)
看下面的命令:
mac 环境下的命令行,我就不测试了。
curl -XPOST http://localhost:9200/blog/article/ -d '{"title": "New version of Elasticsearch released!", "content": "Version 1.0 released today!", "tags":["announce", "elasticsearch", "release"] }'
Windows cmd 环境下
curl -XPOST "http://localhost:9200/blog/article/" -d "{"""title""": """New version of Elasticsearch released!""", """content""": """Version 1.0 released today!""", """tags""":"""["announce", "elasticsearch", "release"]""" }'
然后,上执行结果的图:



再看head的插件上的页面的结果。发现如下:
我是把原来的2个节点都删除了,然后再次测试的结果图。在概览页可以看到有一条doc存在,但是在数据浏览页面上却没有看到,但是,还好我学过web的,所以,看了url的请求。看到确实是有数据返回的。暂时先这么理解吧。




后面我就想不开,为什么就是不显示呢?然后就仔细对比了下自动生成的标识符和自己指定标识符的区别。不是干Java的吗,都知道点web的知识。然后我就把2次的_search请求的返回结果json数据,拿到 http://www.bejson.com/ 这个工具页面给格式化下,发现,返回数据json格式化失败,再看下发现我的双引号加的不对。最后一个引号是单引号。
那么再次修改下,Windows cmd 环境下的命令。
curl -XPOST "http://localhost:9200/blog/article/" -d "{"""title""": """New version of Elasticsearch released!""", """content""": """Version 1.0 released today!""", """tags""":"""["announce", "elasticsearch", "release"]""" }"
再次执行以下就OK了。页面就OK了。





为什么不直接写正确的结果呢,额,这个就是个实际开发中排错的经验吧。实际开发中,这个json格式不对的bug估计多了去了。多半都是参数的问题。


最后我又试试,把上面的三个新建文档的都一起执行,看看效果。因为浏览长度有限,下面是有滚动条的。图里就展现不出来了。



检索文档

上面既然已经新建数据OK,那么下面就可以读数据了。
curl -XGET http://localhost:9200/blog/article/1
这个命令,因为后面没有 -d 带参数,所以,可恶的双引号就可以不考虑了。
执行结果如下,图上可以看到后面跟上参数 ?pretty,可以使得返回的json结果字符串格式化,看着舒服点。


解释:
除了索引、类型、标识符和版本,还可以看到说明“发现文件存在”(exists属性)以及此文档来源(_source属性)的信息。


更新文档

mac 环境下的命令行,我就不测试了。暂时没mac。
curl -XPOST http://localhost:9200/blog/article/1/_update -d '{ "script": "ctx._source.content = \"new content\"" }'
Windows cmd 环境下 加引号吧。。暂时的处理办法。
curl -XPOST "http://localhost:9200/blog/article/1/_update" -d "{ """script""": """ctx._source.content = \\\"new content\\\" """ }"

这个Windows下的命令暂时是错误的,至于,具体怎么修复这个bug,再续吧。









文章最后发布于: 2016-12-09 22:59:32
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览