https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping-intro.html
通過 /_mapping ,我們可以查看 Elasticsearch 在一個或多個索引中的一個或多個類型的映射 。
GET /gb/tweet/_mapping
{
"gb": {
"mappings": {
"tweet": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"name": {
"type": "string"
},
"tweet": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
}
}
}
自定義域映射
盡管在很多情況下基本域數據類型 已經夠用,但你經常需要為單獨域自定義映射 ,特別是字符串域。自定義映射允許你執行下面的操作:
全文字符串域和精確值字符串域的區別
使用特定語言分析器
優化域以適應部分匹配
指定自定義數據格式
域最重要的屬性是 type 。對於不是 string 的域,你一般只需要設置 type :
索引不存在的情況下,創建索引和類型mapping
PUT /gb
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
給某個類型創建mapping,可以用來插入列
PUT /gb/tweet/_mapping
{
"properties": {
"number_of_clicks": {
"type": "integer"
}
}
}
默認, string 類型域會被認為包含全文。就是說,它們的值在索引前,會通過 一個分析器,針對於這個域的查詢在搜索前也會經過一個分析器。
string 域映射的兩個最重要 屬性是 index 和 analyzer 。
index 屬性控制怎樣索引字符串。它可以是下面三個值:
analyzed
首先分析字符串,然后索引它。換句話說,以全文索引這個域。
not_analyzed
索引這個域,所以它能夠被搜索,但索引的是精確值。不會對它進行分析。
no
不索引這個域。這個域不會被搜索到。
string 域 index 屬性默認是 analyzed 。如果我們想映射這個字段為一個精確值,我們需要設置它為 not_analyzed :
{
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
其他簡單類型(例如 long , double , date 等)也接受 index 參數,但有意義的值只有 no 和 not_analyzed , 因為它們永遠不會被分析。
對於 analyzed 字符串域,用 analyzer 屬性指定在搜索和索引時使用的分析器。默認, Elasticsearch 使用 standard 分析器, 但你可以指定一個內置的分析器替代它,例如 whitespace 、 simple 和 english:
{
"tweet": {
"type": "string",
"analyzer": "english"
}
}
更新映射
你可以 增加_ 一個存在的映射,你不能 _修改 存在的域映射。如果一個域的映射已經存在,那么該域的數據可能已經被索引。如果你意圖修改這個域的映射,索引的數據可能會出錯,不能被正常的搜索。
我們可以更新一個映射來添加一個新域,但不能將一個存在的域從 analyzed 改為 not_analyzed 。
我們決定在 tweet 映射增加一個新的名為 tag 的 not_analyzed 的文本域,使用 _mapping :
PUT /gb/tweet/_mapping
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}