一、ES概念
Elasticsearch是一个开源的搜索引擎,分布式的实时文件存储,可以处理PB级结构化或非结构化数据, 我们可以通过简单的RESTful API来完成各种操作。
1.1 Node 与 Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node),一组节点构成一个集群(cluster)。
1.2 Index
Index(索引),对应关系型数据库的一个数据库,索引必须为小写。使用下面的命令可以查询当前节点中所有索引:
curl -X GET 'http://localhost:9200/_cat/indices?v'
查出来提示 health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
说明还未创建索引。
1.3 type
type,一个逻辑分组,我的理解type就相当于一个类,这个类下的数据都是这个类的实例,也就是这个分组下的数据格式都相似。
1.4 Document
Document(文档),是一组json数据,类似与代码中一个类的所有属性。如:
{ "name": "James", "age": 34 }
ES就是面向文档的,和代码中面向对象类似,它就是存储一个个文档(对象)。
二、ES数据操作
2.1 添加和更新数据
比如需要存储上面的数据,命令如下:
curl -H "Content-Type: application/json" -X PUT http://localhost:9200/project/person/1 -d '{"name":"James","age":35}'
其中 project就是一个index(相当于一个库),person是type,相当于一个类(表),1是这个文档的id(表中一条数据的id)。执行上面的操作时如果index、type、id等不存在则会自动创建,如果这条id的数据已经存在则是更新这条数据。
服务器返回如下:
{
"_index": "project",
"_type": "person",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息。其中result的值为updated,说明这条id的数据已经存在,所以这次再插入就是更新。
新增记录的时候,如果不指定 Id,这时要改成 POST 请求,会随机生成一个id.
2.2 删除数据
删除数据命令如下:
curl -X DELETE http://localhost:9200/project/person/1
2.3 查询记录
查询命令如下:
curl http://localhost:9200/project/person/1
后面可以加参数,
?pretty=true 表示以易读格式返回
返回的易读格式如下:
{
{
"_index" : "project",
"_type" : "person",
"_id" : "1",
"_version" : 1,
"_seq_no" : 4,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "James",
"age" : 35
}
}
如果index、type、id不正确返回的found值就是false。
三、ES中的搜索
3.1 查询全部数据
使用 GET 方法,直接请求/Index/Type/_search,就会返回所有记录。
curl http://localhost:9200/project/person/_search?pretty=true
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "project",
"_type" : "person",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "James",
"age" : 35
}
}
]
}
}
返回结果中:
- took字段表示该操作的耗时(单位为毫秒)。
- timed_out字段表示是否超时。
- hits字段表示搜到的记录,数组形式。
- total:返回记录数,本例是1条。
- max_score:最高的匹配程度,本例是1.0。
6.2 条件查询
由于查询条件是json,前面要加上请求头,参数为:{“query”:{“match”:{“age”:35}}},表示查询所有age为35的数据。
curl -H "Content-Type: application/json" http://localhost:9200/project/person/_search?pretty=true -d '{"query":{"match":{"age":35}}}'
默认一次返回10条结果,可以通过size字段改变这个设置:
参数{"query":{"match":{"age":35}},"from":10, "size":1}
表示从第10条结果开始返回一条。