Elasticsearch笔记——映射详解

      映射也就是 Mapping,用来定义一个文档以及其所包含的字段如何被存储和索引,可以在映射中事先定义字段和数据类型、分词器等属性。

      映射可以分为动态映射和静态映射。

一、动态映射:文档写入 elasticsearch中时,会根据字段的类型自动识别,这种机制成为动态映射。

Elasticsearch 自动推测字段类型规则
null  =》  没有字段被添加
true or false  =》  boolean类型
浮点类型数字  =》  float类型
数字  =》 long类型
JSON对象  =》  object对象
数组  =》  由数组里第一个非空值决定
string  =》  有可能是date类型(开启日期检测)、double或long类型、text类型、keyword类型
可以在创建索引指定Mapping时通过 dynamic 设置来控制是否自动新增字段。
"dynamic":"true"  默认值为true,自动添加字段
"dynamic":"false"  忽略新的字段
"dynamic":"strict"  严格模式,发现新的字段抛出异常
比如:索引books的mapping设置如下,当写入的文档出现了新的字段,新字段将会被忽略,但可以写入成功。
{
    "books":{
        "mappings":{
            "it":{
                "dynamic":false,
                "properties":{
                    "title":{"type":"text"}
                    "publish_date":{"type":"date"}
                }
            }
        }
    }
}
Elasticsearch碰到一个新的字符串类型的字段时,它会检查这个字符串是否包含一个可被识别的日期,如果是,会被识别为一个date类型的字段。
可以在索引的mapping设置中关闭这种日期检测机制。
"date_detection":false

二、静态映射:文档写入之前对字段的属性进行手工设置。

      Elasticsearch 字段类型分为 核心类型、复合型类型、地理类型和特殊类型

     核心类型分为字符串类型(string、text、keyword)、数字类型(long、integer、short、byte、double、float、half_float、scaled_float)、日期类型、布尔类型、二进制类型和范围类型;
     符合类型分为数组类型(array)、对象类型(object)、嵌套类型(nested);
     地理类型分为地理坐标(geo_point)、地理图形(geo_shape);
     特殊类型分为IP类型、范围类型(completion)、令牌奇数类型(token_count)、附件类型(attachment)、抽取类型(percolator);

1、string 5.X 版本之后不再支持string,使用会发出警告
2、如果一个字段需要被全文搜索的,应该设置为text类型;
   设置text类型之后,字段内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个一个词项;
   text类型的字段不用于排序。
3、类型为 keyword 的字段只能通过精确值搜索到;
   keyword 类型适用于索引结构化的字段,比如主机名、状态码等;
   通常用户过滤、排序、聚合。
4、数字类型:
   long  -2^63 至 2^63-1
   integer -2^31 至 2^31-1
   short  -32768 至 32767
   byte  -128 至 127
   double  64位双精度IEEE 754浮点类型
   float  32位单精度IEEE 754浮点类型
   half_float  16位半精度IEEE 754浮点类型
   scaled_float  缩放类型的浮点数
   
   对于float、half_float、和 scaled_float,-0.0 和 +0.0 是不同的值,使用 term 查询查找-0.0不会匹配到+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界+0.0也不会匹配-0.0;
   对于数字类型的字段,在满足需求的情况下,要尽可能选择范围小的数据类型,字段的长度越短,索引和搜索的效率越高。
   处理浮点数,优先考虑使用scaled_float类型, scaled_float是通过缩放因子把浮点数变成long类型。
5、JSON没有日期类型,所以Eleasticsearch可以接收如下3种形式的日期:
   格式化日期的字符串,如“2015-01-01”或“2015/01/01 12:10:13”;
   代表一个毫秒计时的时间戳;
   代表一个秒计时的时间戳。
   Elasticsearch内部存储的是毫秒计时的长整型数。
6、boolean
   字段类型是布尔类型的可以接受的值为true或false。
   5.4版本之前,可以接受被解释为true或false的字符串和数字;
   5.4版本之后,只接受true、false、"true"、"false"。
7、binary 类型接受base64编码的字符串,默认不存储(这里的存储是指store属性取值为false)也不可搜索。
8、array
   Elasticsearch没有专用的数组类型,默认情况下任何字段都可以包含一个或者多个值,但是一个数组中的值必须是同一种类型。
   (1) 字符数组:["one", "two"]
   (2) 整数数组:[1,2]
   (3) 嵌套数组:[1,[2,3]] 或 [1,2,3]
   (4) 对象数组:[{"name":"Mary","age":12},{"name":"John","age":12}]
9、object
   字段内容是JSON对象
10、nested
   nested 类型是 object类型中的一个特例,可以让对象数组独立索引和查询,Lucene没有内部对象的概念,所以Elasticsearch将对象层次扁平化,转化为字段名字和值构成的简单列表。
   使用 nested对象类型,可以阻止elasticsearch将对象扁平化,保持数组中每个对象的独立性。
11、geo_point
   geo_point 类型用于存储地理位置信息的经纬度,可以用于以下几种场景:
   (1) 查找一定范围内的地理位置;
   (2) 通过地理位置或者相对于中心点的距离来聚合文档;
   (3) 把距离因素整合到文档的评分中;
   (4) 通过距离对文档进行排序。
