Postgresql 单字符文本搜索备选方案
要求:确保以最高效、最高效的方式处理复合列上的单字符ci文本搜索,包括相关性权重排序Postgresql 单字符文本搜索备选方案,postgresql,postgresql-10,Postgresql,Postgresql 10,要求:确保以最高效、最高效的方式处理复合列上的单字符ci文本搜索,包括相关性权重排序 具有表创建表测试搜索(id int主键,全名varchar(300)不为空,短名varchar(30)不为空)With3MLn行suggester api调用从第一个输入字符开始向db发送查询,并应返回按相关性排序的前20个结果 选择/缺点: like lower()/我喜欢'%c%'上面的:在大数据集上速度慢,没有相关性 pg_trgm和基于三叉图的搜索like/ilike+compositegin/gis
具有表
创建表测试搜索(id int主键,全名varchar(300)不为空,短名varchar(30)不为空)
With3MLn行suggester api调用从第一个输入字符开始向db发送查询,并应返回按相关性排序的前20个结果
选择/缺点:
/like lower()
我喜欢
上面的'%c%'
:在大数据集上速度慢,没有相关性李>
- pg_trgm和基于三叉图的搜索
+compositelike/ilike
索引:单个字符不能拆分为多个三叉图,因此搜索是通过表格完整扫描完成的,没有相关性李>gin/gist
- 通过
setweight(to_tsvector(lower())
索引进行全文搜索:基于相关性的输出,但结果较少,因为标记不包括单个字符李>gin/gist
- pg_trgm和基于三叉图的搜索
是否有其他选项可用于改进单字符搜索?如何改进或混合上述内容以获得最佳效果?如何强制全文跳过停止列表并创建所有可能的词素,如?全文搜索根本帮不上你,因为只有整个单词被索引,你无法搜索子字符串 您最好使用此功能:
CREATE FUNCTION get_chars(text) RETURNS char(1)[]
LANGUAGE sql IMMUTABLE AS
$$SELECT array_agg(DISTINCT x)::char(1)[] FROM regexp_split_to_table($1, '') AS x$$;
然后索引
CREATE INDEX ON test_search USING gin (get_chars(full_name || short_name));
和搜索一样
SELECT * FROM test_search
WHERE get_chars(full_name || short_name) @> ARRAY['c']::char(1)[];
对于频繁字符,此查询仍应使用顺序扫描,因为这是最好的访问方法。但是对于稀有字符,这样做可能会更快。显然,SQL Server中的解决方案是创建一个没有停止字的字典(或FTS配置)。这在Postgres中也应该是可能的。我在考虑使用gin((string_to_数组(full_name,null))在_表上创建索引ix_字符)然后使用
其中字符串到数组(…)@>array['x']
-似乎对罕见字符很有效