Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据

Elasticsearch实战学习笔记系列  Elasticsearch索引、更新和删除数据

目录

Elasticsearch实战学习笔记系列  Elasticsearch索引、更新和删除数据

一、使用映射来定义各种文档

1.总览

2.检索和定义映射

(1)获取目前的映射

(2)定义新的映射

3.扩展现有的映射

二、定义文档字段的核心类型

1.字符串类型

2.数值类型

3.日期类型

4.布尔类型

三、数组和多字段

1.数组

2.多字段

四、使用预定义字段

1.控制如何存储和搜索文档

(1)存储原有内容的 source

(2)仅仅返回源文档的某些字段

(3)索引一切的_all

2.识别文档

(1)为文档提供ID

(2)在文档中存储索引名称

五、更新现有文档

1.使用更新API

(1)方法一: 发送部分文档

(2)方法二: 使用upsert来来创建尚不存在的文档

(3)方法三: 通过脚本来更新文档

2.通过版本来实现并发控制

(1)冲突发生时自动重试更新操作

(2)索引文挡的时候使用版本号

六、删除数据

1.删除文档

(1)删除单个文档

(2)删除映射类型和删除查询匹配的文挡

2.删除索引

3.关闭索引

系列目录

Elasticsearch实战学习笔记(一) Elasticsearch介绍

Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)

Elasticsearch实战学习笔记(三) Elasticsearch深入功能

Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据

Elasticsearch实战学习笔记(五) Elasticsearch搜索数据

Elasticsearch实战学习笔记(六) Elasticsearch分析数据

Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索

Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系


一、使用映射来定义各种文档

1.总览

Elasticsearch 是基于文档的 ,而文档是由字段和其组成的,这些使得文档是自我完备的,就好像一张数据表中有行和列一样

  • 每篇文档属于一种类型,而每种类型属于一个索引.
  • 数据的逻辑划分来看 ,可以认为索引数据库,而类型是数据库中的
  • 类型包含了映射中每个字段的定义,只提供逻辑上的分离
  • 映射包括了该类型的文档中可能出现的所有字段,并告诉Elasticsearch如何索引一篇文档的多个字段

类型

在 Elasticsearch 中,不同类型的文档没有物理上的分离 。在同一个 Elasticsearch 索引中的所有文挡,无论何种类型,都是存储在属于相同分片的同一组文件中。 一份分片就是一个 Lucene 的索引, 类型的名称是 Lucene 索引中一个字段,所有映射的所有字段都是 Lucene 索引中的 字段。

类型的概念是针对Elasticsearch 的一层抽象,但不属于 Lucene。这使得你可以轻松地在同 一个索引中拥有不同类型的文档 ,Elasticsearch 负责分离这些文档

2.检索和定义映射

Elasticsearch会自动识别字段,并相应自动地调整映射

(1)获取目前的映射

为了查看某个字段类型 当前的映射,向该类型URL 的_mapping 接口发送一个 HTTP GET请求

curl 'localhost:9200/get-together/group/_mapping?pretty'

(2)定义新的映射

为了定义一个映射,可以使用和前面一样的 URL, 但是应该发送一个 HTTP PUT 请求而不是GET 请求 。需要在请求中指定 JSON 格式的映射,格式和获取的映射相同 。

3.扩展现有的映射

在现有的基础上再设置一个映射, Elasticsearch 会将两者进行合并如外加定义的一个新宇段


二、定义文档字段的核心类型

1.字符串类型

  1. 如果index被设置为analyzed,分析器将所有字符转为小写,并将字符串分解为单词
  2. 如果index被设置为not_analyzed分析过程被略过整个字符串被当作单独的词条进行索引
  3. 如果index被设置为no索引就被略过了,也没有词条产生,因此无法在那个字段上进行搜索

2.数值类型

数值类型可以是浮点数,也可以是非浮点数。 如果不需要小数,可以选择 byte、 short、 int 或者 long。 如果确实需要小数,你的选择是 float 和 double

