上一篇向大家讲解了Elasticsearch的部署安装和基本设置,这篇文章就和大家一起熟悉下Elastic的数据库操作,和普通数据库不同,es库需要公告restful接口进行数据操作;
在这之前,说一下基本的概念
基本概念
1.节点和集群
Elasticsearch本身就是一个分布式的数据库,使多台服务器作为一个整体工作,每台服务器上都运行Elasticsearch的实例,单台Elasticsearch实例称为节点,多个节点组成了集群
2.Index
Elasticsearch的顶级单位叫Index(类似mysql中的一个库),Index的名字必须小写;
3.Document
Document是Index的组成元素,多个Document构成了Index,Document使用json格式来表示,比如下面的例子,同一个Index,Document的结构最好相同,也可以不同,相同的话搜索效率比较高;
{ "user": "机智的Coder", "title": "Coder", "desc": "无所不能的Coder"}
4.Type
Document可以分组(千万不要和mysql中的分组类比,压根就不是一回事),Type用来将Index中的Document分组过滤;它是一个虚拟的分组,比如一个存储程序员的Index中,可以按职业分成php程序员和python程序员两个组(或者更多);不过未来Elastic在7版本中会考虑移除Type
查看每个Index中的所有Type $ curl 'localhost:9200/_mapping?pretty=true'
Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -> Indices -> Types -> Documents -> Fields
基本操作
基础说完了,开始实践,第一步当然是启动Elastic了,bin目录下启动
[bohongtao@wtstrain bin]$ ./elasticsearch
启动成功后,开始学习数据操作,当然,以下的操作推荐大家使用postman进行请求接口;
1.新建Index
Index的名字--coder务必小写,创建成功返回如下
[bohongtao@wtstrain ~]$ curl -X PUT 'localhost:9200/coder' {"acknowledged":true,"shards_acknowledged":true}[bohongtao@wtstrain ~]$
2.删除Index
[bohongtao@wtstrain ~]$ curl -X DELETE 'localhost:9200/coder' {"acknowledged":true}[bohongtao@wtstrain ~]$
3.插入数据
向coder里面的php分组插入一条数据,并制定id为1
[bohongtao@wtstrain ~]$ curl -X PUT 'localhost:9200/coder/php/1' -d ' > { > "user": "张三", > "title": "PHP工程师", > "desc": "php是世界上最好的语言" > }'
返回如下json对象表示插入成功,会给出Index ,Type , Id,Version等信息
{ "_index":"coder", "_type":"php", "_id":"1", "_version":1, "result":"created", "_shards": {"total":2,"successful":1,"failed":0}, "created":true } [bohongtao@wtstrain ~]$
注意:1.id不一定是数字
2.如果Index不存在,会自动创建
3.可以不指定id,会返回随机的ID
如下也可以使用post请求,添加一个记录,如下;
[bohongtao@wtstrain ~]$ curl -X POST 'localhost:9200/coder/php/1' -d ' > { > "user": "李四", > "title": "PHP工程师", > "desc": "php是世界上最好的语言" > }'
4.查询记录
查询某条数据
请求的URL中pretty=true表示以易读的格式返回
found:true 表示查询成功
_source 返回原始记录
[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/1?pretty=true' { "_index" : "coder", "_type" : "php", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "user" : "李四", "title" : "PHP工程师", "desc" : "php是世界上最好的语言" } }
查询所有的数据
[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/_search' {"took":2,"timed_out":false,"_shards":{"total":5,"successful":5, "failed":0},"hits":{"total":1,"max_score":1.0, "hits":[{"_index":"coder","_type":"php","_id":"1","_score":1.0,"_source": { "user": "李四", "title": "PHP工程师", "desc": "php是世界上最好的语言" }}]}} [bohongtao@wtstrain ~]$
其中took表示耗时多少毫秒,timeout表示是否超时,hits表示命中的记录
total返回记录数,max_score表示最高匹配程度
hits返回记录组成的数组
5.删除记录
[bohongtao@wtstrain ~]$ curl -X DELETE 'localhost:9200/coder/php/1' {"found":true,"_index":"coder","_type":"php","_id":"1","_version":3,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0}} [bohongtao@wtstrain ~]$
6.更新记录
其实更新和上诉的插入记录是一致的,指定id为1直接覆盖已有的id为1的数据,但是如下字段会发生变化
"_version" : 2, "result" : "updated", "created" : false
基本操作都说完了,下面说下高级点的全文搜索
多说一句,Elastic的搜索效率远远远远高于mysql
[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/_search' -d ' > { > "query" : { "match" : { "desc" : "php" }} > }' {"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.28488502,"hits":[{"_index":"coder","_type":"php","_id":"1","_score":0.28488502,"_source": { "user": "李四", "title": "PHP工程师", "desc": "php是世界上最好的语言" }}]}} [bohongtao@wtstrain ~]$
可以指定参数size调整返回结果的数量
curl 'localhost:9200/coder/php/_search' -d ' { "query" : { "match" : { "desc" : "php" }}, "size": 1 }'
可以指定from字段,指定开始位置(默认从位置0开始搜索)
curl 'localhost:9200/coder/php/_search' -d ' { "query" : { "match" : { "desc" : "php" }}, "size": 1, "from":1 }'
逻辑运算 or
curl 'localhost:9200/coder/php/_search' -d ' { "query" : { "match" : { "desc" : "php 语言" }} }'
逻辑运算 and
curl 'localhost:9200/coder/php/_search' -d ' { "query": { "bool": { "must": [ { "match": { "desc": "php" } }, { "match": { "desc": "语言" } } ] } } }'
基本的数据操作就介绍到这里。