2013-05-09 27 views
5

我跟隨Ryan Bates的Railscast與Postgres進行全文搜索,但是,他使用的是postgres 9.1,而我使用的是9.2。他構建了以下查詢來執行搜索。它對我有用,如果我的查詢是一個單詞,如「超人」,但如果它是兩個單詞,如dc comicssuper man,我得到這個錯誤,這只是新的postgres我無法弄清楚如何修理。你能幫忙嗎?從Article.rb如果使用空間postgres搜索查詢錯誤

def self.text_search(query) 
    if query.present? 
     rank = <<-RANK 
     ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)})) + 
     ts_rank(to_tsvector(content), plainto_tsquery(#{sanitize(query)})) 
    RANK 

    where("to_tsvector('english', name) @@ :q or to_tsvector('english', content) @@ :q", q: query).order("#{rank} desc") 

    else 
     scoped 
    end 
    end 

回答

12

@@

PG::Error: ERROR: syntax error in tsquery: "super man" 
LINE 1: ...articles" WHERE (to_tsvector('english', name) @@ 'super man... 
                  ^
: SELECT "articles".* FROM "articles" WHERE (to_tsvector('english', name) @@ 'super man' or to_tsvector('english', content) @@ 'super man') ORDER BY  ts_rank(to_tsvector(name), plainto_tsquery('super man')) + 
     ts_rank(to_tsvector(content), plainto_tsquery('super man')) 
desc LIMIT 3 OFFSET 0 

查詢用於一個tsvectortsquery比較。您正試圖將tsvector與某些不是有效的tsquery進行比較。

'superman'text的類型,應該真的被打包在to_tsquery()的調用中。然而,看起來postgres試圖幫助你並將它強制爲你的tsquery,而to_tsquery('超人')是一個有效的查詢。

'super man'text的類型,應該真的被打包在to_tsquery()的調用中。 Postgres有失敗將它強制爲你的tsquery,因爲to_tsquery('超級人')是而不是有效的查詢。有效的tsquery必須具有像&|這樣的布爾運算符來告訴查詢如何處理這些單詞。 '超級&男'可能會工作。

爲了節省您不必爲簡單的AND樣式查詢情況編寫查詢,plainto_tsquery使這一點更容易。在你的情況包裹參數在撥打plainto_tsquery

plainto_tsquery(:q) 
+0

感謝您的幫助。然而,我把這個':q'包裝了兩遍,但是,儘管它現在在兩個單詞搜索(如'has been')中沒有被破壞,但是它不會返回任何結果,即使''has''存在於我的分貝的內容。這是你期望的嗎?無論如何,使它檢索多詞搜索查詢結果? (where)(「to_tsvector('english',name)@@ plainto_tsquery(:q)或to_tsvector('english',content)@@ plainto_tsquery(:q)」,q:query).order(「#{rank} desc 「)' – BrainLikeADullPencil 2013-05-09 16:13:11

+1

請閱讀[停用詞](http://www.postgresql.org/docs/9.2/static/textsearch-dictionaries.html)。在英語詞典中,「擁有」和「被」一詞在英語詞典中被認爲太常見了,以此來打擾索引它們。 – 2013-05-09 16:14:36

+0

好的,我明白了。它正在返回不太常見的單詞的結果。謝謝。 – BrainLikeADullPencil 2013-05-09 16:16:57