2015-01-08 64 views
2

我試圖在我的Rails應用程序中實現pg_search,並想知道是否有方法獲得與搜索查詢匹配的列?索引表內容由所有可搜索的列字段組成。如何獲得與搜索查詢匹配的列?

例如爲:

+-----------+----------+ 
| Firstname | Lastname | 
+-----------+----------+ 
| John  | Doe  | 
| Jane  | Doe  | 
+-----------+----------+ 

將導致:

+----------+ 
| Content | 
+----------+ 
| John Doe | 
| Jane Doe | 
+----------+ 

現在我不知道如果我的搜索查詢的名字或姓氏相匹配。是否有任何選項可以告訴pg_search將列標題添加到內容列?例如:

+------------------------------------------+ 
|     Content     | 
+------------------------------------------+ 
| {"firstname": "John", "Lastname": "Doe"} | 
| {"firstname": "Jane", "Lastname": "Doe"} | 
+------------------------------------------+ 

或者是否有任何可以滿足我需求的搜索選擇? pg_search工作得很好,特別是因爲我的多租戶/ postgres架構體系結構。

回答

0

巢溶液可能是在運行中生成用於匹配的行中的每一列tsvectors +查詢..

實施例:

select *, 
(to_tsvector(p.first_name)@@ to_tsquery('joe:*')) found_in_first_name, 
(to_tsvector(p.last_name)@@ to_tsquery('joe:*')) found_in_last_name 
from people p 
where p.fts @@ to_tsquery('joe:*'); 

此示例可能是最好的解決方案,這取決於有多少你希望在每一個結果返回的數據集

另一種方法是破解「砝碼」讓你在想什麼:

UPDATE people SET fts = 
    setweight(to_tsvector(coalesce(firstname,'')), 'A') || 
    setweight(to_tsvector(coalesce(lastname,'')), 'B'); 

因此,我們剛剛做的是在tsvector中爲firstname列賦予「A」的「權重」,「姓」列和「B」的「權重」。請記住,「A」,「B」,「C」和「D」是唯一有效的權重,因此如果您需要使用多於4列的數據,則無法工作。如果需要的話

你的查詢可以查詢特定權重,權重都在的tsvector的文本表示可見,但它們在搜索時,無法使用(IE,返回其重量被發現在搜索字詞)

+0

謝謝!但我不明白在哪裏放置'tsvector'代碼 - 好吧,我不明白代碼本身,我應該看看文檔 - 但:這甚至可以用於多種搜索?如果有40個結果,那麼即使模型相同,是否也必須爲每一行執行select查詢?它不是一個性能殺手?由於我使用了4列以上,所以備選方案2不適用於我。我認爲最好的選擇是將JSON存儲在內容表中(因爲Postgres 9.4可以使用JSONB來完成)。 – Slevin

+0

你是什麼意思「多重搜索」?我的第一個例子使用多個術語,如果這就是你問的問題。至於你的模型,這個代碼應該包含在你的模型中,當搜索運行時,這是對已經運行的基本選擇語句的補充,它是不是一個單獨的選擇語句。 –

相關問題