3

json 列を含むいくつかのテーブルがあり、これらの列にインデックスを作成したいと考えています。ただし、デフォルトの演算子クラス ( http://www.postgresql.org/docs/9.2/static/sql-createopclass.html ) を取得します。誰かがすでにそれを行っていますか、それとも代替案を教えてくれますか?

問題を再現するには、次を試してください。

>> create table foo (json json, id int);
CREATE TABLE
>> create index on foo (id);
CREATE INDEX
>> create index on foo (json);
ERROR:  data type json has no default operator class for access method "btree"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

gist同じことがorgilインデックスにも当てはまります。

興味深いことに、次のことを試してもエラーは発生しません。

>> create type "nested" as (json json, extra text);
CREATE TYPE
>> create table bar (id int, json nested);
CREATE TABLE
>> create index on bar (json);
CREATE INDEX

コンポーネントのインデックスが作成されていないためでしょうか。

さて、主な問題はデフォルトのオペレーターです。それに関する助けや経験を共有していただければ幸いです。ありがとう。

4

3 に答える 3

2

PLV8 JavaScript言語をインストールしたい場合は、次の回避策があります。

http://people.planetpostgresql.org/andrew/index.php?/archives/249-Using-PLV8-to-index-JSON.html

于 2012-09-13T13:18:11.087 に答える
2

私の場合に最適な解決策は次のとおりです。

私は単にjsonをテキストとして扱い、テキストにインデックスを作成します。

>> create index on foo ((json::text));

次に、クエリはインデックスを使用するように変換する必要があります。

Explainは、インデックスが使用されているかどうかを明らかにします。

>> explain select * from foo where json::text = 'foo';
于 2012-09-15T23:17:37.333 に答える
0

JSON または XML 型の内部インデックス型はありません。このフィールドは値を保持できますが、インデックスにすることはできません。hstore 列などを含む補助列が必要です。

于 2012-09-13T13:07:21.033 に答える