Elasticsearch Mapping parameters(主要参数一览),springmvc实战教程

其示例如下:

PUT my_index/_mapping/_doc

{

“properties”: {

“tags”: {

“type”: “keyword”,

“eager_global_ordinals”: true

}

}

}

  • fielddata

为了解决排序与聚合,elasticsearch提供了doc_values属性来支持列式存储,但doc_values不支持text字段类型。因为text字段是需要先分析(分词),会影响doc_values列式存储的性能。es为了支持text字段高效排序与聚合,引入了一种新的数据结构(fielddata),使用内存进行存储。默认构建时机为第一次聚合查询、排序操作时构建,主要存储倒排索引中的词根与文档的映射关系,聚合,排序操作在内存中执行。因此fielddata需要消耗大量的JVM堆内存。一旦fielddata加载到内存后,它将永久存在。通常情况下,加载fielddata是一个昂贵的操作,故默认情况下,text字段的字段默认是不开启fielddata机制。在使用fielddata之前请慎重考虑为什么要开启fielddata。通常text字段用来进行全文搜索,对于聚合、排序字段,建议使用doc_values机制。

为了节省内存的使用,es提供了另一项机制(fielddata_frequency_filter),允许只加载那些词根频率在指定范围(最大,小值)直接的词根与文档的映射关系,最大最小值可以指定为绝对值,例如数字,也可以基于百分比(百分比的计算是基于整个分段(segment),其频率分母不是分段(segment)中所有的文档,而是segment中该字段有值的文档)。可以通过min_segment_size参数来指定分段中必须包含的最小文档数量来排除小段,也就是说可以控制fielddata_frequency_filter的作用范围是包含大于min_segment_size的文档数量的段。fielddata_frequency_filter的使用示例如下:

  • format

在JSON文档中,日期表示为字符串。Elasticsearch使用一组预先配置的格式来识别和解析这些字符串,并将其解析为long类型的数值(毫秒)。

日期格式主要包括如下3种方式:

1)自定义格式

2)date mesh(已在DSL查询API中详解)

3)内置格式

1、自定义格式

首先可以使用java定义时间的格式,例如:

PUT my_index

{

“mappings”: {

“_doc”: {

“properties”: {

“date”: {

“type”: “date”,

“format”: “yyyy-MM-dd HH:mm:ss”

}

}

}

}

}

2、date mesh

某些API支持,已在DSL查询API中详细介绍过,这里不再重复。

3、内置格式

elasticsearch为我们内置了大量的格式,如下:

  1. epoch_millis

时间戳,单位,毫秒。

  1. epoch_second

时间戳,单位,秒。

  1. date_optional_time

日期必填,时间可选,其支持的格式如下:

在这里插入图片描述

  1. basic_date

其格式表达式为 :yyyyMMdd

  1. basic_date_time

其格式表达式为:yyyyMMdd’T’HHmmss.SSSZ

  1. basic_date_time_no_millis

其格式表达式为:yyyyMMdd’T’HHmmssZ

  1. basic_ordinal_date

4位数的年 + 3位(day of year),其格式字符串为yyyyDDD

  1. basic_ordinal_date_time

其格式字符串为yyyyDDD’T’HHmmss.SSSZ

  1. basic_ordinal_date_time_no_millis

其格式字符串为yyyyDDD’T’HHmmssZ

  1. basic_time

其格式字符串为HHmmss.SSSZ

  1. basic_time_no_millis

其格式字符串为HHmmssZ

  1. basic_t_time

其格式字符串为’T’HHmmss.SSSZ

  1. basic_t_time_no_millis

其格式字符串为’T’HHmmssZ

  1. basic_week_date

其格式字符串为xxxx’W’wwe,4为年 ,然后用’W’, 2位week of year(所在年里周序号) 1位 day of week。

  1. basic_week_date_time

其格式字符串为xxxx’W’wwe’T’HH:mm:ss.SSSZ.

  1. basic_week_date_time_no_millis

其格式字符串为xxxx’W’wwe’T’HH:mm:ssZ.

  1. date

其格式字符串为yyyy-MM-dd

  1. date_hour

其格式字符串为yyyy-MM-dd’T’HH

  1. date_hour_minute

其格式字符串为yyyy-MM-dd’T’HH:mm

  1. date_hour_minute_second

