是否可以在利用杜松子酒索引的hstore列上进行全文搜索?
我有一个hstore列'data'和一个类似文档的索引:
CREATE INDEX hidx ON testhstore USING GIN (data);
据我所知,查询这个的方法是在hstore列上使用avals进行转换:
CAST(avals(data) AS text) @@ 'something'
然而,解释查询只进行扫描而不进行索引查找,在记录少于100k的表上花费几秒钟。
答案 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文档了解具体方法。但是,您需要编写自己的触发器,而不是使用提供的通用触发器。