type的底层数据结构

type的底层数据结构

type,是一个index中用来区分类似的数据的,但是可能有不同的fields,而且有不同的属性来控制索引建立、分词器
field的value,在底层的lucene中建立索引的时候,全部是opaque bytes类型,不区分类型的
也就是说lucene是没有type的概念的,在document中,实际上将type作为一个document的field来存储,即_type,es通过_type来进行type的过滤和筛选
一个index中的多个type,实际上是放在一起存储的,因此一个index下,不能有多个type重名,而类型或者其他设置不同的,因为那样是无法处理的

eg: type的数据结构

{
“ecommerce”: {
​ “mappings”: {
​ “elactronic_goods”: {
​ “properties”: {
​ “name”: {
​ “type”: “string”,
​ },
​ “price”: {
​ “type”: “double”
​ },
​ “service_period”: {
​ “type”: “string”
​ }
​ }
​ },
​ “fresh_goods”: {
​ “properties”: {
​ “name”: {
​ “type”: “string”,
​ },
​ “price”: {
​ “type”: “double”
​ },
​ “eat_period”: {
​ “type”: “string”
​ }
​ }
​ }
​ }
}
}

以下两个type 在底层存储的时候

{
“name”: “geli kongtiao”,
“price”: 1999.0,
“service_period”: “one year”
}

{
“name”: “aozhou dalongxia”,
“price”: 199.0,
“eat_period”: “one week”
}

同一type在底层的存储是这样子的,会把共有的东西糅合在一起

{
“ecommerce”: {
​ “mappings”: {
​ “_type”: {
​ “type”: “string”,
​ “index”: “not_analyzed”
​ },
​ “name”: {
​ “type”: “string”
​ }
​ “price”: {
​ “type”: “double”
​ }
​ “service_period”: {
​ “type”: “string”
​ }
​ “eat_period”: {
​ “type”: “string”
​ }
​ }
}
}

{
“_type”: “elactronic_goods”,
“name”: “geli kongtiao”,
“price”: 1999.0,
“service_period”: “one year”,
“eat_period”: “”
}

{
“_type”: “fresh_goods”,
“name”: “aozhou dalongxia”,
“price”: 199.0,
“service_period”: “”,
“eat_period”: “one week”
}

最佳实践,将类似结构的type放在一个index下,这些type应该有多个field是相同的
假如说,你将两个type的field完全不同,放在一个index下,那么就每条数据都至少有一半的field在底层的lucene中是空值,会有严重的性能问题, 和占用空间

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2020 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信