经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Elasticsearch » 查看文章
ES 14 - (底层原理) Elasticsearch内部如何处理不同type的数据
来源:cnblogs  作者:马瘦风  时间:2019/4/12 9:01:09  对本文有异议

1 type的作用

在Elasticsearch的索引(index)中, 通过标识元字段_type来区分不同的type, 所以我们可以把具有相同字段(field)的文档划分到同一个type下.

==> 因而_type也称作映射类型, 即每个type都有各自的mapping.

但即使是类似的数据, 也有可能存在不同的field, 比如:

商品中有电子商品有电压field;
服装商品有洗涤方式field;
生鲜商品有营养成分field… 这些不同的field要如何处理呢?

==> 在之前的博文中有提到过: 同一index的不同type中, 同名的field的映射配置必须相同. 这是为什么呢?

2 type的底层数据结构

Elasticsearch底层所使用的核心工具库——Lucene中并没有type的说法, 它在建立索引的时候, 会把所有field的值当做opaque bytes(不透明字节)类型来处理:

在存储document时, ES会将该document所属的type作为一个type字段进行存储;

在搜索document时, ES通过_type来进行过滤和筛选.

每个index中的所有type都是存储在一起的, 因此:

在Elasticsearch 6.0之前: 同一个index的不同type中, 同名的field的映射配置(_type)必须相同.

在Elasticsearch 6.0开始: 一个index中不能拥有多个type.

3 探究type的存储结构

说明: 从Elasticsearch 6.0开始, 不允许在一个index中创建多个type ——只能创建一个, 否则将发生错误:

  1. {
  2. "error": {
  3. "root_cause": [
  4. {
  5. "type": "illegal_argument_exception",
  6. "reason": "Rejecting mapping update to [website] as the final mapping would have more than 1 type: [manager, writer]"
  7. }
  8. ],
  9. "type": "illegal_argument_exception",
  10. "reason": "Rejecting mapping update to [website] as the final mapping would have more than 1 type: [manager, writer]"
  11. },
  12. "status": 400
  13. }

这里演示所用的版本是6.6.10, 特此说明.

3.1 创建索引并配置映射

  1. PUT website
  2. {
  3. "mappings": { // Elasticsearch 6.0之后的版本中, 只添加这一个type
  4. "writer": {
  5. "properties": {
  6. "id": { "type": "long" },
  7. "name": { "type": "text" },
  8. "age": { "type": "integer" },
  9. "sex": { "type": "text", "index": false }
  10. }
  11. },
  12. "manager": { // 省去此type
  13. "properties": {
  14. "id": { "type": "long" },
  15. "name": { "type": "text" },
  16. "age": { "type": "integer" },
  17. "sex": { "type": "text", "index": false },
  18. "authorize": { "type": "text", "index": false}
  19. }
  20. }
  21. }
  22. }

3.2 添加数据

  1. PUT website/writer/1
  2. {
  3. "id": 1001,
  4. "name": "tester",
  5. "age": 18,
  6. "sex": "female"
  7. }
  8. // Elasticsearch 6.0之后的版本中, 不添加下述文档:
  9. PUT website/manager/1
  10. {
  11. "id": 1001,
  12. "name": "shou feng",
  13. "age": 20,
  14. "sex": "male",
  15. "authorize": "all"
  16. }

3.3 查看存储结构

  1. // 搜索所有数据
  2. GET website/_search
  3. // 搜索结果如下:
  4. {
  5. "hits" : {
  6. "total" : 1,
  7. "max_score" : 1.0,
  8. "hits" : [
  9. {
  10. "_index" : "website",
  11. "_type" : "writer", // _type是writer
  12. "_id" : "1",
  13. "_score" : 1.0,
  14. "_source" : {
  15. "id" : 1001,
  16. "name" : "tester",
  17. "age" : 18,
  18. "sex" : "female"
  19. }
  20. },
  21. {
  22. "_index": "website",
  23. "_type": "manager", // _type为manager
  24. "_id": "1",
  25. "_score": 1,
  26. "_source": {
  27. "id": 1001,
  28. "name": "shou feng",
  29. "age": 20,
  30. "sex": "male",
  31. "authorize": "all"
  32. }
  33. }
  34. ]
  35. }
  36. }

4 关于type的最佳实践

将结构类似的type存放在同一个index下 —— 这些type的大部分field应该是相同的.

如果将两个field完全不同的type存入同一个index下, 在Lucene底层存储时, 每个document中都将有一大部分field是空值, 这将导致严重的性能问题, 并且占用磁盘空间:

例如: 上述website/writer的每个document中, 都有"authorize"字段, 只是它们的值都为空.

—— 从这个角度出发, 大概就能猜出 ES限制一个index中只能有一个type 的原因了吧, 也就是更方便地组织文档数据、节省磁盘空间??

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

原文链接:http://www.cnblogs.com/shoufeng/p/10691796.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号