Elastic Stack:es Mapping映射入门
Posted 秋风飒飒吹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elastic Stack:es Mapping映射入门相关的知识,希望对你有一定的参考价值。
一.概念
概念:自动或手动为index中的_doc建立的一种数据结构和相关配置,简称为mapping映射。
动态映射:dynamic mapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。
我们当然也可以手动在创建数据之前,先创建index,以及对应的mapping
语法:
GET /INDEX/_mapping
GET /book/_mapping查询结果:
{ "book" : { "mappings" : { "properties" : { "description" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "pic" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "price" : { "type" : "float" }, "studymodel" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "tags" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "timestamp" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } } }
搜索:
GET /website/_search?q=2019 0条结果 GET /website/_search?q=2019-01-01 1条结果 GET /website/_search?q=post_date:2019-01-01 1条结果 GET /website/_search?q=post_date:2019 0 条结果
搜索结果为什么不一致,因为es自动建立mapping的时候,设置了不同的field不同的data type。不同的data type的分词、搜索等行为是不一样的。所以出现了_all field和post_date field的搜索表现完全不一样。
二.精确匹配与全文检索的对比分析
exact value 精确匹配:2019-01-01,exact value,搜索的时候,必须输入2019-01-01,才能搜索出来,如果你输入一个01,是搜索不出来的
full text 全文检索:
2019-01-01,2019 01 01,搜索2019,或者01,都可以搜索出来
china,搜索cn,也可以将china搜索出来
likes,搜索like,也可以将likes搜索出来
like,搜索love,同义词,也可以将like搜索出来
就不是说单纯的只是匹配完整的一个值,而是可以对值进行拆分词语后(分词)进行匹配,也可以通过缩写、时态、大小写、同义词等进行匹配。深入 NPL,自然语义处理。
三.分词器 analyzer
作用:切分词语,normalization(提升recall召回率),给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换)。
测试分词器:
GET /_analyze { "analyzer": "standard", "text": "Text to analyze 80" }
分词结果:
token:实际存储的tern关键字
position:在此词条在原文本中的位置
start_offset/end_offset:字符在原始字符串中的位置
四.手动创建映射
PUT book/_mapping { "properties": { "name": { "type": "text" }, "description": { "type": "text", "analyzer":"english", "search_analyzer":"english" }, "pic":{ "type":"text", "index":false }, "studymodel":{ "type":"text" } } }
Text文本类型:
1)analyzer :通过analyzer属性指定分词器。
2)index :index属性指定是否索引,默认为true,但是有一些内容不需要索引。
3)store :是否在source之外存储
keyword关键字字段:
目前已经取代了"index": false。上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。
date日期类型:
日期类型不用设置分词器。
通常日期类型的字段用于排序。
通过format设置日期格式
"timestamp": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" }
五.修改映射
只能创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping。
PUT /book/_mapping/ { "properties" : { "new_field" : { "type" : "text", "index": "false" } } }
通过删除索引来删除映射。
以上是关于Elastic Stack:es Mapping映射入门的主要内容,如果未能解决你的问题,请参考以下文章