一、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条结果开始返回一条。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