其格式字符串为yyyy-MM-dd’T’HH:mm:ss

  1. date_hour_minute_second_fraction

其格式字符串为yyyy-MM-dd’T’HH:mm:ss.SSS

  1. date_hour_minute_second_millis

其格式字符串为yyyy-MM-dd’T’HH:mm:ss.SSS

  1. date_time

其格式字符串为yyyy-MM-dd’T’HH:mm:ss.SSS

  1. date_time_no_millis

其格式字符串为yyyy-MM-dd’T’HH:mm:ss

  1. hour

其格式字符串为HH

  1. hour_minute

其格式字符串为HH:mm

  1. hour_minute_second

其格式字符串为HH:mm:ss

  1. hour_minute_second_fraction

其格式字符串为HH:mm:ss.SSS

  1. hour_minute_second_millis

其格式字符串为HH:mm:ss.SSS

  1. ordinal_date

其格式字符串为yyyy-DDD,其中DDD为 day of year。

  1. ordinal_date_time

其格式字符串为yyyy-DDD‘T’HH:mm:ss.SSSZZ,其中DDD为 day of year。

  1. ordinal_date_time_no_millis

其格式字符串为yyyy-DDD‘T’HH:mm:ssZZ

  1. time

其格式字符串为HH:mm:ss.SSSZZ

  1. time_no_millis

其格式字符串为HH:mm:ssZZ

  1. t_time

其格式字符串为’T’HH:mm:ss.SSSZZ

  1. t_time_no_millis

其格式字符串为’T’HH:mm:ssZZ

  1. week_date

其格式字符串为xxxx-'W’ww-e,4位年份,ww表示week of year,e表示day of week。

  1. week_date_time

其格式字符串为xxxx-'W’ww-e’T’HH:mm:ss.SSSZZ

  1. week_date_time_no_millis

其格式字符串为xxxx-'W’ww-e’T’HH:mm:ssZZ

  1. weekyear

其格式字符串为xxxx

  1. weekyear_week

其格式字符串为xxxx-'W’ww,其中ww为week of year。

  1. weekyear_week_day

其格式字符串为xxxx-'W’ww-e,其中ww为week of year,e为day of week。

  1. year

其格式字符串为yyyy

  1. year_month

其格式字符串为yyyy-MM

  1. year_month_day

其格式字符串为yyyy-MM-dd

温馨提示,日期格式时,es建议在上述格式之前加上strict_前缀。

  • ignore_above

超过ignore_above设置的字符串不会被索引或存储。对于字符串数组,将分别对每个数组元素应ignore_above,超过ignore_above的字符串元素将不会被索引或存储。目前测试的结果为:对于字符串字符长度超过ignore_above会存储,但不索引(也就是无法根据该值去查询)。其测试效果如下:

