希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 Elasticsearch之mapping介绍 丁D 学无止境 2019-09-03 08:54 43046已阅读 Elasticsearch mapping analyzer 摘要本文将详细介绍分析器、mapping、手动创建mapping、mapping的复合数据类型。 **学习目标** >分析器的组成 >内置分析器 >什么是mapping >手动创建mapping >mapping复合数据类型 [参考Elasticsearch权威指南](https://es.xiaoleilu.com/052_Mapping_Analysis/00_Intro.html ) **分析器的组成** ```js 分析器(analyzer)就是将一句话切分成各个词语,同时也可能对单词就行时态转化,单复数转化等,方便es建立倒排索引,主要由字符过滤器、分词器、标记过滤组成。 字符过滤器(character filter)主要是在分词之前对句子进行预处理,比如将html过滤掉,将&转成and 分词器(tokenizer)被标记化成独立的词。一个简单的分词器可以根据空格或逗号将单词分开(中文不适用) 标记过滤(token filters),主要将大写转小写,去掉 a,the an 这种没有意义的停用词,同义词转化等。 ``` **内置分析器** ```js es提供了一些内建分析器。 "Set the shape to semi-transparent by calling set_trans(5)" // 标准分析器(standard):是es默认的分析器,如果没有特殊要求,是任何语言最佳的选择。 set, the, shape, to, semi, transparent, by, calling, set_trans, 5 // 简单分析器(simple):非单个字母的文本切分,然后把每个词转为小写 set, the, shape, to, semi, transparent, by, calling, set, trans // 空格分析器(whitespace):简单的根据空格拆分 Set, the, shape, to, semi-transparent, by, calling, set_trans(5) 语言分析器:特定语言分析器适用于很多语言,例如,english分析器 当我们对文档新增新的字符串字段,它将自动设置它为全文string字段并用standard分析器分析,当然我们通常都需要设置,所以我们需要人工设置映射(mapping)来改变这些字段。 ``` **什么是mapping** ```js 映射(mapping)就是确认字段数据类型,数据类型不一样,分词的结果可能就不一样,可以理解成传统数据库的模式定义。 es支持下面这些字段 string、byte、short、integer、long、float、double、boolean、date ``` JSON type| Field type ------- | ------- true or false| boolean 123| long "123"| string 123.45| double 2014-09-15| date "foo bar"| string **手动创建mapping** ```js 查询映射 格式:GET /index/_mapping/type 如:GET /test_index/_mapping/test_type 指定数据类型 { "number_of_clicks": { "type": "integer" } } 映射中最重要的字段参数是type,用它来指定数据类型,但是通常我们使用string会比较多, 对于string类型还有两个重要的映射参数是index和analyer。 index的值可以是 analyzed、not_analyzed、no,介绍见下面表格 analyer的值可以是 whitespace、simple或english 默认是standard { "tag": { "type": "string", "index": "not_analyzed" } } ``` 值| 解释 ------- | ------- analyzed| 首先分析这个字符串,然后索引。换言之,以全文形式索引此字段。 not_analyzed| 索引这个字段,使之可以被搜索,但是索引内容和指定值一样。不分析此字段。 no| 不索引这个字段。这个字段不能为搜索到 >**注意** 其他简单类型(long、double、date等等)也接受index参数,但相应的值只能是no和not_analyzed,它们的值不能被分析。 >**重要** 如果一个字段的映射已经存在,我们不能修改它,所以就必须在创建索引的时候就确定了,但是我们可以新增一个新字段和新字段的mapping ```js 新增一个index,并指定各个字段的mapping PUT /gb { "mappings": { "tweet" : { "properties" : { "tweet" : { "type" : "string", "analyzer": "english" }, "date" : { "type" : "date" }, "name" : { "type" : "string" }, "user_id" : { "type" : "long" } } } } } 对一个已经存在的index,新增字段的mapping PUT /gb/_mapping/tweet { "properties" : { "tag" : { "type" : "string", "index": "not_analyzed" } } } ``` **mapping复合数据类型** ```js 空字段:空字段没有任何意义,所以将会被识别为空字段而不被索引 "empty_string": "", "null_value": null, "empty_array": [], "array_with_null_value": [ null ] 数组 { "tag": [ "search", "nosql" ]} 数组每个值他的类型必须一样。 ``` 很赞哦! (2) 上一篇:Elasticsearch之mget、bulk、路由原理、深度分页 下一篇:Elasticsearch之持久化、路由过程、CRUD原理、scroll技术 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