Lau*_*lbe 5
这并不容易解决:全文搜索需要 GIN 索引,但 GIN 索引不支持ORDER BY
. 此外,如果您有一个ORDER BY
用于全文搜索的 B-tree 索引和一个 GIN 索引,则可以使用位图索引扫描将它们组合起来,但位图索引扫描也不支持ORDER BY
。
如果您创建自己的“停用词”列表,其中包含数据中的所有常用词(除了正常的英语停用词),我看到了一定的可能性。然后,您可以定义使用该停用词文件的文本搜索词典和english_rare
使用该词典的文本搜索配置。
然后,您可以使用该配置创建全文索引,并分两步进行查询,如下所示:
寻找稀有词:
SELECT *
FROM (SELECT *
FROM tbl
WHERE va @@ to_tsquery('english_rare', 'test')
OFFSET 0) AS q
ORDER BY b LIMIT 100;
子查询OFFSET 0
将阻止优化器扫描b
.
对于罕见的单词,这将很快返回正确的结果。对于频繁出现的单词,这将不返回任何内容,因为to_tsquery
将返回一个空结果。要区分因单词未出现而导致的未命中和因单词频繁出现而导致的未命中,请注意以下注意事项:
SELECT *
FROM (SELECT *
FROM tbl
WHERE va @@ to_tsquery('english_rare', 'test')
OFFSET 0) AS q
ORDER BY b LIMIT 100;
寻找常用词(如果第一个查询给了您通知):
SELECT *
FROM (SELECT *
FROM tbl
ORDER BY b) AS q
WHERE va @@ to_tsquery('english', 'test')
LIMIT 100;
注意我们这里使用的是正常的英文配置。这将始终扫描索引,b
并且对于频繁的搜索词将相当快。
更多推荐
高效,全文,PostgreSQL
发布评论