ElasticSearc(es)type索引

es中type(类型)是索引的逻辑分区。在索引中,可以定义一个或多个类型。Type由名称和Mapping组成,type表示一类相似的document。type是一个index中用来区分类似的数据的,类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立、分词器field的value,在底层的lucene是没有type的概念的,它建立索引的时候,全部是opaque bytes类型,不区分类型,实际上将type作为一个document的field来存储,即_type,es通过_type来进行type的过滤和筛选。

定义

elasticsearch诞生至今一共有四种search type:DFS_QUERY_THEN_FETCH,QUERY_THEN_FETCH,DFS_QUERY_AND_FETCH,QUERY_AND_FETCH。其中DFS_QUERY_AND_FETCH,QUERY_AND_FETCH两种类型在5.3版本之前的Search Request中会被用到,5.3版本到6.X版本只支持DFS_QUERY_THEN_FETCH,QUERY_THEN_FETCH,DFS_QUERY_AND_FETCH被废弃,QUERY_AND_FETCH过期,其中默认的search type为QUERY_THEN_FETCH,到7.X版本,再次废弃了QUERY_AND_FETCH。

1、query and fetch

向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最快的。因为相比下面的几种搜索方式,这种查询方法只需要去shard查询一次。但是各个shard返回的结果的数量之和可能是用户要求的size的n倍。

2、query then fetch(默认的搜索方式)

如果你搜索时,没有指定搜索方式,就是使用的这种搜索方式。这种搜索方式,大概分两个步骤,第一步,先向所有的shard发出请求,各分片只返回”足够“(预估是排序、排名以及分值相关)的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。

3、DFS query and fetch

这种方式比第一种方式多了一个initial scatter phrase步骤,有这一步,可以使distributed term frequencies for more accurate scoring达到更好的效果

4、DFS query then fetch

这种方式比第二种方式多了一个initial scatter phrase步骤

字段类型

一级分类 二级分类 具体类型

核心类型 字符串类型 text,keyword

整数类型 integer,long,short,byte

浮点类型 double,float,half_float,scaled_float

逻辑类型 boolean

日期类型 date

范围类型 range

二进制类型 binary

复合类型 数组类型 array

对象类型 object

嵌套类型 nested

地理类型 地理坐标类型 geo_point

地理地图 geo_shape

特殊类型 IP类型 ip

范围类型 completion

令牌计数类型 token_count

附件类型 attachment

抽取类型 percolator

实例

PUT /goods
{
   "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"
           }
            }
         }
      }
   }
}

新增2条数据

PUT /goods/electronic_goods/1{
  "name": "geli kongtiao",
  "price": 1999.0,
  "service_period": "one year"
}

PUT /goods/fresh_goods/1
{
  "name": "aozhou dalongxia",
  "price": 199.0,
  "eat_period": "one week"
}

底层存储

{
  "_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 里存储多种类型的数据,这样就可以减少 index 的数量了。在使用时,向每个文档加入 _type 字段,在指定 type 搜索时就会被用于过滤。使用 type 的一个好处是,搜索一个 index 下的多个 type,和只搜索一个 type 相比没有额外的开销,需要合并结果的分片数量是一样的。

同一索引下,不同type的数据存储其他type的field 大量空值,造成资源浪费,所以,不同类型数据,要放到不同的索引中。es9中,将会彻底删除type。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。