单字符文本搜索替代
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:
like lower()
/ ilike
超过 '%c%'
:在大数据集上速度慢,没有相关性;
- pg_trgm with trigram based search
like/ilike
+ compound gin/gist
index: 单个字符不能拆分成几个trigrams 所以搜索通过table 全扫描,无相关性;
- 通过
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(, '') 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)[];
对于频繁出现的字符,该查询仍应使用顺序扫描,因为这是最好的访问方法。但对于稀有字符,您可能会更快。
要求:确保以最有效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:
like lower()
/ilike
超过'%c%'
:在大数据集上速度慢,没有相关性;- pg_trgm with trigram based search
like/ilike
+ compoundgin/gist
index: 单个字符不能拆分成几个trigrams 所以搜索通过table 全扫描,无相关性; - 通过
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(, '') 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)[];
对于频繁出现的字符,该查询仍应使用顺序扫描,因为这是最好的访问方法。但对于稀有字符,您可能会更快。