PostgreSQL中文全文搜索
Contents
安装 zhparser
使用
创建测试表:
create table ts (name varchar(1024));
sky=# select * from ts limit 50;
name
------------------------------
中国人民
中国人民解放军
中国人民解放军,军队
中国军人
中国军队
中国军队1
中国军队一二三
中国军队一二三四
军队一二三四
中国军队一三四
中国军队一三
中国军队一
中国军队
中国
中
中国军
中国军
为什么
为国
中军队
中军队你
中军队,解放
中军队,解放军
中军队,解放军队
中军队,解放军军队
中军队,解放军军队呀
中军队,解放军军队呀哈哈
中军队,解放军军队呀哈哈哈
中军队,解放军军队呀哈哈哈哈
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
你好
....
sky=# select count(1) from ts;
count
-------
65565
(1 row)
sky=#
插入足够多的测试数据。这里是65565条数据。
创建索引
下面假设你已经安装并配置好了
zhparser
.
zhparser.multi_short = on;
设置为全局级别后再创建索引.
alter role all set zhparser.multi_short=on;
创建索引:
create index idx_name on ts using gin(to_tsvector('testzhcfg', name));
全文搜索 VS LKIE
sky=# explain analyze select * from ts where to_tsvector('testzhcfg', name) @@ to_tsquery('testzhcfg', '军队');
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on ts (cost=10.54..401.46 rows=328 width=7) (actual time=0.010..0.011 rows=20 loops=1)
Recheck Cond: (to_tsvector('testzhcfg'::regconfig, (name)::text) @@ '''军队'''::tsquery)
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_name (cost=0.00..10.46 rows=328 width=0) (actual time=0.007..0.007 rows=20 loops=1)
Index Cond: (to_tsvector('testzhcfg'::regconfig, (name)::text) @@ '''军队'''::tsquery)
Planning time: 0.071 ms
Execution time: 0.026 ms
(7 rows)
sky=#
LIKE:
sky=# explain analyze select * from ts where name like '%军队%';
QUERY PLAN
------------------------------------------------------------------------------------------------
Seq Scan on ts (cost=0.00..1110.56 rows=3 width=7) (actual time=0.008..5.212 rows=20 loops=1)
Filter: ((name)::text ~~ '%军队%'::text)
Rows Removed by Filter: 65545
Planning time: 0.042 ms
Execution time: 5.223 ms
(5 rows)
sky=#
看来还是挺不错的.