精确词全文搜索 postgresql
exact word fulltext search postgresql
Postgresql 全文搜索匹配附近的单词,但我想在大内容中搜索确切的单词table(数十万行中的数千个单词)。
我的搜索速度一定非常快(不到一秒)。
使用 like 或 ilike 会很慢(200000 字:超过 5 秒)。
有没有人有疑问可以告诉我?
如果您使用 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));
让我们禁用顺序扫描以便使用索引,即使示例 table 太小了:
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)
Postgresql 全文搜索匹配附近的单词,但我想在大内容中搜索确切的单词table(数十万行中的数千个单词)。 我的搜索速度一定非常快(不到一秒)。 使用 like 或 ilike 会很慢(200000 字:超过 5 秒)。 有没有人有疑问可以告诉我?
如果您使用 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));
让我们禁用顺序扫描以便使用索引,即使示例 table 太小了:
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)