1. 程式人生 > >對映型別(mapping type)從Elasticsearch中移除

對映型別(mapping type)從Elasticsearch中移除

原文:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

注意:在Elasticsearch6.0.0或者或者更新版本中建立的索引只會包含一個對映型別(mappingtype)。在5.x中建立的具有多個對映型別的索引在Elasticsearch6.x中依然會正常工作。在Elasticsearch7.0.0中,對映型別將會被完全移除。

什麼是對映型別?

Elasticsearch的第一個發行版開始,每一個文件都會被儲存在一個單獨的索引中,並且配以一個單獨的對映型別。一個對映型別被用來表示被索引的文件或者實體的型別,比如一個

twitter索引可能會有一個user型別和一個tweet型別。

每一個對映型別都可以有其自身的欄位,所以user型別可能有一個full_name欄位,一個user_name欄位和一個email欄位,而tweet型別可能會包含一個content欄位,一個tweeted_at欄位,以及與user型別中類似的user_name欄位。

每個文件都有一個_type元欄位用來儲存型別名,搜尋可以通過在URL中指定型別名將搜尋限定於一個或多個型別中:

GET twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
} } }

_type欄位的值會與文件的_id欄位的值組合起來生成_uid欄位,所以具有相同_id的不同型別的多個文件可以共存於一個索引中。

對映型別也被用來建立文件之間的父子關係,比如question型別的文件可以是answer型別文件的父親。

