2017-06-02 61 views
3

我有一個json,我將它作爲jsonb存儲在postgres中。postgres jsonb列上的GIN索引是否嵌套?

{ 
    "name": "Mr. Json", 
    "dept":{ 
    "team":{ 
     "aliases":["a1","a2","a3"], 
     "team_name": "xyz" 
    }, 
    "type":"engineering", 
    "lead":"Mr. L" 
    }, 
    "hobbies": ["Badminton", "Chess"], 
    "is_active": true 
} 

已創建的列

我需要做精確匹配查詢,如包含類型=「工程」的所有行,並導致='先生一個GIN索引。 L」。 我目前做的遏制查詢:

data @> '{"dept":{"type":"engineering"}}' and data @> '{"dept":{"lead":"Mr. L"}}' 

我看到查詢計劃,顯示正在使用GIN索引,但我不能確定這是否正常工作或是否有實現這一目標的一些更好的方法。

我需要在嵌套鍵上構造另一個索引嗎?

索引jsonb列索引嵌套鍵或只是最高級的索引?

也請分享一些很好的資源。

+0

爲什麼不只是'data @''{「dept」:{「lead」:「Mr。L」,「type」:「engineering」}}''?您的查詢將使用索引兩次,而這(相當於)將只使用一次。 – pozs

回答

4

docs

爲jsonb默認GIN操作符類支持的查詢與頂級密鑰存在運營商,? &和?|運營商和路徑/價值運營商@>。

遏制@>它與嵌套值一起使用。對於其他運算符,它僅適用於頂級鍵或表達式索引中使用的任何級別。另外,根據文檔,在想要查詢的級別上使用表達式索引將比在整列上使用簡單索引快(這是有意義的,因爲大小較小)。

如果您只進行收容搜索,請在構建索引時考慮使用jsonb_path_ops。它更小更快。