如何在postgres中实现全名搜索

时间:2013-07-22 09:43:27

标签: database postgresql indexing

我在postgres 8.1 db中有一个表,其中包含大约370,000个客户的信息。该表包括字段sn(surname)和gn(给定名称)。我想让用户使用表单或简单地搜索客户全名。我构建查询的第一次尝试是这样的:

SELECT sn || ', ' || gn as name from users 
WHERE  sn || ' ' || gn like '%Johnson David%'
or   gn || ' ' || sn like '%Johnson David%' 

这很好,但速度很慢,时间为600/623毫秒。为了优化,我只在sn字段上创建了一个索引,因为我猜测gn字段将包含如此多的重复以致无法用于索引。不幸的是,索引姓氏根本没有提高性能,因为查询没有使用索引。

Seq Scan on users (cost=0.00..18296.06 rows=1 width=64) (actual time=57.935..588.755 rows=8 loops=1)

我的猜测是,原因是this thread中描述的原因。 我考虑使用多列索引,但我猜想这意味着我只能搜索上面提到的两种样式中的一种,即或者不是两种。

我还考虑过创建一个全文索引,但它似乎不适合名称值,因为我会得到大量的词干等等,这是不相关的。有没有人对索引策略有任何建议?它似乎应该是一个非常常见的用例。

2 个答案:

答案 0 :(得分:3)

由于您在字符串'%....'的开头使用通配符,因此不会使用索引。这不行。考虑using trigrams。或者,您可以使用f ull text search功能。这两种方法都需要更新版本的Postgres。你应该更新。 8.1是石器时代的旧版本,不受支持,新版本不仅速度更快,而且还为您提供更多功能,以满足您的需求。

答案 1 :(得分:0)

在完整计算表达式上创建索引。这仍将强制进行索引扫描,但表达式是预先计算的,索引比整个表小得多。