1. 程式人生 > >ElasticSearch入門 - 文件對映Mapper

ElasticSearch入門 - 文件對映Mapper

什麼叫做文件對映??

    ES的文件對映(mapping)機制用於進行欄位型別或分詞器確認,將每個欄位匹配為一種確定的資料型別。-就相當於在設計表的時候為欄位指定型別.

ES支援哪些資料型別??

① 基本欄位型別
字串:text(分詞),keyword(不分詞)   StringField(不分詞文字),TextFiled(要分詞文字)
              text預設為全文文字,keyword預設為非全文文字
數字:long,integer,short,double,float
日期:date
邏輯:boolean
② 複雜資料型別


物件型別:object
陣列型別:array
地理位置:geo_point,geo_shape

預設對映

檢視索引型別的對映配置:GET {indexName}/_mapping/{typeName}

ES在沒有配置Mapping的情況下新增文件,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"

正常來說應該先為文件型別(相當於資料庫中標)指定裡面欄位型別.但是,原來我們操作的時候沒有先指定?
為什麼呢?        -->      會走預設對映機制.
ES在沒有配置Mapping的情況下新增文件,ES會嘗試對欄位型別進行猜測,並動態生成欄位和型別的對映關係。

 自定義對映 

先來了解一下對映規則:

欄位對映的常用屬性配置列表

type

型別:基本資料型別,integer,long,date,boolean,keyword,text...

enable

是否啟用:預設為true。 false:不能索引、不能搜尋過濾,僅在_source中儲存

頭像路徑

boost

權重提升倍數:用於查詢時加權計算最終的得分。

format

格式:一般用於指定日期格式,如 yyyy-MM-dd HH:mm:ss.SSS

ignore_above

長度限制:長度大於該值的字串將不會被索引和儲存。

ignore_malformed

轉換錯誤忽略:true代表當格式轉換錯誤時,忽略該值,被忽略後不會被儲存和索引。

include_in_all

是否將該欄位值組合到_all中。

null_value

預設控制替換值。如空字串替換為”NULL”,空數字替換為-1

store

是否儲存:預設為false。true意義不大,因為_source中已有資料

index

索引模式:analyzed (索引並分詞,text預設模式), not_analyzed (索引不分詞,keyword預設模式),no(不索引)

analyzer

索引分詞器:索引建立時使用的分詞器,如ik_smart,ik_max_word,standard

search_analyzer

搜尋分詞器:搜尋該欄位的值時,傳入的查詢內容的分詞器。

fields

多欄位索引:當對該欄位需要使用多種索引模式時使用。

如:城市搜尋New York

"city": {

     "type": "text",

     "analyzer": "ik_smart",

     "fields": {

            "raw": {

                "type":  "keyword"

             }

     }

}

city分詞

city.raw 不分詞

那麼以後搜尋過濾和排序就可以使用city.raw欄位名

對映測試

注意:如果已經有資料,不能直接做對映,先刪除掉,在新增對映,再新增資料


 1.簡單型別對映

① 針對單個型別的對映配置方式

POST {indexName}/{typeName}/_mapping
{
    "{typeName}": {
        "properties": {
            "id": {
                "type": "long"
            },
            "content": {
                "type": "text",
                "analyzer": "ik_smart",
                "search_analyzer": "ik_smart"
            }
        }
    }
}

注意:你可以在第一次建立索引的時候指定對映的型別。此外,你也可以晚些時候為新型別新增對映(或者為已有的型別更新對映)。

你可以向已有對映中增加欄位,但你不能修改它。如果一個欄位在對映中已經存在,這可能意味著那個欄位的資料已經被索引。如果你改變了欄位對映,那已經被索引的資料將錯誤並且不能被正確的搜尋到。

我們可以更新一個對映來增加一個新欄位,但是不能把已有欄位的型別那個從 analyzed  改到 not_analyzed。

② 同時對多個型別的對映配置方式(推薦)

PUT {indexName}
{
  "mappings": {
    "user": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "info": {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer"
        }
      }
    },
    "dept": {
      "properties": {
        "id": {
          "type": "integer"
        },
        ...更多欄位對映配置
      }
    }
  }
}

2.物件及陣列型別對映

① 物件的對映與索引

注意:Lucene不理解內建物件,一個lucene文件包含鍵值對的一個扁平化列表,以便於ES索引內建物件,它把文件轉換為類似這樣:

內建欄位與名字相關,區分兩個欄位中相同的名字,可以使用全路徑,例如user.girl.name

② 陣列與物件陣列           -->         注意:陣列中元素的型別必須一致。

1)基礎型別陣列 - 只需對映裡面內容的型別

2)物件陣列 - 裡面所有物件欄位的型別是一樣的-->只需對映一個就好

注意1:同內聯物件一樣,物件陣列也會被扁平化索引

注意2:扁平化後,物件屬性的相關性已經丟失,因為每個多值欄位只是一個數值集,不是排序的陣列。

比如查詢:哪個女朋友的年齡是18歲? 這個是無法查詢到答案,如果需要保留關係,需要使用巢狀物件nested objects。

3.全域性對映        【 全域性對映可以通過動態模板預設設定兩種方式實現 

ex:員工型別的id要改為integer,而且部門型別的也要改為integer,甚至所有的都要改.這時每個都去修改非常麻煩.可以設定全域性對映

①預設方式:_default_                 [  一般用來設定_all不要了  ]

索引下所有的型別對映配置會繼承_default_的配置,user型別的文件中將不會合並所有欄位到_all,而dept會  如:  

動態模板:dynamic_templates

注意:ES會預設把string型別的欄位對映為text型別(預設使用標準分詞器)和對應的keyword型別,如:

在實際應用場景中,一個物件的屬性中,需要全文檢索的欄位較少,大部分字串不需要分詞,因此,需要利用全域性模板覆蓋自帶的預設模板:

說明:上例中定義了兩種動態對映模板string_as_textstring_as_keyword
在實際的型別欄位對映時,會依次匹配:
    ①欄位自定義配置
    ②全域性dynamic_templates[string_as_text、string_as_keyword]
    ③索引dynamic_templates[...]
    ④ES自帶的string型別對映,以最先匹配上的為準。
注意:索引庫在建立的時候會繼承當前最新的dynamic_templates,索引庫建立後,修改動態模板,無法應用到已存在的索引庫。


實踐:對映的配置會影響到後續資料的索引過程,因此,在實際專案中應遵循如下順序規則:  【有資料不做對映+根據優先順序倒序來】

① 配置全域性動態模板對映(覆蓋預設的string對映)
② 配置欄位對映(由於基本型別主要用於過濾和普通查詢,因此,欄位對映主要對需要全文檢索的欄位進行配置)
③ 建立、更新和刪除文件
④ 搜尋