為什麼要移除對映型別(mappingtypes

開始的時候,我們說“索引(index)”類似於SQL資料庫中的“資料庫”,將“型別(type)”等同於“表”。

這是一個糟糕的類比,並且導致了一些錯誤的假設。在SQL資料庫中,表之間是相互獨立的。一個表中的各列並不會影響到其它表中的同名的列。而在對映型別(mappingtype)中卻不是這樣的。

在同一個Elasticsearch索引中,其中不同對映型別中的同名欄位在內部是由同一個Lucene欄位來支援的。換句話說,使用上面的例子,user型別中的user_name欄位與tweet型別中的user_name欄位是完全一樣的,並且兩個user_name欄位在兩個型別中必須具有相同的對映(定義)。

這會在某些情況下導致一些混亂,比如,在同一個索引中,當你想在其中的一個型別中將deleted欄位作為date型別,而在另一個型別中將其作為boolean欄位。

在此之上需要考慮一點,如果同一個索引中儲存的各個實體如果只有很少或者根本沒有同樣的欄位,這種情況會導致稀疏資料,並且會影響到Lucene的高效壓縮資料的能力。

基於這些原因,將對映型別的概念從Elasticsearch中移除。

對映型別的可選替代方案

每種文件型別一個索引

第一種選擇就是每個文件型別對應一個索引。你可以不將tweetsusers儲存於同一個索引,而將它們分別儲存於tweets索引和users索引中。索引之間是完全相互獨立的,不同索引中的(同名的)欄位型別也就不會產生衝突了。

這種方式有兩個好處:

  • 資料更傾向於密集(而不是稀疏),這樣就能獲益於Lucene的壓縮技術。

  • 因為同一個索引中的所有的文件代表同一種實體,用於為全文搜尋打分的條件統計會更精確。

每個索引可以依據其可能的文件儲存量級來設定相關的配置:可以對users使用較少的主分片,同時對tweets使用較大數量的主分片。

自定義型別欄位

當然,一個叢集中可以建立的主分片的數量是有限制的,所以你可能不想為一個只有幾千個文件的集合去浪費一整個分片。這種情況下你可以使用你自己定義的type欄位,它看起來和原來的_type工作機制類似。

我們繼續使用上面的user/tweet例子。原來的工作流程可能像下面這樣:

PUT twitter
{
  "mappings": {
    "user": {
      "properties": {
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" }
      }
    },
    "tweet": {
      "properties": {
        "content": { "type": "text" },
        "user_name": { "type": "keyword" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/user/kimchy
{
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "[email protected]"
}

PUT twitter/tweet/1
{
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

你可以通過自定義的type欄位實現同樣的目的:

PUT twitter
{
  "mappings": {
    "doc": {
      "properties": {
        "type": { "type": "keyword" }, 
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "content": { "type": "text" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/doc/user-kimchy
{
  "type": "user", 
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "[email protected]"
}

PUT twitter/doc/tweet-1
{
  "type": "tweet", 
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "kimchy"
        }
      },
      "filter": {
        "match": {
          "type": "tweet" 
        }
      }
    }
  }
}

在沒有對映型別的情況下實現父子關係

先前,我們通過將一個對映型別指定為父,另一個或多個對映型別為子來表示父子關係。在沒有型別的情況下,我們就不能使用這種語法了。父子關係的特徵會向之前那樣工作,不同之處在於文件之間這種關係的表示方式變成了使用新的join欄位。

對映型別的移除計劃

對於使用者來說這是一個大的變化,所以我們儘可能將這個過程變得平滑。這次變更的計劃如下:

Elasticsearch 5.6.0

  • 在一個索引上設定index.mapping.single_type:true會啟用單索引-單一型別的行為,而這種行為在6.0中是強制的。

  • 5.6中建立的索引可以使用建立文件間父子關係的新的join欄位。

Elasticsearch 6.x

  • 5.x中建立的索引可以在6.x中正常工作

  • 6.x中建立的索引只允許單個索引中存在單一的型別。任意的名字都可以作為型別,但是隻能有一個。

  • _type名不再與_id組合生成_uid欄位。_uid欄位變成僅僅是_id欄位的別名。

  • 新建立的索引不再支援舊風格的父子關係,而應該使用join欄位。

  • _default_對映型別被標記為不推薦使用。

Elasticsearch 7.x

  • URL中的type引數為可選。比如,索引一個文件不再要求提供文件型別。

  • GET|PUT_mapping API支援一個查詢字串引數(include_type_name),通過這個引數來指定請求體是否應該包含一個型別名的層。預設是true7.x中沒有顯式指定型別的索引將會使用預設的_doc型別名。

  • _default_對映型別移除。

Elasticsearch 8.x

  • 不再支援URL中的type引數。

  • include_type_name引數預設為false

Elasticsearch 9.x

  • include_type_name引數移除。

將索引從多型別遷移到單型別

可以用ReindexAPI將多型別索引轉化成單型別索引。下面的例子可以在Elasticsearch 5.6或者Elasticsearch6.x中使用。在6.x中,不必指定index.mapping.single_type,因為6.x中是預設開啟的。

每種文件型別轉化成一個索引

這個例子將我們的twitter索引分成了tweets索引和users索引:

PUT users
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "user": {
      "properties": {
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT tweets
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "tweet": {
      "properties": {
        "content": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        
            
           

相關推薦

對映型別mapping typeElasticsearch

原文:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html 注意:在Elasticsearch6.0.0或者或者更新版本中建立的索引只會包含一個對映型別(

使用表型別Table Type實現百萬級別的資料一次性毫秒級別插入

使用表型別(Table Type)實現百萬級別的資料一次性插入 思路 1 建立表型別(TaBleType)         2 建立新增儲存過程    3 使用C#語言構建一個DataTable         4 將整個Table作為引數插入步驟1 建立表型別(TaBleType) CREATE TYPE

資料型別data type

資料型別(data type) 資料型別分為基本資料型別和引用資料型別。 1、基本資料型別 8種基本資料型別。各個基本型別之間是平等的,不存在大小和父子類的關係。它們之間的大小隻是從儲存資料所佔用的空間來比較的。 1.數值型 ​ 1.在Java

Hibernate實體型別Entity Type與值型別Value Type的概念分析

Hibernate中的實體型別和值型別,大家在實際應用中都有一個大致的概念,但是如何更明確的給他們下一個合適的定義呢? 我們需要從Hibernate看待各種物件出發。 物件內有用於標識用的屬性(一般都

批量更新程式碼整理程式碼庫陣列批量取資料的方法

查詢出所有的資料,分批插入。從原來的所有的list 資料裡面,每次拿出X 條資料,再批量更新 public void insertStudent() { List<Student> list = studentDao.listAllStudentForStat(); i

深入理解計算機系統原書第三版練習題2.6 感性認識整型和浮點型別同一個數在機器表示

/** * 練習題2.6 感性認識整型和浮點型別(同一個數)在機器中表示 * 由於我的機器是小端表示,將列印結果還原真實數並用二進位制表示 * 41913500 -->(還原) 0x00359141 -->(二進位制) 0000 0000 0011 0101

Android日常.xml獲取陣列的@drawable

在寫APP時,想從.xml中獲取@drawable/picname Resources res = getResources(); int[] imageId = res.getIntArray(R.array.bookImage); 然後用Log.i

powershell 自動禁用的賬號

所有 pre identity str com cat each 特定 confirm 1.特定組中移除禁用賬號 $group= "testgroup" $members = Get-ADGroupMember -Identity $group foreach ($mem

python-進階教程-序列重複項並保持元素順序不變

0.摘要 本文主要介紹去除序列中重複的元素,並保持剩下元素順序不變的方法。   1.轉set() 如果只想去除重複元素,而不關心順序問題,可以將序列轉為set,從而達到簡單快速去重的效果。 a = [1,2,3,4,5,6,5,4,3,2,1,7,8,9] a = li

unittest單元測試TestSuit()不需要執行的用例

:Test Suite: 原始碼中只提供了addtest的方法新增需要執行的用例到容器中,沒有提供從容器中移走某個用例的方法,其實很好理解,只需要用到remove函式就能實現了。具體的改造也只是將append改成remove即可 def delTest(self,

VMware Workstation 與 Hyper-V 不相容。請先系統 Hyper-V 角色,然後再執行 VMware Workstation

VMware Workstation 與 Hyper-V 不相容。請先從系統中移除 Hyper-V 角色,然後再執行 VMware Workstation。 原因:Hyper-V後VMware都要獨佔基於CPU等底層硬體的 Hypervisor才能執行,所

在Linux如何將使用者

如何將使用者從一個組中移除? gpasswd -d userName groupName # id用來檢視使用者屬性 [[email protected] gl]# id root uid=0(root) gid=0(root) groups=

List.clear方法——列表所有元素

示例  本示例使用List介面的實現類ArrayList,初始化一個列表物件list,並呼叫add方法向該列表中新增資料,然後通過迴圈輸出list中的全部元素,最後呼叫clear方法移除所有元素,並輸出list物件是否為空。

Git已刪除大檔案

寫在前面 大家一定遇到過在使用Git時,不小心將一個很大的檔案新增到庫中,即使刪除,記錄中還是儲存了這個檔案。以後不管是拷貝,還是push/pull都比較麻煩。今天在上傳工程到github上,發現最大隻能上傳100MB大小檔案,在本地git庫中有一個150MB檔案,雖然

關於VMware vSphere 直接將主機VC,導致該主機VDS丟失記錄

完成後 導致 tro 通過 恢復 指定 再次 問題 解決 今天早上,虛擬機無法通過VC開機,而可以通過ESXi開機問題(詳見上一篇記錄)。**解決過程中將該主機直接從VC中移除然後再添加回來,提示該主機上使用的VDS不存在,似乎不能與現有的進行關聯。 與VDS相關的虛擬機在

使用表型別Table Type-SqlServer實現百萬級別的資料一次性毫秒級別插入

使用表型別(Table Type)實現百萬級別的資料一次性插入 思路 1 建立表型別(TaBleType)         2 建立新增儲存過程    3 使用C#語言構建一個DataTable      &

python3 筆記4.變數型別--對映型別字典

#對映型別 : 字典(與Python2.x有點不一樣,python2.x的字典鍵值一定需要引號引起來,除此外只要有新鍵產生列印時會鍵重排) # 1.字典(dictionary): 字典由兩部分構成 ke

常用對照表的參考_chapter-twoContent-Type

接下來 adding 網頁服務器 發送請求 不一致 行修改 用戶信息 官網 頁面 HTTP狀態碼詳解 狀態碼含義 100 客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩余部

1綜述零開始的嵌入式圖像圖像.../算法]

ref com use agg class nfv mac swe get 6m42qi瘓中壓忻采露http://www.58pic.com/c/12255624rjhf5n掌低僚托仗媳http://www.58pic.com/c/122555761tj9tn分移匾鼓韌掣h

ng機器學習視頻筆記十六 ——圖像處理談機器學習項目流程

公眾號 written 字符串分割 評估 jpg 關註 改進 視頻 pip ng機器學習視頻筆記(十六) ——從圖像處理談機器學習項目流程 (轉載請附上本文鏈接——linhxx) 一、概述 這裏簡單討論圖像處理的機器學習過程,主要討論的是機器學習的