Postgres/Rails在查询中的复数问题

4
我在查询中遇到了复数问题。我需要一种 Ruby 方法或 SQL 语句,可以帮助我进行搜索。例如:
当我搜索“arrays”时, 我希望它也能返回“array”的结果。
谢谢。

2
您最好使用全文搜索系统。 - mu is too short
3个回答

3
你所需要的是词干提取
使用一堆正则表达式无法真正对英语这样的语言进行词干提取,因为有太多的例外。你需要一个大型的词干提取字典。
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的词典有时也会过于热衷于词干处理
另一种选择是使用更大且更易定制的工具,如Apache Solr。

没错!PostgreSQL全文搜索比LIKE好多了,而且已经内置了。尝试一下,看看它对你的应用程序有何作用。如果效果不错,太棒了:你完成了,没有额外的移动部件。如果效果不佳,可以部署Sphinx或Solr——两者都更加强大,搜索效果更好,但使用单独的搜索服务器会增加操作复杂性。有时候,选择PostgreSQL是正确的选择,有时候则不是。 - willglynn

1

当使用Postgres全文搜索时,您可以根据此处此处的说明修改字典。

但是,正如mu is too short所提到的那样,您最好使用更高级的工具。我更喜欢Thinking Sphinx这种工具来完成这种任务。


不需要修改字典来处理复数形式。有许多针对不同语言的标准词干字典。 - Richard Huxton

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

应该可以了,我已经使用Rails 2一段时间了,可能有更好的方法,但这样也能解决问题。


3
如果你搜索“geese”,会发生什么?搜索“the”会找到“thesaurus”吗? - mu is too short
取决于你想如何设置,我猜你可以在搜索查询中使用singularize和pluralize方法并返回两者?你到底想实现什么? - cih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接