我有一些带有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
或gil
索引。
有趣的是,当我尝试以下操作时,我没有收到错误:
>> 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
这是因为没有为组件创建索引吗?
好的,主要问题是默认运营商。任何帮助或共享经验表示赞赏。 感谢。
答案 0 :(得分:2)
如果您想安装PLV8 JavaScript语言,可以采取相应的解决方法:
http://people.planetpostgresql.org/andrew/index.php?/archives/249-Using-PLV8-to-index-JSON.html
答案 1 :(得分:2)
最适合我案例的解决方案如下:
我只是将json视为文本并在文本上创建索引。
>> create index on foo ((json::text));
然后必须转换查询,以便它使用索引。
解释显示是否使用了索引。
>> explain select * from foo where json::text = 'foo';
答案 2 :(得分:1)
JSON或XML类型没有内部索引类型。这个字段可以包含一个值,bat它不能是索引 - 你需要使用hstore列或类似的辅助列。