2016-03-04 121 views
1

我不知道如何一個威力指數與思考獅身人面像的模型虛擬屬性。給定一個Project模型和一些實例方法,該方法返回來自另一個模型的其他信息派生的布爾值,例如,用戶,其屬性派生而不在數據庫中的項目表上。指數的虛擬屬性的思考獅身人面像

例如,假設我們有一個方法is_user_eligible,這樣我們可以查詢Project.first.is_user_eligible,並得到一個真或假的響應。這在ORM中已經有效。

我怎麼能指數隨思考獅身人面像這種虛擬的屬性?我能夠在我的django項目中使用Elasticsearch支持的Haystack索引虛擬屬性。我通過在模型方法上使用@property裝飾器來促進了這一點。我想我應該可以用Rails/ThinkingSphinx來做到這一點,但是在嘗試索引時我會遇到各種奇怪的SQL錯誤。我已經嘗試了各種不同的構造來設置我的索引(例如,具有-vs-索引),並且在編制索引時都會導致某種SQL錯誤。

這可能與思考獅身人面像?如果是這樣,我如何索引虛擬屬性?

回答

3

你已經明確表示,該值不能作爲對projects表中的列,但它是在相關的模型呢?如果是這樣,那麼你可以通過該協會提到它:

has user.is_eligible, :as => :is_user_eligible 

但是,如果它不是一個列,但可以可以在SQL查詢的範圍內確定,那麼你可以使用一個SQL片段作爲屬性定義(我知道我的例子是虛構的,但應該給你一些想法):

has "(users.foo = 'bar' || users.baz = 'qux')", 
    :as => :is_user_eligible, 
    :type => :boolean 

如果你指的是未在索引定義別處使用的關聯,你可以強制引用,或者提供SQL連接語句:

join users 
# or through more than one association: 
join users.addresses 
# or via your own custom join: 
join "INNER JOIN users ON users.project_id = projects.id" 

如果你不能確定所有通過SQL該值,則與思考獅身人面像要做到這一點的唯一方法是使用real-time indices代替 SQL支持指數。這意味着,不是引用索引定義中的關聯和列,而是引用方法。所以,你的屬性將成爲:

has is_user_eligible, :type => :boolean 

類型必須指定 - SQL指標可以猜測屬性因列類型的類型,但實時指數沒有這樣的參考點。

我意識到鏈接到實時指數功能是一個博客帖子我寫了兩年多前。然而,這個功能當然有用 - 我和其他人已經在生產中使用了相當長的一段時間(包括Flying Sphinx)。

has VS indexes的題目是:如果你想使用的值作爲過濾器或排序,那麼它必須是一個屬性,因此,你應該使用has方法。但是,如果您希望搜索查詢匹配的是文本數據,那麼它應該是一個字段,因此使用方法indexes

無論如何,我建議切換到實時索引:它消除了對deltas的需求,並且無需定期運行'ts:index'(或者根本不需要使用ts:generate)即可獲得最新的Sphinx記錄如果您的數據最終處於過期狀態)。但請確保您將全部索引定義切換爲實時,而不是具有一些實時和其他SQL支持的索引定義。

+0

這樣做很有意義,我會考慮切換到實時索引,謝謝! – yekta

+0

將'real_time'索引添加到文檔http://freelancing-gods.com/thinking-sphinx/indexing.html是否有意義?它是TS文檔的第一個谷歌結果。 – yekta

+0

是的,它真的會!我會盡力去解決這個問題。 – pat

相關問題