## 映射
為了能夠把日期字段處理成日期,把數字字段處理成數字,把字符串字段處理成全文本(Full-text)或精確的字符串值,Elasticsearch需要知道每個字段里面都包含了什么類型。這些類型和字段的信息存儲(包含)在映射(mapping)中。
正如《數據吞吐》一節所說,索引中每個文檔都有一個**類型(type)**。
每個類型擁有自己的**映射(mapping)**或者**模式定義(schema definition)**。一個映射定義了字段類型,每個字段的數據類型,以及字段被Elasticsearch處理的方式。映射還用于設置關聯到類型上的元數據。
在《映射》章節我們將探討映射的細節。這節我們只是帶你入門。
### 核心簡單字段類型
Elasticsearch支持以下簡單字段類型:
|類型 | 表示的數據類型 |
|----------------|------------------------------------|
|String | `string` |
|Whole number | `byte`, `short`, `integer`, `long`|
|Floating point | `float`, `double` |
|Boolean | `boolean` |
|Date | `date` |
當你索引一個包含新字段的文檔——一個之前沒有的字段——Elasticsearch將使用動態映射猜測字段類型,這類型來自于JSON的基本數據類型,使用以下規則:
|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"`,它將被映射為`"string"`類型,而不是`"long"`類型。然而,如果字段已經被映射為`"long"`類型,Elasticsearch將嘗試轉換字符串為long,并在轉換失敗時會拋出異常。
### 查看映射
我們可以使用`_mapping`后綴來查看Elasticsearch中的映射。在本章開始我們已經找到索引`gb`類型`tweet`中的映射:
```javascript
GET /gb/_mapping/tweet
```
這展示給了我們字段的映射(叫做**屬性(properties)**),這些映射是Elasticsearch在創建索引時動態生成的:
```javascript
{
"gb": {
"mappings": {
"tweet": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"name": {
"type": "string"
},
"tweet": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
}
}
}
```
> ### 小提示
> 錯誤的映射,例如把`age`字段映射為`string`類型而不是`integer`類型,會造成查詢結果混亂。
> 要檢查映射類型,而不是假設它是正確的!
### 自定義字段映射
雖然大多數情況下基本數據類型已經能夠滿足,但你也會經常需要自定義一些特殊類型(fields),特別是字符串字段類型。
自定義類型可以使你完成以下幾點:
* 區分全文(full text)字符串字段和準確字符串字段(譯者注:就是分詞與不分詞,全文的一般要分詞,準確的就不需要分詞,比如『中國』這個詞。全文會分成『中』和『國』,但作為一個國家標識的時候我們是不需要分詞的,所以它就應該是一個準確的字符串字段)。
* 使用特定語言的分析器(譯者注:例如中文、英文、阿拉伯語,不同文字的斷字、斷詞方式的差異)
* 優化部分匹配字段
* 指定自定義日期格式(譯者注:這個比較好理解,例如英文的 `Feb,12,2016` 和 中文的 `2016年2月12日`)
* 以及更多
映射中最重要的字段參數是`type`。除了`string`類型的字段,你可能很少需要映射其他的`type`:
```javascript
{
"number_of_clicks": {
"type": "integer"
}
}
```
`string`類型的字段,默認的,考慮到包含全文本,它們的值在索引前要經過分析器分析,并且在全文搜索此字段前要把查詢語句做分析處理。
對于`string`字段,兩個最重要的映射參數是`index`和`analyer`。
### `index`
`index`參數控制字符串以何種方式被索引。它包含以下三個值當中的一個:
|值 |解釋 |
|--------------|--------------------------------------|
|`analyzed` |首先分析這個字符串,然后索引。換言之,以全文形式索引此字段。 |
|`not_analyzed`|索引這個字段,使之可以被搜索,但是索引內容和指定值一樣。不分析此字段。 |
|`no` |不索引這個字段。這個字段不能為搜索到。|
`string`類型字段默認值是`analyzed`。如果我們想映射字段為確切值,我們需要設置它為`not_analyzed`:
```javascript
{
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
```
> 其他簡單類型(`long`、`double`、`date`等等)也接受`index`參數,但相應的值只能是`no`和`not_analyzed`,它們的值不能被分析。
### 分析
對于`analyzed`類型的字符串字段,使用`analyzer`參數來指定哪一種分析器將在搜索和索引的時候使用。默認的,Elasticsearch使用`standard`分析器,但是你可以通過指定一個內建的分析器來更改它,例如`whitespace`、`simple`或`english`。
```javascript
{
"tweet": {
"type": "string",
"analyzer": "english"
}
}
```
在《自定義分析器》章節我們將告訴你如何定義和使用自定義的分析器。
### 更新映射
你可以在第一次創建索引的時候指定映射的類型。此外,你也可以晚些時候為新類型添加映射(或者為已有的類型更新映射)。
> ### 重要
> 你可以向已有映射中**增加**字段,但你不能**修改**它。如果一個字段在映射中已經存在,這可能意味著那個字段的數據已經被索引。如果你改變了字段映射,那已經被索引的數據將錯誤并且不能被正確的搜索到。
我們可以更新一個映射來增加一個新字段,但是不能把已有字段的類型那個從`analyzed`改到`not_analyzed`。
為了演示兩個指定的映射方法,讓我們首先刪除索引`gb`:
```sh
DELETE /gb
```
然后創建一個新索引,指定`tweet`字段的分析器為`english`:
```javascript
PUT /gb <1>
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
```
`<1>` 這將創建包含`mappings`的索引,映射在請求體中指定。
再后來,我們決定在`tweet`的映射中增加一個新的`not_analyzed`類型的文本字段,叫做`tag`,使用`_mapping`后綴:
```javascript
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
```
注意到我們不再需要列出所有的已經存在的字段,因為我們沒法修改他們。我們的新字段已經被合并至存在的那個映射中。
### 測試映射
你可以通過名字使用`analyze` API測試字符串字段的映射。對比這兩個請求的輸出:
```javascript
GET /gb/_analyze?field=tweet&text=Black-cats <1>
GET /gb/_analyze?field=tag&text=Black-cats <2>
```
`<1>` `<2>` 我們想要分析的文本被放在請求體中。
`tweet`字段產生兩個詞,`"black"`和`"cat"`,`tag`字段產生單獨的一個詞`"Black-cats"`。換言之,我們的映射工作正常。
- Introduction
- 入門
- 是什么
- 安裝
- API
- 文檔
- 索引
- 搜索
- 聚合
- 小結
- 分布式
- 結語
- 分布式集群
- 空集群
- 集群健康
- 添加索引
- 故障轉移
- 橫向擴展
- 更多擴展
- 應對故障
- 數據
- 文檔
- 索引
- 獲取
- 存在
- 更新
- 創建
- 刪除
- 版本控制
- 局部更新
- Mget
- 批量
- 結語
- 分布式增刪改查
- 路由
- 分片交互
- 新建、索引和刪除
- 檢索
- 局部更新
- 批量請求
- 批量格式
- 搜索
- 空搜索
- 多索引和多類型
- 分頁
- 查詢字符串
- 映射和分析
- 數據類型差異
- 確切值對決全文
- 倒排索引
- 分析
- 映射
- 復合類型
- 結構化查詢
- 請求體查詢
- 結構化查詢
- 查詢與過濾
- 重要的查詢子句
- 過濾查詢
- 驗證查詢
- 結語
- 排序
- 排序
- 字符串排序
- 相關性
- 字段數據
- 分布式搜索
- 查詢階段
- 取回階段
- 搜索選項
- 掃描和滾屏
- 索引管理
- 創建刪除
- 設置
- 配置分析器
- 自定義分析器
- 映射
- 根對象
- 元數據中的source字段
- 元數據中的all字段
- 元數據中的ID字段
- 動態映射
- 自定義動態映射
- 默認映射
- 重建索引
- 別名
- 深入分片
- 使文本可以被搜索
- 動態索引
- 近實時搜索
- 持久化變更
- 合并段
- 結構化搜索
- 查詢準確值
- 組合過濾
- 查詢多個準確值
- 包含,而不是相等
- 范圍
- 處理 Null 值
- 緩存
- 過濾順序
- 全文搜索
- 匹配查詢
- 多詞查詢
- 組合查詢
- 布爾匹配
- 增加子句
- 控制分析
- 關聯失效
- 多字段搜索
- 多重查詢字符串
- 單一查詢字符串
- 最佳字段
- 最佳字段查詢調優
- 多重匹配查詢
- 最多字段查詢
- 跨字段對象查詢
- 以字段為中心查詢
- 全字段查詢
- 跨字段查詢
- 精確查詢
- 模糊匹配
- Phrase matching
- Slop
- Multi value fields
- Scoring
- Relevance
- Performance
- Shingles
- Partial_Matching
- Postcodes
- Prefix query
- Wildcard Regexp
- Match phrase prefix
- Index time
- Ngram intro
- Search as you type
- Compound words
- Relevance
- Scoring theory
- Practical scoring
- Query time boosting
- Query scoring
- Not quite not
- Ignoring TFIDF
- Function score query
- Popularity
- Boosting filtered subsets
- Random scoring
- Decay functions
- Pluggable similarities
- Conclusion
- Language intro
- Intro
- Using
- Configuring
- Language pitfalls
- One language per doc
- One language per field
- Mixed language fields
- Conclusion
- Identifying words
- Intro
- Standard analyzer
- Standard tokenizer
- ICU plugin
- ICU tokenizer
- Tidying text
- Token normalization
- Intro
- Lowercasing
- Removing diacritics
- Unicode world
- Case folding
- Character folding
- Sorting and collations
- Stemming
- Intro
- Algorithmic stemmers
- Dictionary stemmers
- Hunspell stemmer
- Choosing a stemmer
- Controlling stemming
- Stemming in situ
- Stopwords
- Intro
- Using stopwords
- Stopwords and performance
- Divide and conquer
- Phrase queries
- Common grams
- Relevance
- Synonyms
- Intro
- Using synonyms
- Synonym formats
- Expand contract
- Analysis chain
- Multi word synonyms
- Symbol synonyms
- Fuzzy matching
- Intro
- Fuzziness
- Fuzzy query
- Fuzzy match query
- Scoring fuzziness
- Phonetic matching
- Aggregations
- overview
- circuit breaker fd settings
- filtering
- facets
- docvalues
- eager
- breadth vs depth
- Conclusion
- concepts buckets
- basic example
- add metric
- nested bucket
- extra metrics
- bucket metric list
- histogram
- date histogram
- scope
- filtering
- sorting ordering
- approx intro
- cardinality
- percentiles
- sigterms intro
- sigterms
- fielddata
- analyzed vs not
- 地理坐標點
- 地理坐標點
- 通過地理坐標點過濾
- 地理坐標盒模型過濾器
- 地理距離過濾器
- 緩存地理位置過濾器
- 減少內存占用
- 按距離排序
- Geohashe
- Geohashe
- Geohashe映射
- Geohash單元過濾器
- 地理位置聚合
- 地理位置聚合
- 按距離聚合
- Geohash單元聚合器
- 范圍(邊界)聚合器
- 地理形狀
- 地理形狀
- 映射地理形狀
- 索引地理形狀
- 查詢地理形狀
- 在查詢中使用已索引的形狀
- 地理形狀的過濾與緩存
- 關系
- 關系
- 應用級別的Join操作
- 扁平化你的數據
- Top hits
- Concurrency
- Concurrency solutions
- 嵌套
- 嵌套對象
- 嵌套映射
- 嵌套查詢
- 嵌套排序
- 嵌套集合
- Parent Child
- Parent child
- Indexing parent child
- Has child
- Has parent
- Children agg
- Grandparents
- Practical considerations
- Scaling
- Shard
- Overallocation
- Kagillion shards
- Capacity planning
- Replica shards
- Multiple indices
- Index per timeframe
- Index templates
- Retiring data
- Index per user
- Shared index
- Faking it
- One big user
- Scale is not infinite
- Cluster Admin
- Marvel
- Health
- Node stats
- Other stats
- Deployment
- hardware
- other
- config
- dont touch
- heap
- file descriptors
- conclusion
- cluster settings
- Post Deployment
- dynamic settings
- logging
- indexing perf
- rolling restart
- backup
- restore
- conclusion