Postgresql 单字符文本搜索备选方案

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

要求:确保以最高效、最高效的方式处理复合列上的单字符ci文本搜索,包括相关性权重排序
具有表
创建表测试搜索(id int主键,全名varchar(300)不为空,短名varchar(30)不为空)
With3MLn行suggester api调用从第一个输入字符开始向db发送查询,并应返回按相关性排序的前20个结果

选择/缺点:

  • like lower()
    /
    我喜欢
    '%c%'
    上面的
    :在大数据集上速度慢,没有相关性
    
  • pg_trgm和基于三叉图的搜索
    like/ilike
    +composite
    gin/gist
    索引:单个字符不能拆分为多个三叉图,因此搜索是通过表格完整扫描完成的,没有相关性
  • 通过
    setweight(to_tsvector(lower())
    gin/gist
    索引进行全文搜索:基于相关性的输出,但结果较少,因为标记不包括单个字符

是否有其他选项可用于改进单字符搜索?如何改进或混合上述内容以获得最佳效果?如何强制全文跳过停止列表并创建所有可能的词素,如?

全文搜索根本帮不上你,因为只有整个单词被索引,你无法搜索子字符串

您最好使用此功能:

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']
-似乎对罕见字符很有效