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": "女"
                }
            }
        ]
    }
}
原文地址:https://www.cnblogs.com/haoyueqiang/p/12828192.html