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 講》。