使用索引在hstore字段上进行全文搜索

时间:2014-08-22 05:54:17

标签: database postgresql search hstore

是否可以在利用杜松子酒索引的hstore列上进行全文搜索?

我有一个hstore列'data'和一个类似文档的索引:

CREATE INDEX hidx ON testhstore USING GIN (data);

据我所知,查询这个的方法是在hstore列上使用avals进行转换:

CAST(avals(data) AS text) @@ 'something'

然而,解释查询只进行扫描而不进行索引查找,在记录少于100k的表上花费几秒钟。

1 个答案:

答案 0 :(得分:2)

是的,您可以在任何表达式上创建全文索引,而不仅仅是列。

e.g:

CREATE INDEX someindex ON sometable USING gin(to_tsvector('english', CAST(avals(data) AS text)));

我建议在简单的SQL函数中包装这些表达式,例如:

CREATE OR REPLACE FUNCTION hstore_vals_text(hstore)
RETURNS text LANGUAGE sql IMMUTABLE AS $$
SELECT CAST(avals($1) AS text);
$$;

CREATE INDEX someindex ON sometable USING gin(to_tsvector('english', hstore_vals_text(data)));

SELECT ... FROM ... WHERE hstore_vals_text(data) @@ to_tsquery('something');

这有助于解析器将索引与表达式进行匹配,因为它无法确定哪些索引与哪些表达式匹配。

为了获得最佳性能(以一些浪费的存储空间为代价),您可能希望在包含tsvector和索引的触发器维护列中复制数据;请参阅tsearch2文档了解具体方法。但是,您需要编写自己的触发器,而不是使用提供的通用触发器。