Elastic Stack(es Mapping映射入门)

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述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=20190条结果 GET /website/_search?q=2019-01-011条结果 GET /website/_search?q=post_date:2019-01-011条结果 GET /website/_search?q=post_date:20190 条结果

搜索结果为什么不一致,因为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搜索出来
Tom,搜索tom,也可以将Tom搜索出来
like,搜索love,同义词,也可以将like搜索出来
就不是说单纯的只是匹配完整的一个值,而是可以对值进行拆分词语后(分词)进行匹配,也可以通过缩写、时态、大小写、同义词等进行匹配。深入 NPL,自然语义处理。
三.分词器 analyzer【Elastic Stack(es Mapping映射入门)】作用:切分词语,normalization(提升recall召回率),给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换)。
测试分词器:
GET /_analyze { "analyzer": "standard", "text": "Text to analyze 80" }

  分词结果:
Elastic Stack(es Mapping映射入门)

文章图片

 
 
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" } } }

通过删除索引来删除映射。

    推荐阅读