单字符文本搜索替代

Single character text search alternative

要求:确保以最有效ci最有效的方式处理复合列上的单个字符ci文本搜索,包括相关权重排序;
具有 300 万行建议器 api 的 table create table test_search (id int primary key, full_name varchar(300) not null, short_name varchar(30) not null); 调用会从第一个输入字符开始向数据库发送查询,并且应返回按相关性排序的前 20 个结果。

Options/disadvantages:

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

全文搜索对此完全没有帮助,因为只会索引整个单词,而您无法搜索子字符串。

你能做的最好的事情就是使用这个函数:

CREATE FUNCTION get_chars(text) RETURNS char(1)[]
   LANGUAGE sql IMMUTABLE AS
$$SELECT array_agg(DISTINCT x)::char(1)[] FROM regexp_split_to_table(, '') 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)[];

对于频繁出现的字符,该查询仍应使用顺序扫描,因为这是最好的访问方法。但对于稀有字符,您可能会更快。