[英]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.