鬆哥原創的 Spring Boot 視頻教程已經殺青,感興趣的小夥伴戳這裏-->Spring Boot+Vue+微人事視頻教程java
ElasticSearch 系列第十一篇,和你們聊一聊索引的基本操做,前十篇傳送門:web
-
打算出一個 ElasticSearch 教程,誰同意,誰反對? -
ElasticSearch 從安裝開始 -
ElasticSearch 第三彈,核心概念介紹 -
ElasticSearch 中的中文分詞器該怎麼玩? -
ElasticSearch 索引基本操做 -
ElasticSearch 文檔的添加、獲取以及更新 -
ElasticSearch 文檔的刪除和批量操做 -
ElasticSearch 文檔路由,你的數據到底存在哪個分片上? -
ElasticSearch 併發的處理方式:鎖和版本控制 -
ElasticSearch 中的倒排索引究竟是什麼?
如下是視頻筆記:數據庫
注意,筆記只是視頻內容的一個簡要記錄,所以筆記內容比較簡單,完整的內容能夠查看視頻。微信
映射就是 Mapping,它用來定義一個文檔以及文檔所包含的字段該如何被存儲和索引。因此,它其實有點相似於關係型數據庫中表的定義。併發
9.1 映射分類
動態映射app
顧名思義,就是自動建立出來的映射。es 根據存入的文檔,自動分析出來文檔中字段的類型以及存儲方式,這種就是動態映射。編輯器
舉一個簡單例子,新建一個索引,而後查看索引信息:ide
![](http://static.javashuo.com/static/loading.gif)
在建立好的索引信息中,能夠看到,mappings 爲空,這個 mappings 中保存的就是映射信息。flex
如今咱們向索引中添加一個文檔,以下:ui
PUT blog/_doc/1
{
"title":"1111",
"date":"2020-11-11"
}
文檔添加成功後,就會自動生成 Mappings:
![](http://static.javashuo.com/static/loading.gif)
能夠看到,date 字段的類型爲 date,title 的類型有兩個,text 和 keyword。
默認狀況下,文檔中若是新增了字段,mappings 中也會自動新增進來。
有的時候,若是但願新增字段時,可以拋出異常來提醒開發者,這個能夠經過 mappings 中 dynamic 屬性來配置。
dynamic 屬性有三種取值:
-
true,默認即此。自動添加新字段。 -
false,忽略新字段。 -
strict,嚴格模式,發現新字段會拋出異常。
具體配置方式以下,建立索引時指定 mappings(這其實就是靜態映射):
PUT blog
{
"mappings": {
"dynamic":"strict",
"properties": {
"title":{
"type": "text"
},
"age":{
"type":"long"
}
}
}
}
而後向 blog 中索引中添加數據:
PUT blog/_doc/2
{
"title":"1111",
"date":"2020-11-11",
"age":99
}
在添加的文檔中,多出了一個 date 字段,而該字段沒有預約義,因此這個添加操做就回報錯:
{
"error" : {
"root_cause" : [
{
"type" : "strict_dynamic_mapping_exception",
"reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
}
],
"type" : "strict_dynamic_mapping_exception",
"reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
},
"status" : 400
}
動態映射還有一個日期檢測的問題。
例如新建一個索引,而後添加一個含有日期的文檔,以下:
PUT blog/_doc/1
{
"remark":"2020-11-11"
}
添加成功後,remark 字段會被推斷是一個日期類型。
![](http://static.javashuo.com/static/loading.gif)
此時,remark 字段就沒法存儲其餘類型了。
PUT blog/_doc/1
{
"remark":"javaboy"
}
此時報錯以下:
{
"error" : {
"root_cause" : [
{
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'"
}
],
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "failed to parse date field [javaboy] with format [strict_date_optional_time||epoch_millis]",
"caused_by" : {
"type" : "date_time_parse_exception",
"reason" : "Failed to parse with all enclosed parsers"
}
}
},
"status" : 400
}
要解決這個問題,能夠使用靜態映射,即在索引定義時,將 remark 指定爲 text 類型。也能夠關閉日期檢測。
PUT blog
{
"mappings": {
"date_detection": false
}
}
此時日期類型就回當成文原本處理。
靜態映射
略。
9.2 類型推斷
es 中動態映射類型推斷方式以下:
![](http://static.javashuo.com/static/loading.gif)
精彩文章推薦:
喜歡就點個"在看"唄^_^
本文分享自微信公衆號 - 江南一點雨(a_javaboy)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。