如果不知道所需要的整型数字取值范围,或者是浮点数字的精度,让Elasticsearch自动检测映射更为安全: 为整数值分配 long,为浮点数值分配 double

3.日期类型

date 类型用于存储日期和时间,通常提供一个表示日期的字符串,例如 2013-12-25T09:00 : 00。 然后, Elasticsearch 解析这个字符串,然后将其作为 long 的数值存 入 Lucene 的索引 。当搜索文档的时候,你仍然提供 date 的字符串,在后台 Elasticsearch将这些字符串解析井按照数值来处理。 这样做的原因是和字符串相比,数值在存储和处理时更快

4.布尔类型

boolean 类型用于存储文档 中的 true/false (真/假)


三、数组和多字段

1.数组

如果要索引拥有多个值的字段 ,将这些值放入方括号中。

curl - XPUT 'localhost : 9200/blog/posts/l' -d '{
    "tags": ["first","initial"]
}'

映射将标签( tags )字段定义为字符串型,和单个值同样处理,所有核心类型都支持数组,无须修改映射,既可以使用单一值,也可以使用数组

2.多字段

多字段允许使用不同的设置,对同一项数据索引多次。无须重新索引数据,就能将单字段升级到多字段。搜索 analyzed版本的标签字段,就像搜索其他字符串一样。如果要搜索 not analyzed 版本的字段(仅仅精确匹配原有的标签),就要指定完整的路径 : tags.verbatim。

 


四、使用预定义字段

预定义的三个方面

  • 通常不用部署预定义的字段, Elasticsearch会做这件事情
  • 揭示了字段相关的功能,例如_ttl (存活时间time to live )字段使得 Elasticsearch 可以在指定的时间过后删除某些文档
  • 预定义的字段总是以下划线_开头

预定义的四种类型

  • 控制如何存储和搜索你的文档
  • 唯一识别文档
  • 为文档增加新的属性
  • 控制文档路由到哪些分片

1.控制如何存储和搜索文档

(1)存储原有内容的 source

_source 字段按照原有格式来存储原有的文档. _source 字段的 enabled 可以设置为 true 或者 false,来指定是否想要存储原始的文档,默认情况下是 true

(2)仅仅返回源文档的某些字段

当检索或者搜索某篇文档的时候,可以要求 Elasticsearch 只返回特定的字段,而不是整个_source。

curl -XGET 'localhost:9200/get-together/group/l?pretty&fields=name'
{
    "_index":"get-together", 
    "_type":"group",
    "_id":"l",
    "version":1, 
    "found":true, 
    "fields":{
        "name":["Denver Clojure"]
    }
}

(3)索引一切的_all

就好像_source 是存储所有的信息, _all 是索引所有的信息 。 当搜索_all 字段的时候, Elasticsearch 将在不考虑是哪个字段匹配成功的情况下,返回命中的文档 。

从 URL上运行搜索时如果不指定字段名称,系统默认情况下将会在_all上搜索

curl 'localhost:9200/get-together/group/_search?q=elasticsearch'

如果总是在特定的字段上搜索,可以通过设置 enabled 为 false 来关闭_all

"events":{
    "all":{"enabled": false}
}

2.识别文档

为了识别同一个索引中的某篇文档,Elasticsearch使用_uid 中的文档类型ID结合体。 uid 宇段是由_id _type 字段组成

类型和ID的分离是一种抽象,通过类型的区分使得针对不同结构的运作更为容易。 _id通常从_uid抽取出来,但是_type必须单独索引,这样当搜索特定类型时,系统才能轻松地根据类型来过滤文档。

(1)为文档提供ID

可以依靠 Elasticsearch 来生成唯一的 ID,可以在回复中看到自动生成的ID

(2)在文档中存储索引名称

除了 ID 和类型,为了让 Elasticsearch在文档中存储索引的名称,请使用_index 字段 。和 _id、 _type 一样 ,可以在搜索或者是 GET 请求的结果中看到 _index,它也不是来源于字段的内容。 默认情况下 index 是关闭的


