我有大約1000萬非常扁平(像RDBMS行)存儲在ES中的文檔。每個文檔有10個字段,其中5個字段實際上是枚舉。在Elasticsearch中將字段映射到類型有什麼優勢?
我已經創建了一個映射,將Enum的序號映射爲Short,並在索引文檔時傳遞序號。
Elasticsearch實際上是否將這些值存儲爲索引中的Short?或者他們得到.toString()'ed?當我將一個字段映射到一個數據類型時,實際發生了什麼?
我有大約1000萬非常扁平(像RDBMS行)存儲在ES中的文檔。每個文檔有10個字段,其中5個字段實際上是枚舉。在Elasticsearch中將字段映射到類型有什麼優勢?
我已經創建了一個映射,將Enum的序號映射爲Short,並在索引文檔時傳遞序號。
Elasticsearch實際上是否將這些值存儲爲索引中的Short?或者他們得到.toString()'ed?當我將一個字段映射到一個數據類型時,實際發生了什麼?
由於ES建立在Lucene的基礎之上,因此這裏是查看字段實際存儲和使用的「底層」的地方。
據我所知,Lucene確實存儲的數據不僅僅是String格式。所以要回答你的一個問題,我相信答案是否定的 - 一切都不會得到.toString()'ed。實際上,如果您查看Lucene's document
package的文檔,您會看到它有很多數字類型(例如IntField
,LongField
等)。
的Elasticsearch documentation on Core Types也提到了這樣一個事實:「它採用內Lucene的具體結構,以支持數字 值數類型具有相同的範圍對應的Java 類型。」
此外,Lucene的提供查詢(其ES利用的)特異性與已知的數字術語,如它在Lucene's search
package討論的NumericRangeQuery
搜索字段設計。 Lucene中的相同數字類型也允許高效排序。
另一個好處是數據完整性。就像任何數據庫一樣,如果您只希望字段包含數字數據,並且您的應用程序嘗試插入非數字數據,則在大多數情況下,您會希望該插入失敗。當您嘗試索引其字段值與類型映射不匹配的文檔時,這是ES的默認行爲。 (雖然,你可以使用ignore_malformed
禁用數字字段此行爲,如果你願意的話)
希望這有助於...
是的!正是我想弄清楚的。謝謝。 – Kong
不客氣,很高興我能幫上忙! – BrookeB