Elasticsearch实战学习笔记系列 Elasticsearch索引、更新和删除数据
目录
Elasticsearch实战学习笔记系列 Elasticsearch索引、更新和删除数据
系列目录
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.字符串类型
- 如果index被设置为analyzed,分析器将所有字符转为小写,并将字符串分解为单词
- 如果index被设置为not_analyzed,分析过程被略过,整个字符串被当作单独的词条进行索引 。
- 如果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.使用更新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 在后台启动,有一定时间的等待(睡眠)
- 在睡眠期间,发出另一个update 的命令(更新 2 )来修改文档 。 变化发送在更新1获取原有文档之后、重新索引回去之前 。
- 由于文档的版本已经变为2,更新1就会失败,而不会取消更新2所做的修改。 这个时候你有机会重试更新 1,然后进行版本为 3 的修改
这种并发控制称为乐观锁,因为它允许并行的操作并假设冲突是很少出现的,真的出现时就抛出错误 。它和悲观锁是相对的,悲观锁通过锁住可能引起冲突的操作,第一时间预防冲突
(1)冲突发生时自动重试更新操作
(2)索引文挡的时候使用版本号
六、删除数据
- 删除单个文档或者一组丈档 Elasticsearch只是将它们标记为删除,所以 它们不会再出现于搜索结果中,稍后 Elasticsearch 通过异步的方式将它们彻底地从索引
中移出。- 删除整个索引 主要的工作就是移除和那个索引相关的所有文件,几乎是瞬间就能完成 。
- 关闭索引 关闭的索引不允许读取或者写入操作,数据也不会加载到内存。 这和删除 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分析数据