在PostgreSQL 9.2中的json字段上创建索引

时间:2012-09-13 12:28:14

标签: json postgresql indexing postgresql-9.2

我有一些带有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.

同样适用于gistgil索引。

有趣的是,当我尝试以下操作时,我没有收到错误:

>> 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

这是因为没有为组件创建索引吗?

好的,主要问题是默认运营商。任何帮助或共享经验表示赞赏。 感谢。

3 个答案:

答案 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列或类似的辅助列。