Es Mapping篇主要是讲解Mapping的一些相关配置与需要注意的地方,说到Mapping大家可能觉得有些不解,其实我大体上可以将Es 理解为一个数据管理平台,那么index 当然就是库了,type可以理解为表,mapping可以理解为表的结构和相关设置的信息(当然mapping有更大范围的意思)。Mapping的作用域也是从cluster、node、index、type。

curl -XPOST localhost:9200/wf_mds_org(索引名称) -d '{

    "settings": {

        "number_of_shards": 1,

        "number_of_replicas": 0,

        "index.refresh_interval": "-1",

        "index.translog.flush_threshold_ops": "100000"

    },

    "mappings": {

        "org": {   //(类型)

            "_all": {

                "analyzer": "ike"

            },

            "_source": {

                "compress": true

            },

            "properties": {

                "_ID": {

                    "type": "string",

                    "include_in_all": true,

                    "analyzer": "keyword"

                },

                                     "NAME": {

                    "type": "multi_field",

                    "fields": {

                        "NAME": {

                            "type": "string",

                            "analyzer": "keyword"

                        },

                        "IKO": {

                            "type": "string",

                            "analyzer": "ike"

                        }

                    }

                },

                                     "SHORTNAME": {

                    "type": "string",

                    "index_analyzer": "pct_spliter",

                    "search_analyzer": "keyword",

                    "store": "no"

                },

                                     "OLDNAME": {

                    "type": "multi_field",

                    "fields": {

                        "OLDNAME": {

                            "type": "string",

                            "analyzer": "keyword"

                        },

                        "IKO": {

                            "type": "string",

                            "analyzer": "ike"

                        }

                    }

                },

                                     "TNAME": {

                    "type": "string",

                    "analyzer":"custom_snowball_analyzer",

                    "store": "no"

                },

                                     "TSNAME": {

                    "type": "string",

                    "index": "no",

                    "store": "no"

                },

                                     "TONAME": {

                    "type": "string",

                    "index": "no",

                    "store": "no"

                }

            }

        }

    }

}'

上面给出了一个完整Mapping,我们可将Mapping信息大致分成settings和mappings两个部分,settings主要是作用于index的一些相关配置信息,如分片数、副本数等(分片和副本在es简介中讲过,更加详细的东西会在索引优化篇中讲)、tranlog同步条件、refresh条条等。Mappings部分主是要结果构的一些说明,mappings 我们可以看到主体上大致又分成_all、_source、properites这三个部分。

1、_all:主要指的是All Field字段,我们可以将一个或都多个包含进不,在进行检索时无需指定字段的情况下检索多个字段。前提是你得开启All Field字段

"_all" : {"enabled" : true}

2、_source:主要指的是Source Field字段Source可以理解为Es除了将数据保存在索引文件中,另外还有一分源数据。_source字段我在们进行检索时相当重要,如果在{"enabled" : false}情况下默认检索只会返回ID,你需通过Fields字段去倒索索引中去取数据,当然效率不是很高。如果觉得enabale:true时,索引的膨涨率比较大的情况下可以通过下面一些辅助设置进行优化:

Compress:是否进行压缩,建议一般情况下将其设为true

"includes" : ["author", "name"],

"excludes" : ["sex"]

上面的includes和 excludes主要是针对默认情况下面_source一般是保存全部Bulk过去的数据,我们可以通过include,excludes在字段级别上做出一些限索。

3、properites部分是最重要的部分主要是针对索引结构和字段级别上面的一些设置

"NAME": { //字段项名称对应lucene里面FiledName

        "type": "string",//type为字段项类型

        "analyzer": "keyword"//字段项分词的设置对应Lucene里面的Analyzer

        },

在Es中字段项的 type是一个很重要的概念,在Es中在Lucene的基础上提供了比较多的类型,而这些类型对应这一些相关的检索特性如 Date型 我可以使用 [2001 TO 2012]的方式进行范围检索等,Es 的类型有如下一些:

简单类型:

String:字符型最常用的

Integer:整型

Long:长整型

Float:浮点型

Double:双字节型

Boolean:布尔型

复杂类型:

Array:数组型

“lists”:{{“name”:”…”},{“name”:”…”}}

Object:对象类型

“author”:{“type”:”object”,”perperites”:{“name”:{“type”:”string”}}}

说到Array和Object有一个性能上的问题,Es中提供了Facet检索,据Es的作者提供的消息,在做Facet时object类型相比与array的内存要占用的少,但我本人经过测试效果不是很明显有兴趣的可以测试一下。

Multi_field:多分词字段,针对一个字段提供多种分词方式

Nested: 嵌入类型用的还是比较多的

         类型常用的也就这些了,还有一些类型大家可以参考官网,另外一个比较重的方面的就是分词了(analyzer),不管在目前任何检索系统是分词决定这检索的查全与查准及索引的膨涨率等。在Es中analyzer的作用域也是从cluster、index、filed这三个作用域。Cluster的配置在配置中讲过,下面以Field为主(另外具体的分词一些相关东西会在分词篇中讲)

Analyzer,在Lucene中是一个分词器的概念,我们知道Es是建立在Lucene之上的,所以这里的Analzyer同样的也适用,Mapping 中的Analyzer主在是指定字段采用什么分词器,具体的程序和配置分词在插件和配置都有过一些说明。

Analyzer在Es中分为index_analyzer和search_analyzer

Index_analzyer:指的是索引过程中采用的分词器

Search_analyzer:指的是检索过程中采用的分词器

我们知道index和search是两个过程,但是尽量保证这两个过程和分词方式一致这样可以保证查全和查准,否则再牛B的分词,index和search采用的不相同也是无用功。

         与analyzer与之相关的就是别外一项index项

"HC":{ "type":"string", "index":"no", "store":"no"}

         Index表示该字段是否索引,如果index为no那个analyzer设为啥也没用。

最后是”store”项了store项表示该项是否存储到倒索索引中去,并不是_source,当项mapping中还有很多可以设置和优化的地方,会面在慢慢讨论。在mapping中index和store如果大家有时候觉得有点和source搞不清楚,大家可以参考lucene中的Field.Store.YES,Field.Index.NOT_ANALYZED,Field.Index等相关设置就比较明白了。