2014-02-11 53 views
0

有誰知道如何創建PostgreSQL 9.3中的以下JSON數據的索引?如何在PostgreSQL 9.3中索引JSON數據,當其密鑰未知時?

示例數據:

{ 
    {"1111" : "aaaa"}, 
    {"2222" : "bbbb"}, 
    {"3333" : "cccc"} 
} 

說,如果我想在所有的鍵索引如何做到這一點?

謝謝。

+0

在9.3中,你不能在json上創建一個通用索引。使用'hstore'或等待9.4。你可以制定特定的功能指標,但爲此你必須解釋你需要做什麼。 –

+0

我需要在data :: json字段上實現trigram索引,以便ilike查詢可以快速執行,因爲我需要搜索此json的鍵,這可以是任意的。 select from

where ilike'%11111%'「; – napster

+0

因此,您並不在乎您是否匹配鍵或值?您只想搜索整個json文本是否爲模式? –

回答

1

你還沒有清楚地定義你想要的東西;這裏就是我假設你的意思是:

創建讓我測試任何給定的JSON值(上面的例子中)是否包含一個名爲「K」

關鍵的指標,我認爲這是唯一可能(理性地)在9.3中,如果json結構是一致的,即你總是有一組平面對象。如果是這種情況,你可以提取一組鍵,例如

regress=> create table x as select '[ 
    {"1111" : "aaaa"}, 
    {"2222" : "bbbb"}, 
    {"3333" : "cccc"} 
]'::json as col; 
SELECT 1 

regress=> select array_agg(k) from x, lateral json_array_elements(col) e, lateral json_object_keys(e) k; 
    array_agg  
------------------ 
{1111,2222,3333} 
(1 row) 

和包裹,多達在SQL函數:

CREATE OR REPLACE FUNCTION json_array_object_keys(json) RETURNS text[] AS $$ 
select array_agg(k) FROM lateral json_array_elements($1) e, lateral json_object_keys(e) k; 
$$ LANGUAGE sql IMMUTABLE; 

其工作原理如下:

CREATE INDEX json_nested_keys_idx ON x USING GIN(json_array_object_keys(col)); 

craig=> SELECT json_array_object_keys(col) from x; 
json_array_object_keys 
------------------------ 
{1111,2222,3333} 
(1 row) 

然後在表達式創建GIN數組索引

(警告,這樣的索引將b e極緩慢的更新,它會減慢插入/更新/刪除很多)

和按如下方式使用它:

SELECT * FROM x WHERE json_array_object_keys(col) @> ARRAY['1111']; 

您不能LIKE與陣列的方法做索引的搜索;你必須將數組壓縮成文本文字:

CREATE OR REPLACE FUNCTION json_array_object_keys_delim(json) RETURNS text AS $$ 
select array_to_string(array_agg(k),'|') FROM lateral json_array_elements($1) e, lateral json_object_keys(e) k; 
$$ LANGUAGE sql IMMUTABLE; 

CREATE INDEX json_tgrm_keys_idx ON x USING GiST((json_array_object_keys_delim(col)) gist_trgm_ops); 

SELECT * FROM x WHERE json_array_object_keys_delim(col) LIKE '%111%'; 
相關問題