Elasticsearch 如何設(shè)計(jì)映射?

1. 映射 (mapping) 基礎(chǔ)

mapping 定義了文檔的各個(gè)字段如何被索引以及如何存儲(chǔ)。我們可以把 Elasticsearch 的 mapping 看做 RDBMS 的 schema。

雖然 Elasticsearch 可以根據(jù)索引的數(shù)據(jù)動(dòng)態(tài)的生成 mapping,我們?nèi)匀唤ㄗh在創(chuàng)建索引時(shí)明確的定義自己的 mapping,不合理的 mapping 會(huì)引發(fā)索引和查詢性能降低,磁盤占用空間變大。錯(cuò)誤的 mapping 會(huì)導(dǎo)致與預(yù)期不符的查詢結(jié)果。

2. 選擇合適的數(shù)據(jù)類型

2.1 分清 text 和 keyword

text 類型

  • 用于存儲(chǔ)全文搜索數(shù)據(jù),例如:郵箱內(nèi)容、地址、代碼塊、博客文章內(nèi)容等。
  • 默認(rèn)結(jié)合 standard analyzer(標(biāo)準(zhǔn)解析器)對(duì)文本進(jìn)行分詞、倒排索引。
  • 默認(rèn)結(jié)合標(biāo)準(zhǔn)分析器進(jìn)行詞命中、詞頻相關(guān)度打分。

keyword 類型

  • 用于存儲(chǔ)需要精確匹配的數(shù)據(jù)。例如手機(jī)號(hào)碼、主機(jī)名、狀態(tài)碼、郵政編碼、標(biāo)簽、年齡、性別等數(shù)據(jù)。
  • 用于篩選數(shù)據(jù)(如 select * from x where status=‘open’)、排序、聚合(統(tǒng)計(jì))。
  • 直接將完整的文本保存到倒排索引中,并不會(huì)對(duì)字段的數(shù)據(jù)進(jìn)行分詞。

如果 keyword 能滿足需求,盡量使用 keyword 類型。

3. mapping 和 indexing

mapping 定義得是否合理,將直接影響 indexing 性能,也會(huì)影響磁盤空間的使用。

3.1 mapping 無(wú)法修改

Ealsticsearch 的 mapping 一旦創(chuàng)建,只能增加字段,不能修改已有字段的類型。

3.2 幾個(gè)重要的 meta field

1. _all

雖然在 Elasticsearch 6.x 中,_all 已經(jīng)是 deprecated,但是考慮到 6.x 之前的版本創(chuàng)建的索引 _all 字段是默認(rèn)啟用的,這里有必要詳細(xì)說(shuō)說(shuō)明下該字段的含義。

_all 字段是一個(gè) text 字段,它將你索引的單個(gè)文檔的所有字段連接成一個(gè)超級(jí)串,之后進(jìn)行分詞、索引。如果你不指定字段,query_string 查詢和 simple_query_string 查詢默認(rèn)查詢 _all 字段。

_all 字段不是“免費(fèi)”的,索引過(guò)程會(huì)占用額外的 CPU 資源,根據(jù)測(cè)試,在我們的數(shù)據(jù)集上,禁用 _all 字段后,索引性能可以提高 30%+,所以,如果您在沒(méi)有明確 _all 含義的情況下,歷史索引沒(méi)有禁用 _all 字段,建議您重新審視該字段,看是否需要禁用,并 reindex,以獲取更高的索引性能以及占用更少的磁盤空間。如果 _all 提供的功能對(duì)于您的業(yè)務(wù)必不可少,考慮使用 copy_to 參數(shù)代替 _all 字段。

完整內(nèi)容:《高可用 Elasticsearch 集群 21 講》。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第3章 映射 映射是定義存儲(chǔ)和索引的文檔類型以及字段的過(guò)程。索引中的每一個(gè)文檔都有一個(gè)類型,每種類型都有它自己的映...
    MR_ChanHwang閱讀 2,365評(píng)論 0 1
  • 獲取索引的mapping 實(shí)例: 測(cè)試分析器 創(chuàng)建一個(gè)索引 到目前為止, 我們已經(jīng)通過(guò)索引一篇文檔創(chuàng)建了一個(gè)新的索...
    M醉逍遙閱讀 1,122評(píng)論 0 1
  • ## 寫在前面 前段時(shí)間在實(shí)時(shí)獲取SQLServer數(shù)據(jù)庫(kù)變化時(shí)候,整個(gè)過(guò)程可謂是坎坷。然后就想在這里記錄一下。 ...
    留歌_36閱讀 1,172評(píng)論 0 0
  • Mapping 類似于數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)定義,主要作用如下: 定義Index下字段名(Field Name) 定義字...
    小旋鋒的簡(jiǎn)書閱讀 18,331評(píng)論 0 13
  • 放棄去想所有的事情,放空掉,想開點(diǎn),不要再去想別人的想法,不要再顧慮那么多,這世界上總有許多種活法,你要試一下其他...
    太公的魚竿閱讀 138評(píng)論 0 0

友情鏈接更多精彩內(nèi)容