Elasticsearchmapping本文主要介绍了Elasticsearchmapping的概念,它是什么以及如何自定义,然后介绍了动态的机制如果将Elasticsearch中的mapping比作mysql,就是mysql中table的scheme,即表结构的定义,一般在关系型数据库mysql中插入数据前需要定义表的scheme,不能插入scheme中没有定义的字段,es会自动帮你创建不为索引映射定义一个映射,也可以使用dynamic来控制是否允许在映射中灵活动态的添加属性1.什么是MappingMapping类似于mysql中schema的定义,就是定义名称索引属性字段中的字段,定义索引中字段的数据类型,如text,long,keyword....定义索引中字段的倒排索引相关配置(Analyzer...)一个Mapping属于anindexedType每一个文档都属于一个TypeAType有一个Mapping定义从es7.0开始,Mapping中不需要指定Type信息,因为7.0之后,只有_docType2.es会自动创建一个mapping。当我们创建一个索引时没有指定映射,es会默认为这个索引创建一个映射。创建索引并索引一段数据PUTblog/_doc/1{"name":"esmapping","type":"es","desc":"esmappingdesc","author":"johnny","word_count":50,"create_time":"2022-10-31"}GETblog/_mapping#查看一个es自动生成的映射从上面可以看出属性是ES自动创建对应映射的,包括每个属性的类型等,那为什么要这样转化,什么时候是文本,什么时候是长的下面会介绍自动识别的ES中的映射类型3.映射类型自动识别JSON类型Elasticsearch类型字符串1.匹配的日期格式会设置为Date2.匹配的数字设置为float或long,该选项默认关闭3.设置为Text,并添加关键字subfieldintegerlongfloatingpointnumberfloatBooleanbooleanobject对象数组由第一个非空值的类型定义。比如["jack","johnny"],类型是Text,空值会被忽略???在我实验的7.18版本中,如果设置为null,则会被忽略自动定义为Text,具体不清楚。4.自定义创建mapping除了上面介绍的es自动创建mapping之外,还可以自定义索引的mapping,更加灵活,满足业务需求等,注意之前的版本需要在mappings中下面还有一层type,比如mappings:{"_doc":{"properties":{xxx}}}但是7.0之后type就不需要PUTblog_info{"mappings":{"properties":{"blog_name":{"type":"keyword"},"blog_desc":{"type":"text"},"blog_word_count":{"type":"long"},"create_time":{"type":“日期”}}}}其中,text和keyword类型,text类型字段在添加或修改文档时会自动分词,而keyword不会,它会保存插入的原文索引一段数据PUTblog_info/_doc/1{“blog_name”:“esmapping”,“blog_desc”:“esmappingdesc”,“blog_word_count”:12,“blog_auther”:“johnny”,“create_time”:“2022-10-31”}5。mapping属性设置了analyzertokenizer默认的分词器标准,会一个一个的拆中文,肯定不适合,如果是索引中文信息,需要设置字段的分词器,PUTblog_info{"mappings":{"properties":{"blog_desc":{"type":"text","analyzer":"ik_smart"//为这个字段设置分词器}}}}大多数分词器需要作为插件安装es中的ins,后面会出专门的文章6.设置mapping属性的boost权重,在es中搜索时会有一个相关的计算过程。如果你不设置每个字段默认的boost权重为1.0,如果你想根据广告量增加分数,那么你可以设置boost来提高搜索,自然排名靠前PUTblog_info{"mappings“:{“属性”:{“put_amount”:{“类型”:"text","boost":"5"}}}}7.映射属性设置copy_to该属性允许将多个字段复制到指定字段,可以搜索该字段,但是_source中不显示PUTpeope{“映射”:{“属性”:{“名字”:{“类型”:“文本”,“复制到”:“全名”},“姓氏”:{“类型”:“文本”,“复制到”:“full_name"//copy_to指定字段},"full_name":{"type":"text"}}}}GETpeope/_search?q=full_name:johnny//使用full_name进行搜索//可以看到有没有full_name返回但你可以用它来搜索"_source":{"first_name":"johnny","last_name":"qiang"}8.映射属性设置index通过为属性设置index来控制该字段是否参与索引,默认为true,如果index设置为false则该索引不能被记录,也不能被搜索PUTpeope{"mappings":{"properties":{"first_name":{"type":"text","index":false//设置索引false},"last_name":{"type":"text"}}}}POSTpeope/_doc{"first_name":"johnnyisgoodname","last_name":"qiang"}注意url-search找不到但是不报错,而requestbody查询indexfalse的字段会报错GETpeope/_search?q=first_name:johnny//SearchisnotTothedatabecause//"hits":[]GETpeope/_search?q=last_name:johnny//可以看到因为last_name是默认索引,所以可以搜索////"hits":[//{//"_index":"peope",//"_type":"_doc",//"_id":"vobiMYQB4x9Wk60f2F21",//"_score":0.2876821,//"_source":{//"first_name":"johnnyisgoodname",//"last_name":"johnnyisgoodname"//}//}//]GETpeope/_search{"query":{"match":{"first_name":"johnny"}}}//错误400无法在字段[first_name]上搜索,因为它没有被索引9.mapping设置属性null_value默认值null_value:字段遇到空值时的处理策略(字段为空时无法查找,也就是说text类型的字段不能使用该属性,可以用在关键字字段),设置这个值后,你可以用你设置的值替换空值。这和mysql中“default”设置的默认值类似,但又有点不同。后面可以使用你设置的null_value进行搜索,但是检索出来的数据_source还是显示nulldefault"//当文档的first_name字段为null时设置转换为default以创建倒排索引},"last_name":{"type":"text"}}}}POSTpeope/_doc{"first_name":null,//设置空值"last_name":"johnnyisgoodname","full_name":"johnnyisgoodname"}GETpeope/_search?q=first_name:default//根据null_value设置的值进行查找,查询还是原来的null//{//"_index":"peope",//"_type":"_doc",//"_id":"xob-MYQB4x9Wk60fVF1_",//"_score":0.2876821,//"_source":{//"first_name":null,//"last_name":"johnnyisgoodname",//"full_name":"johnny是个好名字"//}//}10.mappingsettingdynamic是否允许动态新建字段true:允许动态新建字段,mapping的更新文档可以被索引false:不允许动态新建字段,mapping不会被更新,field不能被索引,但是可以存储数据而_source中会出现信息Strict:Writingisnotallowed,直接报错。一旦数据写入一个已经存在的字段,字段定义就不能修改,因为底层Lucene不允许修改,如果要修改字段类型,必须reindex重建索引10.1dynamicfalsePUTpeope{"mappings":{"dynamic":false,//在索引上设置"properties"而不是相应的字段:{"first_name":{"type":"text"},"last_name":{"type":"text"}}}}POSTpeope/_doc//dynamicfalse可以存储文档数据{"first_name":"johnnyisgoodname","last_name":"johnnyisgoodname","full_name":"johnnyisgoodname"}GETpeope/_search?q=full_name:johnny//尝试搜索新字段//"hits":[]GETpeope/_search?q=first_name:johnny//可以找到数据,在_source中可以看到新字段////"hits":[//{//"_index":"peope",//"_type":"_doc",//"_id":"vobiMYQB4x9Wk60f2F21",//"_score":0.2876821,//"_source":{//"first_name":"johnnyisgoodname",//"last_name":"johnnyisgoodname",//"full_name"":"johnny是个好名字"//}//}//]10.2dynamicstrictstrict:严格模式,不允许PUTpeope{"mappings":{"dynamic":"strict","properties":{"first_name":{"type":"text"},"last_name":{"type":"text"}}}}POSTpeope/_doc//直接抛错{"first_name":"johnnyisgoodname","last_name":"johnnyisgoodname","full_name":"johnnyisgoodname"}//400mappingsettostrict,不允许在[_doc]内动态引入[full_name]总结本文非常详细的介绍了Elasticsearch中的mapping,介绍了什么是mapping,自动创建mapping的机制,自定义mapping中的各种参数设置。让我们一起学习和巩固。欢迎大家访问个人博客Johnnyhut欢迎关注个人公众号
