2015-06-18 78 views

回答

2

對此的'標準'獅身人面像解決方案將使用範圍查詢。

http://sphinxsearch.com/docs/current.html#ex-ranged-queries

...分裂查詢到大量的小零件,所以數據庫服務器具有能夠運行查詢(而不是一個巨大的查詢)

但我有更好的機會不知道如何在思維獅身人面像中實現這一點。在文檔中看不到任何內容。可以幫助你編輯sphinx.conf,但也不知道TS如何處理你手動編輯配置文件。

+0

謝謝,這聽起來像是一個很好的開始。 – Jonathan

+0

似乎加入的字段會更好地解決索引性能問題:http://sphinxsearch.com/docs/current.html#conf-sql-joined-field。任何想法如何在TS中實現? – Jonathan

+0

仔細看看現在已經有查詢的要點,你是否編輯了要點?如果沒有抱歉沒有注意到。加入的字段也很有用,抱歉不知道TS是否可以啓用它們。 – barryhunter

0

這是最好的解決方案(從linked question)。基本上,您可以刪除一條主要查詢sql_query,並在sphinx.conf文件中將其單獨定義爲sql_joined_field

將所有相關的sql條件添加到每個sql_joined_field(例如通過在模塊上對模塊進行分片索引)很重要。這裏的新定義:

ThinkingSphinx::Index.define(
    :incident, 
    with: :active_record, 
    delta?: false, 
    delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta) 
) do 
    indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query 
    ... 
    has 
    ... 
end 

ThinkingSphinx::Index.define(
    :incident, 
    with: :active_record, 
    delta?: true, 
    delta_processor: ThinkingSphinx::Deltas.processor_for(ThinkingSphinx::Deltas::ResqueDelta) 
) do 
    indexes "SELECT incidents.id * 51 + 7 AS id, sites.name AS site FROM incidents LEFT OUTER JOIN sites ON sites.id = site_id WHERE incidents.deleted = 0 AND incidents.delta = 1 AND EXISTS (SELECT id FROM accounts WHERE accounts.status = 'enabled' AND incidents.account_id = id) ORDER BY id", as: :site, source: :query 
    ... 
    has 
    ... 
end 

,場site定義爲一個單獨的查詢是在該行的末尾選項source: :query神奇。

注意,核心索引定義具有參數delta?: false,而增量索引定義具有參數delta?: true。這樣我就可以在增量索引中使用WHERE incidents.delta = 1條件並過濾掉不相關的記錄。

我發現分片並沒有更好的表現,所以我恢復了一個統一的索引。

查看整個索引定義在這裏:https://gist.github.com/jonsgold/05e2aea640320ee9d8b2

重要的是要記住!

Sphinx文檔ID偏移量必須手動處理。也就是說,無論何時添加或刪除另一個模型的索引,我的計算文檔ID都會改變。這必須更新。因此,在我的例子中,如果我爲一個不同的模型(而不是:incident)添加了一個索引,我將不得不運行rake ts:configure來找出我的新偏移量並相應地更改incidents.id * 51 + 7

相關問題