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原创文章,未经本站允许不得转载。