生活中把事情做好,做好事情态度和思想认识很重要,生活就变得舒适,也会达到自己的目标。
在对学习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 1
PUT /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 doc
DELETE library/books/1
GET /_mget
{
"docs":[
{
"_index":"library",
"_type":"books",
"_id":1
},{
"_index":"frunt",
"_type":"food",
"_id":1,
"_source":["title"]
}
]
}
上面同时查询了library库也查获了frunt库,同时还可以显示指定字段。
在实际项目应用中还是批量操作会常用一些,接下来我们就看一下批量如何操作,先来看一下批量操作的语法结构,可以简单概括为:{"请求行为":{基本元素}}/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"} }
完善和调优,在系统中使用还需要结合具体业务场景来解决具体问题,灵活使用为业务和系统提供实时的查询体验和数据分析等,是我们最终的应用目标。
最近一段时间没有学习内容,以后每月都写几篇博客,来记录一下当作个总结。做技术的时间一长就会迷茫,多多积累,学会生活。