ElasticSearch实战 (二)CRUD以及bulk批量操作 api

来源:互联网 发布:java编程思想pdf 编辑:程序博客网 时间:2024/06/07 10:07

        生活中把事情做好,做好事情态度和思想认识很重要,生活就变得舒适,也会达到自己的目标。

        在对学习es api如何使用之前,我们可以先想一下es使用的数据传输协议和格式是怎样的,为什么会选择这样的协议和格式?还有就是它的数据存储是什么方式为什么比其它搜索方式快呢

        个人理解感觉es使用restful json 格式来传输数据,首先是es定位比较高,可以搜索网上一切东西包括视频、图片、文字等 因为restful 本意就是面向资源 ,互联网上的每个内容都可以称作资源,json数据格式是目前传输性能很高的格式,可以作为首选。

        es存储数据核心是应用倒排索引的方式,相反有倒就有正,例如有很多文章我们要搜索一个关键字,可能一篇文章中有多个也可能出现在多篇文章中,需要扫描全部文章并且每一篇文章全部扫描这将是很大的耗时操作,而es采用倒排索引即将关键字与文章建立索引关系,如在文章中的位置、次数等,如果想查找一个关键字最快复杂度为1就可以找到,之前的全部文章全部字数扫描复杂度差了很多倍,所以es的关键字搜索是很快的,官网的定义是这样的:

 

        ElasticSearch是一个分布式、Restful 的搜索和分析引擎能够解决越来越多的案例。

        知道了它的数据结构之后,我们可以用它来实现了一些实例了,如下:

        上一篇中给大家介绍了head、bigDesk插件,这里再介绍一个插件marvel ,这个插件功能更强大我们主要用它里面的提交json请求的小工具,方便我们操作事例。


        elasticsearch的crud操作

下面访问地址的域名+端口都已经省略,为了方便。
#创建索引并初始化PUT http://localhost:9200/library/{  "settings": {    "index": {          "number_of_shards":5,          "number_of_replicas":1    }  }}
#新建一个书籍类型的文档ID 1PUT /library/books/1{    "title":"ElasticSearch",    "name":{      "first":"Li",      "last":"Longsheng"    },    "publish_dae":"2016-12-13",    "price":"33.33"    }
#id也可以自动生成POST /library/books/{    "title":"ElasticSearch",    "name":{      "first":"Li",      "last":"Longsheng"    },    "publish_dae":"2016-12-13",    "price":"33.33"    }
#通过ID获取文档信息,如刚才新建的ID为1的文档GET  /library/books/1
返回结果:

{   "_index": "library",   "_type": "books",   "_id": "1",   "_version": 3,   "found": true,   "_source": {      "title": "ElasticSearch",      "name": {         "first": "Li",         "last": "Longsheng"      },      "publish_dae": "2016-12-13",      "price": "33.33"   }}
有时候我们仅仅想选择某一个或者多个字段而不是全部,像SQL语句一样,假如我们只想要title字段内容,可以这样写
#通过source获取指定字段GET  /library/books/1?_source=title
{   "_index": "library",   "_type": "books",   "_id": "1",   "_version": 3,   "found": true,   "_source": {      "title": "ElasticSearch"   }}
如果想要返回多个字段可以用逗号隔开,同样更新操作也类似,如
POST library/books/1?_update{  "title":"new title"}
该命令可以将文档1的title更新为new title。
最后是删除命令如 
#删除index type  docDELETE library/books/1



mget批量获取文档
GET /_mget{  "docs":[    {    "_index":"library",    "_type":"books",    "_id":1    },{    "_index":"frunt",    "_type":"food",    "_id":1,    "_source":["title"]    }  ]}
上面同时查询了library库也查获了frunt库,同时还可以显示指定字段。

elasticsearch 批量处理数据
        在实际项目应用中还是批量操作会常用一些,接下来我们就看一下批量如何操作,先来看一下批量操作的语法结构,可以简单概括为:{"请求行为":{基本元素}}/n
{"name":"lilongsheng",即请求体},如
       我们批量建一些文档 
#批量创建文档POST /library/books/_bulk{"index":{"_id":"10"}}{"title":"ten title10","price":"1.10"}{"index":{"_id":"11"}}{"title":"ten title11","price":"1.11"}{"index":{"_id":"12"}}{"title":"ten title12","price":"1.12"}{"index":{"_id":"13"}}{"title":"ten title13","price":"1.13"}{"index":{"_id":"14"}}{"title":"ten title14","price":"1.14"}{"index":{"_id":"15"}}{"title":"ten title15","price":"1.15"}
通过_mget批量获取结果,说明已经建好
{   "docs": [      {         "_index": "library",         "_type": "books",         "_id": "10",         "found": false      },      {         "_index": "library",         "_type": "books",         "_id": "11",         "_version": 1,         "found": true,         "_source": {            "title": "ten title11",            "price": "1.11"         }      },      {         "_index": "library",         "_type": "books",         "_id": "12",         "_version": 1,         "found": true,         "_source": {            "title": "ten title12",            "price": "1.12"         }      },……………………
bulk还可以同时执行新建修改和更新,如下
#可以同时批量增删改操作POST /library/books/_bulk{"delete":{"_index":"library","_type":"books","_id":"10"}}{"create":{"_index":"music","_type":"classic","_id":"1"}}{"title":"bule music"}{"index":{"_index":"music","_type":"classic"}}{"title":"auto generate id"}{"update":{"_index":"library","_type":"books","_id":"13"}{ "doc" : {"price":"111"} }

通过上面的操作实例我们可以实现对es数据结构的增删改查,也初步认识了es是如何来处理数据的,网上面的其它文章也大同小异,原理和性能需要在学习和使用中不断
完善和调优,在系统中使用还需要结合具体业务场景来解决具体问题,灵活使用为业务和系统提供实时的查询体验和数据分析等,是我们最终的应用目标。

        es操作api总结

         最近一段时间没有学习内容,以后每月都写几篇博客,来记录一下当作个总结。做技术的时间一长就会迷茫,多多积累,学会生活。


0 0
原创粉丝点击