繁体   English   中英

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

[英]Full text search on hstore field using index

是否可以在利用gin索引的hstore列上进行全文搜索?

我有一个hstore列“数据”和一个像文档说的索引:

CREATE INDEX hidx ON testhstore USING GIN (data);

据我所能找到的查询方法是在hstore列上使用avals进行强制转换:

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

但是,explain查询仅执行扫描,而不执行索引查找,对少于10万条记录的表要花费几秒钟的时间。

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

例如:

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文档。 不过,您需要编写自己的触发器,而不要使用提供的通用触发器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM