ES权威指南[官方文档学习笔记]-58 mapping

es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html

下一页:http://my.oschina.net/qiangzigege/blog/270948

内容

如前所述,索引里的每个文档有一个type,
每一个type有它自己的映射模式,一个映射指定了type里的字段,每个字段的数据类型,并且字段如何被es处理。
一个映射也被用来配置元数据。

我们会后续详细讨论映射。

核心简单字段类型

es支持下列简单的字段类型:

String: string

Whole number: byte, short, integer, long

Floating point: float, double

Boolean: boolean

Date: date

当你索引一个文档,而这个文档包含了一个新的字段,es会动态映射此字段,规则如下:

JSON type:                Field type:

Boolean: true or false    "boolean"

Whole number: 123         "long"

Floating point: 123.45    "double"

String, valid date: "2014-09-15"  "date"

String: "foo bar"          "string"

这也就意味着,如果你索引 “123”,就映射成字符串,而不是long.
尽管如此,如果这个字段已经映射成long,es将尝试按此转换,失败则抛出异常。

查看映射
使用/_mapping来查看已有的映射关系。
比如查看index:gb  type:tweet的映射
GET /gb/_mapping/tweet
结果:
{
   "gb": {
      "mappings": {
         "tweet": {
            "properties": {
               "date": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "name": {
                  "type": "string"
               },
               "tweet": {
                  "type": "string"
               },
               "user_id": {
                  "type": "long"
               }
            }
         }
      }
   }
}

定制字段的映射

字段最重要的属性就是type,

{
    "number_of_clicks": 
	{
        "type": "integer"
    }
}
string类型的字段,默认,认为是全文搜索,
也就是说,值会传递给分析器,搜索之前也会将查询字符串进行全文分词再搜索。

字符串字段最重要的2个映射关系是index和analyser.

index
index属性决定字符串如何被索引,有3个值:
1 analyzed
先分词,再索引,全文搜索

2 not_analyzed
索引这个字段,这样可以被搜索,但是直接索引,不分词。

3 no
不要索引这个字段,这个字段也不会被搜出来。

string字段默认是analyzed.

下面阐述了不分词的做法
{
    "tag": {
        "type":     "string",
        "index":    "not_analyzed"
    }
}
其它简单的字段类型-long, double, date etc ,
也可以接收index参数,不过只可以取值no ,not_analyzed.

analyzer
对于需要分词的string字段,analyzer属性决定使用哪个分词器,默认,使用standard分词器。
但是你可以设置为一个内置的分词器,比如whitespace,simple,english.

{
    "tweet": {
        "type":     "string",
        "analyzer": "english"
    }
}

更新映射
你可以在创建索引时指定映射,另外,你可以使用/_mapping来修改映射或者增加映射。

如果一个字段已经在映射里存在,这也许意味着这个字段的数据已经被索引了,如果你想这个字段的映射,
已经索引过的数据就会出错。

我们可以通过增加一个新的字段来修改映射,但是我们不能修改已经存在的字段从分词到不分词。


删除gb索引
DELETE /gb

然后创建一个索引,指定tweet字段使用english分词器。

PUT /gb 
{
  "mappings": {
    "tweet" : {
      "properties" : {
        "tweet" : {
          "type" :    "string",
          "analyzer": "english"
        },
        "date" : {
          "type" :   "date"
        },
        "name" : {
          "type" :   "string"
        },
        "user_id" : {
          "type" :   "long"
        }
      }
    }
  }
}
这就创建了一个带映射关系的索引。

下面修改映射,增加一个新的不分词的字段tag到tweet映射中。

PUT /gb/_mapping/tweet
{
  "properties" : {
    "tag" : {
      "type" :    "string",
      "index":    "not_analyzed"
    }
  }
}

测试映射
可以使用分词API来测试映射,

GET /gb/_analyze?field=tweet
Black-cats 

GET /gb/_analyze?field=tag
Black-cats 
前者2个分词,后者一个分词。

 

你可能感兴趣的:(elasticsearch)