本文共 3823 字,大约阅读时间需要 12 分钟。
其中需要说明的是:
index定义字段的分析类型以及检索方式
store定义了字段是否存储
在《ES IN ACTION》中有这样一段描述:
意思是,在ES中原始的文本会存储在_source里面(除非你关闭了它)。默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可。
独立存储某个字段,在频繁使用某个特殊字段时很常用。而且获取独立存储的字段要比从_source中解析快得多,而且额外你还需要从_source中解析出来这个字段,尤其是_source特别大的时候。
不过需要注意的是,独立存储的字段越多,那么索引就越大;索引越大,索引和检索的过程就会越慢....
字符串类型,es中最常用的类型,
比较重要的参数:
index分析
store存储
数值类型,注意numeric并不是一个类型,它包括多种类型,比如:long,integer,short,byte,double,float,每种的存储空间都是不一样的,一般默认推荐integer和float。
重要的参数:
index分析
store存储
日期类型,该类型可以接受一些常见的日期表达方式,。
重要的参数:
index分析
store存储
format格式化
"date": { "type": "date", "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }
这个类型可以用来标识IPV4的地址,
常用参数:
index分析
store存储
布尔类型,所有的类型都可以标识布尔类型,
重要的参数:
index分析
store存储
JSON中没有date类型,es中的date可以由下面3种方式表示:
①格式化的date字符串,例如"2018-01-01"或者"2018-01-01 12:00:00"
②一个long型的数字,代表从1970年1月1号0点到现在的毫秒数
③一个integer型的数字,代表从1970年1月1号0点到现在的秒数
在es内部,date被转为UTC,并被存储为一个长整型数字,代表从1970年1月1号0点到现在的毫秒数
date类型字段上的查询会在内部被转为对long型值的范围查询,查询的结果类型是字符串。
假如插入的时候,值是"2018-01-01",则返回"2018-01-01"
假如插入的时候,值是"2018-01-01 12:00:00",则返回"2018-01-01 12:00:00"
假如插入的时候,值是1514736000000,则返回"1514736000000"。(进去是long型,出来是String型)
date格式可以在put mapping的时候用 format 参数指定,如果不指定的话,则启用默认格式,是"strict_date_optional_time||epoch_millis"。这表明只接受符合"strict_date_optional_time"格式的字符串值,或者long型数字。
strict_date_optional_time是date_optional_time的严格级别,这个严格指的是年份、月份、天必须分别以4位、2位、2位表示,不足两位的话第一位需用0补齐。不满足这个格式的日期字符串是放不进es中的。
date-opt-time = date-element ['T' [time-element] [offset]]
date-element = std-date-element | ord-date-element | week-date-element std-date-element = yyyy ['-' MM ['-' dd]] ord-date-element = yyyy ['-' DDD] week-date-element = xxxx '-W' ww ['-' e] time-element = HH [minute-element] | [fraction] minute-element = ':' mm [second-element] | [fraction] second-element = ':' ss [fraction] fraction = ('.' | ',') digit+实测,仅支持"yyyy-MM-dd"、"yyyyMMdd"、"yyyyMMddHHmmss"、"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式,不支持常用的"yyyy-MM-dd HH:mm:ss"等格式。注意,"T"和"Z"是固定的字符,在获取"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式字符串值时,不能直接以前面格式格式化date,而是需要多次格式化date并且拼接得到。
epoch_millis约束值必须大于等于Long.MIN_VALUE,小于等于Long.MAX_VALUE
date类型字段除了type参数必须指定为date外,还有一个常用的参数 format 。可以通过该参数来显式指定es接受的date格式,如果有多个的话,多个date格式需用||分隔。之后index/create/update操作时,将依次匹配,如果匹配到合适的格式,则会操作成功,并且查询时,该文档该字段也会以该格式展示。否则,操作不成功。如
PUT my_index
{ "mappings": { "_doc": { "properties": { "updated_date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } }
有时,我们需要通过json中的field和type来决定我们使用的mapping,这时,动态templates就派上用场了。动态templates和普通的mapping类似,它有一个自己的模式,如果一个field的名字匹配了该模式,该template就会使用,下面是定义模式的两种手段:
match
: template在field名匹配的时候起用。unmatch
: template在field名不匹配的时候起用。当然,也可以使用path_match
和path_unmatch对嵌套field使用。
定义field的使用可以使用
{name}
: document最初写入数据的field的名字。{dynamic_type}
: document最初写入数据的field的type。需要提醒的是,ES是按照你写的templates的顺序来匹配的,因此,匹配范围越广的应该放在越后,不然就会将所有后面的正则拦掉了。例如*应该放在最后
{ "mappings" : { "article" : { "dynamic_templates" : [ { "template_test": { "match" : "*", "mapping" : { "type" : "multi_field", "fields" : { "{name}": { "type" : "{dynamic_type}"}, "str": {"type" : "string"} } } } } ] } } }
转载地址:http://vuhdi.baihongyu.com/