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.

这同样适用于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

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

好的,主要问题是默认运算符。感谢您提供任何帮助或共享经验。谢谢。

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 select * from foo where json::text = 'foo';
于 2012-09-15T23:17:37.333 回答
0

JSON 或 XML 类型没有内部索引类型。此字段可以保存一个值,但它不能是索引 - 您需要使用 hstore 列或类似的辅助列。

于 2012-09-13T13:07:21.033 回答