public static void create_mapping_ignore_above() { // 创建映射

RestHighLevelClient client = EsClient.getClient();

try {

CreateIndexRequest request = new CreateIndexRequest(“mapping_test_ignore_above2”);

XContentBuilder mapping = XContentFactory.jsonBuilder()

.startObject()

.startObject(“properties”)

.startObject(“lies”)

.field(“type”, “keyword”) // 创建关键字段

.field(“ignore_above”, 10) // 设置长度不能超过10

.endObject()

.endObject()

.endObject();

// request.mapping(“user”, mapping_user);

request.mapping(“_doc”, mapping);

System.out.println(client.indices().create(request, RequestOptions.DEFAULT));

} catch (Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

public static void index_mapping_ignore_above() { // 索引数据

RestHighLevelClient client = EsClient.getClient();

try {

IndexRequest request = new IndexRequest(“mapping_test_ignore_above2”, “_doc”);

Map<String, Object> data = new HashMap<>();

data.put(“lies”, new String[] {“dingabcdwei”,“huangsw”,“wuyanfengamdule”});

request.source(data);

System.out.println(client.index(request, RequestOptions.DEFAULT));

} catch (Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

public static void search_ignore_above() { // 查询数据

RestHighLevelClient client = EsClient.getClient();

try {

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices(“mapping_test_ignore_above2”);

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

sourceBuilder.query(

// QueryBuilders.matchAllQuery() // @1

// QueryBuilders.termQuery(“lies”, “dingabcdwei”) // @2

// QueryBuilders.termQuery(“lies”, “huangsw”) // @3

);

searchRequest.source(sourceBuilder);

SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);

System.out.println(result);

} catch (Throwable e) {

e.printStackTrace();

} finally {

EsClient.close(client);

}

}

代码@1:首先查询所有数据,其_souce字段的值为:“_source”:{“lies”:[“dingabcdwei”,“huangsw”,“wuyanfengamdule”]},表名不管字符串的值是否大于ignore_above指定的值,都会存储。

代码@2:用超过ignore_above长度的值尝试去搜索,发现无法匹配到记录,表明并未加入到倒排索引中。

代码@3:用未超过ignore_above长度的值尝试去搜索,发现能匹配到记录。

注意:在es中,ignore_above的长度是字符的长度,而es其底层实现lucene是使用字节进行计算的,故,如果要反馈到lucnce,请注意关系。

  • ignore_malformed

试图将错误的数据类型索引到字段中,默认情况下会抛出异常,并拒绝整个文档。ignore_malformed参数,如果设置为真,允许错误被忽略。格式不正确的字段不建立索引,但是文档中的其他字 段正常处理。可以创建索引时,设置index.mapping.ignore_malformed 配置项来定义索引级别的默认值,其优先级为 字段级、索引级。

  • index

定义字段是否索引,true:代表索引,false表示不索引(则无法通过该字段进行查询),默认值为true。

  • index_options

控制文档添加到反向索引的额外内容,其可选择值如下:

  1. docs:文档编号添加到倒排索引。

  2. freqs:文档编号与访问频率。

  3. positions:文档编号、访问频率、词位置(顺序性),proximity 和phrase queries 需要用到该模式。

  4. offsets:文档编号,词频率,词偏移量(开始和结束位置)和词位置(序号),高亮显示,需要设置为该模式。

默认情况下,被分析的字符串(analyzed string)字段使用positions,其他字段使用docs;

  • fields

fields允许对同一索引中同名的字段进行不同的设置,举例说明:

PUT my_index

{

“mappings”: {

“_doc”: {

“properties”: {

“city”: {

“type”: “text”, // @1

“fields”: { // @2

“raw”: {

“type”: “keyword” // @3

}

}

}

}

}

}

}

@1:上述映射为city字段,定义类型为text,使用全文索引。

@2:为city定义多字段,city.raw,其类型用keyword。

主要就可以用user进行全文匹配,也可以用user.raw进行聚合、排序等操作。另外一种比较常用的场合是对该字段使用不同的分词器。

  • norms

字段的评分规范,存储该规范信息,会提高查询时的评分计算效率。虽然规范对计分很有用,但它也需要大量磁盘(通常是索引中每个字段的每个文档一个字节的顺序,甚至对于没有这个特定字段的文档也是如此)。从这里也可以看出,norms适合为过滤或聚合的字段。

注意,可以通过put mapping api 将norms=true更新为norms=false,但无法从false更新到true。

  • null_value

将显示的null值替换为新定义的额值。用如下示例做一个说明:

PUT my_index

{

“mappings”: {

“_doc”: {

“properties”: {

“status_code”: {

“type”: “keyword”,

“null_value”: “NULL” // @1

}

}

}

}

}

PUT my_index/_doc/1

{

“status_code”: null // @2

}

PUT my_index/_doc/2

{

“status_code”: [] // @3

}

GET my_index/_search

{

“query”: {

“term”: {

“status_code”: “NULL” // @4

}

}

}

代码@1:为status_code字段定义“NULL”为空值null;

代码@2:该处,存储在status_code为 null_value中定义的值,即"NULL"

代码@3:空数组不包含显式null,因此不会被null_value替换。

代码@4:该处查询,会查询出文档1。其查询结果如下:

{

“took”:4,

“timed_out”:false,

“_shards”:{

“total”:5,

“successful”:5,

“skipped”:0,

“failed”:0

},

“hits”:{

“total”:1,

“max_score”:0.2876821,

“hits”:[

{

“_index”:“mapping_test_null_value”,

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-wX8nQGTs-1711046457252)]
[外链图片转存中…(img-pqDDjGPo-1711046457253)]
[外链图片转存中…(img-TSGl5QZx-1711046457254)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-IwVchqoH-1711046457255)]

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

[外链图片转存中…(img-Pqv8mpS9-1711046457258)]

[外链图片转存中…(img-9R5EkfRZ-1711046457258)]

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值