Elasticsearch實戰系列-mapping 設定
本篇主要講解Mapping的一些相關配置與需要注意的地方,說到Mapping大家可能覺得有些不解,其實我大體上可以將Elasticsearch理解為一個RDBMS(關係型資料庫,比如MySQL),那麼index 就相當於資料庫例項,type可以理解為表,這樣mapping可以理解為表的結構和相關設定的資訊(當然mapping有更大範圍的意思)。
預設情況不需要顯式的定義mapping, 當新的type或者field引入時,Elasticsearch會自動建立並且註冊有合理的預設值的mapping(毫無效能壓力), 只有要覆蓋預設值時才必須要提供mapping定義。
什麼是Mapping
先看看官方文件中的定義
A mapping defines the fields within a type, the datatype for each field, and how the field should be handled by Elasticsearch. A mapping is also used to configure metadata associated with the type.
Mapping定義了type中的諸多欄位的資料型別以及這些欄位如何被Elasticsearch處理,比如一個欄位是否可以查詢以及如何分詞等。
自定義Mapping
下面是一個簡單的Mapping定義:
curl -XPUT 'http://localhost:9200/megacorp' -d '
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"employee": {
"properties": {
"first_name": {
"type": "string"
},
" last_name": {
"type": "string"
},
"age": {
"type": "integer"
},
"about": {
"type": "string"
},
"interests": {
"type": "string"
},
"join_time": {
"type": "date",
"format": "dateOptionalTime",
"index": "not_analyzed"
}
}
}
}
}
'
其中employee是type(相當於關係資料庫中的表),在employee中我們定義了first_name、last_name、age、about、interests、join_time這6個屬性。
{ "interests": { "type": "string"}
type表示field的資料型別,上例中interests的type為string表示為普通文字。
Elasticsearch支援以下資料型別:
- 文字: string
- 數字: byte, short, integer, long
- 浮點數: float, double
- 布林值: boolean
- Date: date
對於type為 string 的欄位,最重要的屬性是:index and analyzer。
1、index
index 屬性控制string如何被索引,它有三個可選值:
- analyzed: First analyze the string, then index it. In other words,
index this field as full text. - not_analyzed:: Index this field, so it is searchable, but index the
value exactly as specified. Do not analyze it. - no: Don’t index this field at all. This field will not be
searchable.
對於string型別的filed index 預設值是: analyzed.如果我們想對進行精確查詢, 那麼我們需要將它設定為: not_analyzed。
例如:
{ "tag": { "type": "string", "index": "not_analyzed" }
2、analyzer
對於 string型別的欄位, 我們可以使用 analyzer 屬性來指定在搜尋階段和索引階段使用哪個分詞器. 預設, Elasticsearch 使用 standard analyzer, 你也可以指定Elasticsearch內建的其它分詞器,比如 whitespace, simple, or english:
例如:
{ "tweet": { "type": "string", "analyzer": "english" }