2012-10-12 35 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

不需要修改字典只是爲了處理複數。大量不同語言的標準詞幹詞典。 –