如何将uuid与postgresql gist索引类型一起使用?

问题描述 投票:0回答:3

我不能直接将 uuid 与要点索引一起使用

CREATE INDEX idx_leaderboads_values_gist
  ON leaderboard_entry
  USING gist
  (id_leaderboard , value);

我收到了这个错误:

错误:数据类型 uuid 没有访问方法的默认运算符类 “要点”

提示:您必须为索引指定一个运算符类或定义一个 数据类型的默认运算符类。

postgresql indexing uuid gist-index
3个回答
18
投票

Postgres 10 或更高版本

btree_gist现在还涵盖数据类型

uuid
,就像Paul评论的那样。 (还有一些其他数据类型,尤其是所有 enum
 类型。)

现在您只需为每个数据库安装一次扩展即可:

CREATE EXTENSION btree_gist;
那么你的索引应该就可以工作了。

相关:

  • 使用按位 AND 运算符对位串列进行排除约束
  • 在 PostgreSQL 中创建多列索引,包含标量列和数组列
Postgres 9.6 或更早版本

(原答案。)

通常我会建议附加模块
btree_gist,但是类型uuid

被它覆盖。

理论上,由于 UUID 是

a 128-bit quantity

每个文档),因此最有效的方法是将其转换为两个 bigint
float8
 以用于索引。但标准 Postgres 中没有定义这些类型转换。

我在 pqsql-hackers 列表中发现了一个

stab 朝那个方向,但似乎不成功。

剩下的选项是

text

 表示上的功能性 GiST 索引:

CREATE INDEX idx_leaderboads_values_gist ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));
要使用此功能索引,查询必须匹配该表达式。您可以在查询中使用简写 

"value"::text

(但不能在不添加更多括号的索引定义中使用)。

旁白:不要使用

value

 作为列名,它是标准 SQL 中的 
保留字

问题是:

为什么你需要GiST索引。最佳解决方案取决于目标。


5
投票
如果您使用的是 Postgres 10,并且使用转储/恢复从以前的版本迁移数据库,则可能需要运行:

ALTER EXTENSION btree_gist UPDATE;

为了让要点索引与 UUID 一起使用。


0
投票
对于任何使用

Django 遇到此错误消息的人:

UndefinedObject: data type uuid has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type. The above exception was the direct cause of the following exception: ProgrammingError: data type uuid has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type.
安装扩展(可逆)的最佳方法是编辑迁移文件,这就是您所需要的:

from django.contrib.postgres.operations import BtreeGistExtension from django.db import migrations class Migration(migrations.Migration): initial = True dependencies = [] operations = [BtreeGistExtension()]

Django 5.1

 上测试。
我知道这个答案比OP正在寻找的内容更具体,但该页面是流行搜索引擎上的第一个结果。

© www.soinside.com 2019 - 2024. All rights reserved.