精确词全文搜索postgresql

时间:2018-06-28 11:05:15

标签: postgresql full-text-search exact-match

PostgreSQL全文搜索匹配附近的单词,但是我想在大型内容表中搜索确切的单词(成千上万行中的成千上万个单词)。 我的搜索必须非常快(不到一秒钟)。 使用like或ilike会使速度变慢(200000个单词:超过5秒)。 有人有疑问可以建议我吗?

1 个答案:

答案 0 :(得分:0)

如果您使用simple字典并创建适当的GIN索引,则应该能够通过PostgreSQL全文搜索解决您的问题:

CREATE TABLE haystack (id serial PRIMARY KEY, string text NOT NULL);
INSERT INTO haystack (string) VALUES ('I am your servant');
INSERT INTO haystack (string) VALUES ('What use is a server without a client?');

CREATE INDEX haystack_fts_ind ON haystack USING gin (to_tsvector('simple', string));

即使示例表太小,也请禁用顺序扫描,以便使用索引:

SET enable_seqscan=off;

现在仅找到完全匹配的内容,并且没有词干发生:

SELECT * FROM haystack
WHERE to_tsvector('simple', string) @@ to_tsquery('simple', 'servant');

 id |      string       
----+-------------------
  1 | I am your servant
(1 row)

索引可用于加快查询速度:

EXPLAIN (COSTS off) SELECT * FROM haystack
WHERE to_tsvector('simple', string) @@ to_tsquery('simple', 'servant');

                                        QUERY PLAN                                        
------------------------------------------------------------------------------------------
 Bitmap Heap Scan on haystack
   Recheck Cond: (to_tsvector('simple'::regconfig, string) @@ '''servant'''::tsquery)
   ->  Bitmap Index Scan on haystack_fts_ind
         Index Cond: (to_tsvector('simple'::regconfig, string) @@ '''servant'''::tsquery)
(4 rows)