您现在的位置:首页 > >

Elasticsearch 学* 3. Elasticsearch基本概念、RESTful API

发布时间:

3.1. 索引


索引(index)是 Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。


可以把索引看成关系型数据库的表,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。


Elasticsearch可以把索引放在一台机器或者分散在多台服务器上,每一个索引有一个或者多个分片(shard),每个分片可以有多个副本(replica)。


3.2. 文档


存储在Elasticsearch中的主要实体叫做 文档(document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。


Elasticsearch和MongoDB中的文档类似,都可以有不同的结构,但是Elasticsearch中的文档,相同的字段必须有相同的类型。


文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多指字段(multivalued)。


每个字段的类型,可以是文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。


3.3. 映射


所有文档写进索引之前都会进行分析,如何将输入的文本分割为字条,哪些字条又会被过滤,这种行为叫映射(mapping)。一般由用户自定义规则。


? ? 文档类型


在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论


每个文档有不同的接口。


不同的文档类型不能为相同的属性设置不同的类型。例如,在同一个索引中的所有文档类型中,一个叫title的字段必须具有相同的类型。


3.4? RESTful API?


在Elasticsearch 中,提供了功能丰富的RESTful API的操作,包括基本的CURD,创建索引,删除索引操作。


3.4.1 创建非结构化索引


在Lucene中,创建索引是需要定义字段名称以及字段的类型的,在Elasticsearch中提供了非结构化的索引,就是不



需要创建索引结构,即可写入数据到索引中,实际上在
Elasticsearch底层会进行结构化操作,此操作对用户是透明 的。


?


?


创建索引:


put /haoke

{
"settings": {
"index":{
"number_of_shards":"2",#分片数
"number_of_replicas":"2"#副本数
}
}
}






创建成功



?


?


删除索引:


#删除索引

DELETE /haoke

{
"acknowledged": true
}



3.5? 保存数据


# URL 规则 POST /{索引}/{类型}/{id}

POST haoke/user/1001

{
"id":1001,
"name":"张三",
"age":24,
"sex":"男"
}

# 响应
{
"_index": "haoke",
"_type": "user",
"_id": "1001",
"_version": 1,
"result": "created",
"_shards": {
"total": 3,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}


说明:非结构化的索引,不需要事先创建,直接插入数据默认创建索引。


不指定id插入数据:


# POST hoake/user
{
"name":"王五",
"age":20,
"sex":"女"
}

响应


{
"_index": "haoke",
"_type": "user",
"_id": "LgOccnEBK3PERGtN9-n7",
"_version": 1,
"result": "created",
"_shards": {
"total": 3,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}


自动生成id :? "_id":?"LgOccnEBK3PERGtN9-n7"


3.6? 修改数据


? ? ? ?在 elasticsearch 中,文档型数据是不会修改的,但是可以通过覆盖的方式进行更新。


在已有的数据中:将id为1001 的 name 改为 李四,age 改为30,sex 改为 女



?


PUT /haoke/user/1001

{
"id": 1001,
"name": "张三",
"age": 30,
"sex": "女"
}

返回结果:



此时,数据修改(覆盖成功)



?


现在还有一个问题,可以实现局部更新吗?-- 可以的


上面不是说文档型数据不支持更新吗?其实是这样的:


在内部依然会查询到这个数据,然后进行覆盖操作,步骤如下:


1).从旧文档中检索数据JSON


2) .? 修改它


3) .? 删除旧文档


4) .? 索引新文档


示例:


POST haoke/user/1001/_update

#请求参数
{
"doc":{
"age":40
}
}


此时数据局部更新成功



3.7 删除数据


?删除数据时,只需要发起 DELETE 请求即可


http://localhost:9200/haoke/user/1001/

返回参数:

{
"_index": "haoke",
"_type": "user",
"_id": "1001",
"_version": 4,
"result": "deleted",
"_shards": {
"total": 3,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}

# version + 1

# result : 表示已经删除

?如果删除一条不存在的数据,则会响应404;



说明:


删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的 时候才会在后台进行删除内容的清理

3.8 搜索数据


示例:根据id搜索数据


#请求参数 GET /haoke/user/LgOccnEBK3PERGtN9-n7

返回数据:
{
"_index": "haoke",
"_type": "user",
"_id": "LgOccnEBK3PERGtN9-n7",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": { #原始数据
"name": "王五",
"age": 20,
"sex": "女"
}
}

示例:查询所有数据


# 请求参数 GET /haoke/user/_search

返回参数:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "haoke",
"_type": "user",
"_id": "LgOccnEBK3PERGtN9-n7",
"_score": 1,
"_source": {
"name": "王五",
"age": 20,
"sex": "女"
}
}
]
}
}

示例:关键字查询,查询年龄等于30的用户


原始数据



传参


http://localhost:9200/haoke/user/_search?q=age:20

结果: 检索出 age=20 的两个人,王五和李四


{
"took": 40,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "haoke",
"_type": "user",
"_id": "LgOccnEBK3PERGtN9-n7",
"_score": 1,
"_source": {
"name": "王五",
"age": 20,
"sex": "女"
}
},
{
"_index": "haoke",
"_type": "user",
"_id": "MAPYcnEBK3PERGtNx-k7",
"_score": 1,
"_source": {
"id": 1003,
"name": "李四",
"age": 20,
"sex": "女"
}
}
]
}
}

?


热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报