原始文檔數(shù)據(jù)在進(jìn)入es中之后蓖谢,es會將其存為兩份捂蕴,一部分是對其中的索引字段數(shù)據(jù)進(jìn)行分詞索引,然后存儲所有的分詞索引結(jié)果闪幽,這個(gè)結(jié)果并不一定是整個(gè)文檔數(shù)據(jù)(通常都指定索引部分字段)啥辨。而另一份則是原始文檔數(shù)據(jù),而該文檔的所有的分詞索引都會指向該文檔盯腌。
1. _source的作用
_source就是指源文檔的存儲溉知,你可以理解為是es將你傳輸?shù)脑嘉臋n數(shù)據(jù)放在了_source字段中存儲,該設(shè)置是用來控制是否存儲源文檔數(shù)據(jù)的腕够,如果將該設(shè)置設(shè)置為false级乍,那就表示不會存儲源文檔的數(shù)據(jù)。會出現(xiàn)的問題就是導(dǎo)致查詢的時(shí)候無法完整展示所有文檔數(shù)據(jù)帚湘,只能看到索引中的數(shù)據(jù)玫荣。在檢索數(shù)據(jù)時(shí),最終檢索結(jié)果實(shí)際上就是_source中的數(shù)據(jù)大诸。
2._all的作用
與_source類似捅厂,_all也是一個(gè)字段,同樣也是存儲了完整的文檔數(shù)據(jù)资柔,但不同的是_all是一個(gè)超級字段焙贷。以圖中的文檔為例,如果開啟_all字段贿堰,那么name+author+content會組成一個(gè)超級字段盈厘,這個(gè)字段包含了其他字段的所有內(nèi)容,當(dāng)然也可以設(shè)置只存儲某幾個(gè)字段到_all屬性里面或者排除某些字段官边,該字段默認(rèn)不會被存儲,也就是說只會在進(jìn)行分詞索引時(shí)存在外遇,分詞索引結(jié)束后該字段就不會存在注簿,如果要存儲該字段,對_all字段開啟store屬性即可跳仿。
_all主要是在當(dāng)檢索內(nèi)容無法確定是在哪個(gè)字段上的時(shí)候诡渴,比較適合開啟該字段。
3.文檔對象中設(shè)置字段的store屬性作用
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word", store = false)
private String title; //標(biāo)題
@Field(type = FieldType.Keyword)
private String category;// 分類
@Field(type = FieldType.Keyword)
private String brand; // 品牌
@Field(type = FieldType.Double)
private Double price; // 價(jià)格
@Field(index = false, type = FieldType.Keyword)
private String images; // 圖片地址
public Item() {
}
}
store屬性設(shè)置作用于文檔中的某個(gè)字段之上菲语,表示是否開啟索引字段原數(shù)據(jù)存儲妄辩,其實(shí)簡單來理解就是將_source的范圍縮小為某個(gè)屬性字段,設(shè)置為true后山上,es會將該屬性字段的原數(shù)據(jù)額外單獨(dú)存儲一份眼耀,即該字段的原數(shù)據(jù)會存儲兩份,一份是在原始文檔佩憾,另一份則是單獨(dú)該字段的存儲哮伟。這也是為什么es的API中默認(rèn)將該屬性設(shè)為false干花,因?yàn)槠渑c_source字段重復(fù)存儲了同一部分?jǐn)?shù)據(jù)。
_source和store兩個(gè)設(shè)置任意為true都能夠?qū)ψ侄螌?shí)現(xiàn)高亮查詢楞黄,因?yàn)楦吡敛樵儽仨毐WC原字段數(shù)據(jù)的存儲池凄,才能進(jìn)行高亮查詢。
通常不建議開啟該屬性鬼廓,store屬性和_source字段兩個(gè)設(shè)置同時(shí)開啟會存儲重復(fù)數(shù)據(jù)肿仑。而且當(dāng)通過索引檢索時(shí),檢索的結(jié)果中如果包含store屬性字段碎税,該store屬性字段的內(nèi)容不會從原始文檔中讀取尤慰,而是額外進(jìn)行一次IO,讀取該字段的單獨(dú)存儲的文檔蚣录,所以會損失部分性能割择。
總結(jié):
(1)_source和_all其實(shí)都是兩個(gè)字段,只不過區(qū)別是_source是存儲的結(jié)構(gòu)化的原始文檔萎河,而_all是存儲的是一個(gè)所有field字段拼接而成的字符串荔泳,兩者是有區(qū)別的。
(2)store是作用于field(字段)上的屬性虐杯,決定該field是否單獨(dú)存儲一份文檔玛歌,該屬性可以作用于_all字段上,但與_source字段重復(fù)擎椰。
注: 轉(zhuǎn)載自https://www.codenong.com/