Elasticsearch中的_source、_all、store、index

首先要明確一份數據在進入es中之後通常是如何存儲的

原始文檔數據在進入es中之後,es會將其存爲兩份,一部分是對其中的索引字段數據進行分詞索引,然後存儲所有的分詞索引結果,這個結果並不一定是整個文檔數據(通常都指定索引部分字段)。而另一份則是原始文檔數據,而該文檔的所有的分詞索引都會指向該文檔。

1. _source的作用

_source就是指源文檔的存儲,你可以理解爲是es將你傳輸的原始文檔數據放在了_source字段中存儲,該設置是用來控制是否存儲源文檔數據的,如果將該設置設置爲false,那就表示不會存儲源文檔的數據。會出現的問題就是導致查詢的時候無法完整展示所有文檔數據,只能看到索引中的數據。在檢索數據時,最終檢索結果實際上就是_source中的數據。

2._all的作用

與_source類似,_all也是一個字段,同樣也是存儲了完整的文檔數據,但不同的是_all是一個超級字段。以圖中的文檔爲例,如果開啓_all字段,那麼name+author+content會組成一個超級字段,這個字段包含了其他字段的所有內容,當然也可以設置只存儲某幾個字段到_all屬性裏面或者排除某些字段,該字段默認不會被存儲,也就是說只會在進行分詞索引時存在,分詞索引結束後該字段就不會存在,如果要存儲該字段,對_all字段開啓store屬性即可。

_all主要是在當檢索內容無法確定是在哪個字段上的時候,比較適合開啓該字段。

3.文檔對象中設置字段的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; //標題

    @Field(type = FieldType.Keyword)
    private String category;// 分類

    @Field(type = FieldType.Keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 價格

    @Field(index = false, type = FieldType.Keyword)
    private String images; // 圖片地址

    public Item() {
    }
    
}

store屬性設置作用於文檔中的某個字段之上,表示是否開啓索引字段原數據存儲,其實簡單來理解就是將_source的範圍縮小爲某個屬性字段,設置爲true後,es會將該屬性字段的原數據額外單獨存儲一份,即該字段的原數據會存儲兩份,一份是在原始文檔,另一份則是單獨該字段的存儲。這也是爲什麼es的API中默認將該屬性設爲false,因爲其與_source字段重複存儲了同一部分數據。

_source和store兩個設置任意爲true都能夠對字段實現高亮查詢,因爲高亮查詢必須保證原字段數據的存儲,才能進行高亮查詢。

通常不建議開啓該屬性,store屬性和_source字段兩個設置同時開啓會存儲重複數據。而且當通過索引檢索時,檢索的結果中如果包含store屬性字段,該store屬性字段的內容不會從原始文檔中讀取,而是額外進行一次IO,讀取該字段的單獨存儲的文檔,所以會損失部分性能。

總結:

(1)_source和_all其實都是兩個字段,只不過區別是_source是存儲的結構化的原始文檔,而_all是存儲的是一個所有field字段拼接而成的字符串,兩者是有區別的。

(2)store是作用於field(字段)上的屬性,決定該field是否單獨存儲一份文檔,該屬性可以作用於_all字段上,但與_source字段重複。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章