一、Nested類型的介紹
Elasticsearch Nested類型是指將一個對象數組作為一個欄位進行索引。Nested類型是一種特殊的對象類型,它可以用來存儲在嵌套對象中包含的其他對象信息。這個Nested對象可看做是一個嵌套的對象和它的子文檔的集合,可以在同一個document中進行索引。
為了使用Nested類型,要使用下面三個步驟:
1、創建一個mapping
2、在該欄位上使用Nested類型,並在欄位中定義它內部的對象或屬性
3、存儲和查詢數據
{ "mappings": { "properties": { "manufacturer": { "type": "nested", "properties": { "name": { "type": "text" }, "location": { "type": "geo_point" } } } } } }
二、Nested類型的應用場景
Nested類型主要應用於以下兩種情況:
1、嵌套的對象具有多個屬性,每個屬性都需要各自獨立地搜索。
2、嵌套的對象通常會作為一個整體來搜索,比如博客文章,具有標題、正文、標籤等屬性。
在這些情況下,Nested類型都可以發揮出很好的效果。然而,Nested類型也存在一些缺點。Nested類型會在內存中重複保存與其相關的文檔,因此在數據壓縮時,內存需求量會增加。
三、Nested類型的使用方式
1、創建Mapping
Nested類型必須在索引mapping時,作為一種複合類型進行定義。
PUT nested_test { "mappings": { "properties": { "name": {"type": "keyword"}, "age": {"type": "integer"}, "sex": {"type": "keyword"}, "notes": { "type": "nested", "properties": { "title": {"type": "text"}, "content": {"type": "text"}, "date": {"type": "date"} } } } } }
2、索引文檔
Nested類型欄位的支持直接給定內部對象的一個數組,配合它的properties實現保存、查詢和表達式計算的支持。
PUT /index/_doc/1 { "name":"tom", "age":18, "sex":"male", "notes":[ { "title":"note1", "content":"hello elasticsearch", "date":"2020-01-01" }, { "title":"note2", "content":"hello nested type", "date":"2020-01-02" } ] }
3、查詢Nested類型
在查詢時,Nested類型的欄位要進行特殊處理。要查詢內部的欄位時,必須使用dot notation指明嵌套欄位和其屬性名稱。
GET index/_search { "query": { "nested": { "path": "notes", "query": { "bool": { "must": [ {"match": {"notes.title": "note1"}}, {"range": {"notes.date": {"gt":"2019-12-31"}}} ] } } } } }
四、Nested類型的注意事項
1、嵌套欄位不能被映射為子文檔或其他同級的Object類型。
2、Nested類型內部如果有多個屬性,則每個屬性都是一個單獨的欄位。
3、Nested類型不支持聚合查詢。
4、嵌套文檔必須具備唯一標識。
5、查詢時,必須使用Nested類型的嵌套路徑。
6、存儲和查詢數據的性能延遲比較高。
五、總結
本篇文章通過介紹Nested類型的基本信息、使用方式及注意事項,讓讀者對Nested類型有了一個更深入的了解。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190305.html