五、更新现有文档

  1. 检索现有的文档
  2. 进行指定的修改
  3. 删除旧的文档,在其原有位直索引新的文档 (包含修改的内容)

1.使用更新API

(1)方法一: 发送部分文档

如果之前整个文档是不存在的,那么更新操作会失败,并提示文档缺失 。

curl -XPOST  'localhost:9200/get-together/group/2/ update' -d '{ 
    "doc":{
        "organizer":"Roy"
    }
}

(2)方法二: 使用upsert来来创建尚不存在的文档

如果被更新的文档不存在,可以在JSON的upsert部分中添加一个初始文档用于索引 。

curl - XPOST 'localhost:9200/get-together/group/2/_update' -d '
{ 
    "doc":{  
        "organizer":"Roy"
    },
    "upsert":{
        "name":"Elasticsearch Denver", 
        "organizer":"Roy"
    }
}'

(3)方法三: 通过脚本来更新文档

默认的脚本语言是 Groovy

2.通过版本来实现并发控制

Elasticsearch 支持并发控制 ,为每篇文档设置了一个版本号 。 最初被索引的文档版本是1。 当更新操作重新索引它的时候,版本号就设置为2了。 如果与此同时另一个更新将版本设 置为2,那么就会产生冲突,目前的更新也会失败(否则它就会像图 3-4 那样,将另一个更新覆盖)。 可以重试这个更新操作,如果不再有冲突,那么版本就会设置为 3

  1. 索引文档然后更新它
  2. 更新 1 在后台启动,有一定时间的等待(睡眠)
  3. 在睡眠期间,发出另一个update 的命令(更新 2 )来修改文档 。 变化发送在更新1获取原有文档之后、重新索引回去之前 。
  4. 由于文档的版本已经变为2,更新1就会失败,而不会取消更新2所做的修改。 这个时候你有机会重试更新 1,然后进行版本为 3 的修改

这种并发控制称为乐观锁,因为它允许并行的操作并假设冲突是很少出现的,真的出现时就抛出错误 。它和悲观锁是相对的,悲观锁通过锁住可能引起冲突的操作,第一时间预防冲突

(1)冲突发生时自动重试更新操作

(2)索引文挡的时候使用版本号


六、删除数据

  1. 删除单个文档或者一组丈档  Elasticsearch只是将它们标记为删除,所以 它们不会再出现于搜索结果中,稍后 Elasticsearch 通过异步的方式将它们彻底地从索引
    中移出。
  2. 删除整个索引  主要的工作就是移除和那个索引相关的所有文件,几乎是瞬间就能完成 。
  3. 关闭索引  关闭的索引不允许读取或者写入操作数据也不会加载到内存。 这和删除 Elasticsearch数据类似,但是索引还是保留在磁盘上。它也很容易恢复,只要再次打开关闭的索引 。

1.删除文档

(1)删除单个文档

为了删除单一的文档,需要向其ULR发送HTTP DELETE请求

curl -XDELETE 'localhost:9200/online-shop/shirts/1'

(2)删除映射类型和删除查询匹配的文挡

也可以删除整个映射类型,包括映射本身和其中索引的全部文档 。

curl -XDELETE 'localhost:9200/online-shop/shirts'

2.删除索引

为了删除一个索引,需要发送一个 DELETE 请求到该索引的 URL

curl -XDELETE 'localhost:9200/get-together/'

使用 curl -DELETE localhost: 9200/_all 会删除所有的文档

3.关闭索引

为了关闭在线商店的索引,发送 HTTP POST 请求到该索引 URL 的 _close 端点

curl - XPOST 'localhost:9200/online-shop/close'

为了再次打开,要运行类似的命令,只是将端点换为 _open : 

curl - XPOST 'localhost:9200/online-shop/_open'

系列目录

Elasticsearch实战学习笔记(一) Elasticsearch介绍

Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)

Elasticsearch实战学习笔记(三) Elasticsearch深入功能

Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据

Elasticsearch实战学习笔记(五) Elasticsearch搜索数据

Elasticsearch实战学习笔记(六) Elasticsearch分析数据

Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索

Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值