【问题标题】:Postgres/Rails Plural Issue in QueriesPostgres/Rails 查询中的复数问题
【发布时间】:2012-10-12 21:29:57
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 使用全文搜索系统可能会更好。

标签: sql ruby-on-rails ruby regex postgresql


【解决方案1】:

你要找的是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。

【讨论】:

  • 没错! PostgreSQL 全文搜索比LIKE 好得多,而且它已经内置了。试一试,看看它如何适用于您的应用程序。如果它运作良好,那就太好了:你已经完成了,并且没有额外的移动部件。如果没有,请部署 Sphinx 或 Solr——两者都更强大,坦率地说更擅长搜索,但使用单独的搜索服务器会增加操作复杂性。有时 PostgreSQL 是正确的选择,有时则不是。
【解决方案2】:

您可以在使用 Postgres 全文搜索时修改字典,如 herehere 所述。

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

【讨论】:

  • 不需要为了处理复数而修改字典。大量适用于不同语言的标准词干词典。
【解决方案3】:
Class.all(:conditions => ["attribute LIKE ?", "array%"]) 

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

【讨论】:

  • 但是如果你搜索“geese”会发生什么?搜索“the”是否应该找到“thesaurus”?
  • 取决于你想如何设置我猜,你可以在你的搜索查询中使用单数化和复数化方法并返回两者?你到底想达到什么目标?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2021-03-15
  • 2018-01-12
  • 1970-01-01
  • 2016-06-05
  • 2011-08-24
  • 2015-07-04
相关资源
最近更新 更多