12、geo_ahspe
   geo_shape 类型可以存储一块区域,比如矩形、三角形或其他多边形。字段的内容是一个GeoJSON格式的数据。
13、ip
   ip 类型的字段可以用于存储IPv4或IPv6的地址。
14、range
   range类型的使用场景包括网页中的时间选择表单、年龄范围选择表单等;range类型及其取值范围:
   integer_range   -2^31 至 2^31-1
   float_range   32-bit IEEE754
   long_range   -2^63 至 2^63-1
   double_range   64-bit IEEE754
   date_range   64位整数,毫秒计时
15、token_count
   token_count 用于统计字符串分词后的词项个数,本质上是一个整数类型。
   比如:映射中指定name位text类型,增加name.length字段用于统计分词后词项的长度,类型为token_count,分词器为标准分词器,命令如下:
   {
    "mappings": {
        "<type>": {
            "properties": {
                "name": {
                    "type": "text",
                    "fields": {
                        "length": {"type": "token_count", "analyzer":"standard"}
                    }
                }
            }
        }
    }

四、元字段

1、_index
   多索引查询时,只需要在特定的索引名上进行查询,_index字段提供了遍历。
   _index支持对索引名进行 term 查询、terms 查询、聚合分析、使用脚本和排序;
   _index是一个虚拟字段,不会真的加载到Lucene索引中,可以对_index进行term、terms查询(如match、query_string、simple_query_string),但不支持perfix、wildcard、regexp和fuzzy查询。
2、_type
   每条索引的文档都有一个_type字段,可以根据_type进行查询,聚合、脚本和排序。
3、_id
   每条索引的文档都有一个_id字段,_id可以用于term查询、terms查询、match查询、query_string查询、simple_query_string查询,但不支持聚合、脚本和排序。
4、_uid
   _uid 是_type和_id的组合,取值为{type}#{id}。可以根据_uid 进行查询,聚合、脚本和排序。
5、_all
   _all 字段是把其他字段拼接在一起组成的超级字段,所有的字段内容用空格隔开,_all字段会被解析和索引,但不会被存储。

五、映射参数

1、analyzer
   analyzer 参数用于指定文本字段的分词器,对索引和查询都有效。
   分词器会把文本类型的内容转换为若干个词项,查询时分词器同样把查询字符串进行解析。
2、search_analyzer
   search_analyzer 指定查询时的字符串分词器,查询时analyzer指定的分词器会search_analyzer被覆盖。
3、boost 
   boost 字段用于设置字段的权重,可以在设置mappings参数时指定也可以在查询时动态在查询参数中指定。
4、copy_to
   copy_to 参数用于自定义_all字段,可以把多个字段的值复制到一个超级字段。
   比如把title字段和content字段的内容合并在一起生成一个full_content字段:
   {
        "mappings": {
            "<type>": {
                "properties": {
                    "title": {"type":"text","copy_to":"full_content"},
                    "content": {"type":"text","copy_to":"full_content"},
                    "full_content": {"type":"text"}
                }
            }
        }
    }
5、doc_values
   doc_values 参数是为了加快排序、聚合操作,在建立倒排索引的时候,额外增加一个列式存储映射,是一种空间换时间的做法,默认是开启的,对不需要聚合或者排序的字段可以关闭 doc_values节省空间。
   text类型不支持 doc_values。
6、dynamic
   dynamic 属性用于检测新发现的字段。
7、enabled
   enabled 设置为 false的字段,Elasticsearch 会跳过字段的内容,该字段只能从 _source中获取,但是不可以被搜索,字段可以是任意类型。
8、fielddata
   text字段在查询时会生成一个fielddata的数据结构,fielddata在字段首次被聚合、排序或者使用脚本的时候生成。
   text字段的 fielddata 属性默认是关闭的,开启 fielddata 非常消耗内存。
   索引解决的问题是“包含查询关键词的文档有哪些”,聚合解决的问题是“文档包含哪些词项”。
9、format
   Elasticsearch中的data类型支持多种格式,format参数用于指定日期格式。
10、ignore_above
   ignore_above 用于指定字段分词和索引的字符串最大长度,超过最大长度的值会被忽略,只用于keyword类型。
11、ignore_malformed
   ignore_malformed 可以设置用于忽略不规则数据。默认是false。
   如果默认字段属性的 ignore_malformed 设置为true,可以插入不符合指定type类型的内容,从而避免了因为数据类型不一致引发的错误。
12、include_in_all
   include_in_all 参数用于指定字段的值是否包含在_all字段中,默认是true开启的。
13、index
   index 属性指定字段是否索引,不索引也就不可搜索,取值是true或false。
14、index_options
   index_options 参数控制索引时存储哪些信息到倒排索引中。
   index_options参数取值
   docs   只存储文档编号,默认取值
   freqs   存储文档编号和词项频率
   positions   存储文档编号、词项频率、词项偏移位置,词项偏移位置可用于临近搜索和短语搜索。
   offsets   文档编号、词项频率、词项位置、词项开始和结束的字符位置都会被存储,offsets设置为true会使用 Postrings_highlighter。
15、null_value
   值为null的字段不索引也不可以搜索,null_value参数可以让值为null的字段显示的可搜索、可索引。
   也可以用于给当某个字段的内容为空时设置一个默认值。
16、fields
   fields 参数可以让同一个字段有多种不同的搜索方式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值