2012-10-12 36 views
4

我在查询中遇到复数问题。我需要的是一种Ruby中的方法,或者是在我搜索时可以帮助我的sql。例如:查询中的Postgres/Rails复数问题

当我搜索“数组” 我希望它也返回“数组”的结果。

感谢

+2

你可能用全文检索系统更好。 –

回答

3

你在找什么是word stemming

你不能用一堆正则表达式来真正干扰像英语这样的语言,但有太多例外。你需要一个大词干词典。

PostgreSQL的全文搜索提供了这样一本词典,我强烈建议您使用全文搜索这个职位:

regress=# WITH vals(a,b) AS (VALUES ('goose','geese'), ('query','queries'), ('arrays','array')) 
SELECT to_tsquery(a), to_tsvector(b), to_tsquery(a) @@ to_tsvector(b) FROM vals; 
to_tsquery | to_tsvector | ?column? 
------------+-------------+---------- 
'goos'  | 'gees':1 | f 
'queri' | 'queri':1 | t 
'array' | 'array':1 | t 
(3 rows) 

虽然你会发现所产生的字典是不完美的;我希望搜索“鹅”来匹配“鹅”,但它没有。您可能需要增强字典。 PostgreSQL的字典也可以是a bit over-enthusiastic about stemming at times

另一种方法是使用更大,更容易定制的工具,如Apache Solr。

+0

正是! PostgreSQL全文搜索比'LIKE'好,而且它已经内置了。尝试一下,看看它如何适用于您的应用程序。如果效果很好,很好:你完成了,没有额外的运动部件。如果没有,部署Sphinx或Solr--无论是在搜索方面的能力还是坦率地更高,但使用单独的搜索服务器会增加操作的复杂性。有时PostgreSQL是正确的选择,有时候不是。 – willglynn

0
Class.all(:conditions => ["attribute LIKE ?", "array%"]) 

应该这样做,我一直与梁2一会儿所以概率一个更好的方式,但会做的伎俩。

+3

但是如果你搜索“鹅”会发生什么?应该搜索“the”找到“词库”吗? –

+0

取决于你想如何设置它我猜,你可以在搜索查询中使用singluarize和pluralize方法并返回两者?你想要达到什么目的? – cih

1

使用Postgres全文搜索时,可以修改字典herehere

但是,由于mu太短,所以您可能更适合使用更高级的工具。我更喜欢Thinking Sphinx,这种事情。

+0

不需要修改字典只是为了处理复数。大量不同语言的标准词干词典。 –