iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Software Development

由淺入深來探討Elasticsearch,從基礎語法到底層相關原理系列 第 10

【Day 10】由淺入深來探討Elasticsearch - Dynamic mapping

  • 分享至 

  • xImage
  •  

之前有提過在設定Dynamic mapping為true或是runtime時
ES會幫我們為特定類型的欄位設置他設定好的type

那我們可以先把這部分設置成false看看,有的人可能會想,這樣不就是得設定好mapping嗎?
不然ES應該不知道怎麼處理吧? 讓我們接下來看~

PUT /student
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "first_name": {
        "type": "text"
      }
    }
  }
}

POST /student/_doc
{
  "first_name": "Adam",
  "last_name": "Smith"
}

我們先把dynamic設為false,並只設定好first_name的type
然後我們輸入一個document,包含first_name與last_name欄位
https://ithelp.ithome.com.tw/upload/images/20230912/20161866h2ui5T8G7Q.png
發現可以創建!

那我們來看看用first_name搜尋會怎麼樣吧~

GET /student/_search
{
  "query": {
    "match": {
      "first_name": "Adam"
    }
  }
}

https://ithelp.ithome.com.tw/upload/images/20230912/201618665Itjh4x6YM.png
一樣能找到~

那我們試試看用last_name來找

GET /student/_search
{
  "query": {
    "match": {
      "last_name": "Smith"
    }
  }
}

https://ithelp.ithome.com.tw/upload/images/20230912/20161866zQTKVLL0hN.png
這時我們就找不到了~

那為什麼呢? 在dynamic設為false時

  • 新欄位會被忽略,但是不會被拒絕
    • 沒有被索引,但是依然會被納入_source,要記住在ES查詢的數據結構跟_source是分開的
  • last_name沒有創建反向索引
    • 所以沒辦法用last_name進行查詢
  • dynamic還能設置成strict
    • 讓ES會拒絕那些沒有設定mapping的欄位,才不會存了沒辦法查的東西

而如果我們設定好dynamic設為true時,ES又會對欄位類型有什麼樣的設定呢?
(dynamic設為runtime之後再介紹)
https://ithelp.ithome.com.tw/upload/images/20230912/20161866N7l15RxPQP.png

ES會選擇條件更寬鬆的狀況去儲存
例如123會選擇long而非integer,因此很多時候會有浪費空間
因此這樣的動態映射我們也可以對其進行我們想要的方向調整,我們明天會來介紹這樣的功能~

Dynamic templates!

參考資料
Dynamic field mapping:
https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html


上一篇
【Day 9】由淺入深來探討Elasticsearch - Join type field
下一篇
【Day 11】由淺入深來探討Elasticsearch - Dynamic templates
系列文
由淺入深來探討Elasticsearch,從基礎語法到底層相關原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言