【发布时间】:2012-10-12 21:29:57
【问题描述】:
我在查询中遇到了复数形式的问题。我需要的是ruby中的一种方法,或者是在我搜索时可以帮助我的sql。例如:
当我搜索“数组”时 我也希望它返回“数组”的结果。
谢谢
【问题讨论】:
-
使用全文搜索系统可能会更好。
标签: sql ruby-on-rails ruby regex postgresql
我在查询中遇到了复数形式的问题。我需要的是ruby中的一种方法,或者是在我搜索时可以帮助我的sql。例如:
当我搜索“数组”时 我也希望它返回“数组”的结果。
谢谢
【问题讨论】:
标签: sql ruby-on-rails ruby regex postgresql
你要找的是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)
虽然您会注意到词干词典并不完美;我希望搜索“goose”以匹配“geese”,但事实并非如此。您可能需要增强字典。 PostgreSQL的字典也可以是a bit over-enthusiastic about stemming at times。
另一种方法是使用更大且更易于定制的工具,例如 Apache Solr。
【讨论】:
LIKE 好得多,而且它已经内置了。试一试,看看它如何适用于您的应用程序。如果它运作良好,那就太好了:你已经完成了,并且没有额外的移动部件。如果没有,请部署 Sphinx 或 Solr——两者都更强大,坦率地说更擅长搜索,但使用单独的搜索服务器会增加操作复杂性。有时 PostgreSQL 是正确的选择,有时则不是。
您可以在使用 Postgres 全文搜索时修改字典,如 here 和 here 所述。
但是,由于 mu 太短,您可能最好使用更高级的工具。对于这种事情,我更喜欢Thinking Sphinx。
【讨论】:
Class.all(:conditions => ["attribute LIKE ?", "array%"])
应该可以,我已经使用 Rails 2 有一段时间了,所以可能有更好的方法,但可以解决问题。
【讨论】: