2016-03-03 67 views
0

我是Ruby和ThinkingSphinx的新手。 我有以下的獅身人面像查詢 - SELECT * FROM user_coreuser_delta WHERE sphinx_deleted = 0如何從Sphinx查詢中刪除sphinx_deleted?

我不想看到‘sphinx_deleted’= 0我如何刪除這個我已刪除了sql_attr_uint條件」? =從我的sphinx.conf文件sphinx_deleted,但我看到了sphinx_deleted查詢傳遞

這裏是索引文件的定義:。

ThinkingSphinx::Index.define :user, :with => :active_record, :delta => true do 
    indexes [first_name,last_name,display_name], :as=>:name, :sortable=>true 
    indexes first_name,  :sortable => true 
    indexes last_name,  :sortable => true 
    indexes display_name, :sortable => true 
    indexes email,   :sortable => true 
    indexes phone,   :sortable => true 
    indexes title,   :sortable => true 

    has id,   :as => :user_id 
    has roles(:id),   :as => :role_ids 
    has jurisdictions(:id), :as => :jurisdiction_ids 

    set_property :delta => true 
end 

我沒有定義的sphinx_scope或default_sphinx_scope

我們用思維 - 獅身人面像-3.1.0和Ruby-2.1.0

回答

1

sphinx_deleted屬性引發的思考獅身人面像創建,並在下列情況下使用(使用與核心用戶模型的場景,在實例三角洲指數):

  • 當用戶被刪除,sphinx_deleted被設置爲1的核心和增量指標該記錄 - 有沒有點返回獅身人面像的記錄,如果基礎ActiveRecord的對象已不存在。

  • 更新用戶時,將使用最新的字段和屬性詳細信息處理增量索引,並且核心索引的文檔將sphinx_deleted設置爲1,因此只有最新(準確)的信息將匹配。例如如果用戶將其名稱從Fred更改爲Georgina,則搜索「Fred」不會返回Georgina,因爲核心索引文檔(匹配確實與匹配)已被濾除。

這就是屬性存在的原因。你不能告訴思考獅身人面像不要添加它,你也不能刪除那個過濾器,而不是在思考獅身人面像的內部挖空。

如果有特定原因想要刪除屬性和過濾器,請隨時在此處發表評論,或者您可以在the GitHub repo上打開問題,或發佈到TS Google Group

更新

好了,再此,還有它周圍的三種方式。

方案一:

第一種方式是讓查詢獅身人面像自己,用思考獅身人面像連接:

results = ThinkingSphinx::Connection.take do |connection| 
    connection.execute "SELECT * FROM user_core, user_delta" 
end 

請記住,這將返回原斯芬克斯值, ActiveRecord實例。

方案二:

一個更復雜的選擇,不過,是有自己的搜索中間件堆棧。首先,你要創建的ThinkingSphinx::Middlewares::SphinxQL自定義子類,刪除:sphinx_deleted過濾器:

class SphinxQLWithoutFilter < ThinkingSphinx::Middlewares::SphinxQL 
    def call(contexts) 
    contexts.each do |context| 
     Inner.new(context).call 
    end 

    app.call contexts 
    end 

    private 

    class Inner < ThinkingSphinx::Middlewares::SphinxQL::Inner 
    def inclusive_filters 
     super.except :sphinx_deleted 
    end 
    end 
end 

然後,創建一個使用這個新SphinxQL查詢中間件新的中間件棧:

WithoutFilterMiddleware = ::Middleware::Builder.new do 
    use ThinkingSphinx::Middlewares::StaleIdFilter 
    use SphinxQLWithoutFilter 
    use ThinkingSphinx::Middlewares::Geographer 
    use ThinkingSphinx::Middlewares::Inquirer 
    use ThinkingSphinx::Middlewares::ActiveRecordTranslator 
    use ThinkingSphinx::Middlewares::StaleIdChecker 
    use ThinkingSphinx::Middlewares::Glazier 
end 

然後您可以在特定搜索查詢中使用該中間件堆棧:

User.search 'foo', :middleware => WithoutFilterMiddleware 

值得注意的是,該堆棧中存在兩個用於陳舊標識的中間件秒。它們一起工作來捕捉任何沒有匹配的ActiveRecord對象的Sphinx結果,並重新運行Sphinx查詢三次,過濾掉那些不匹配的記錄。它們可能是有用的,但如果你不想使用它們,你可以將它們從你的定製堆棧中移除。但是,如果沒有它們,任何沒有匹配的ActiveRecord對象的Sphinx記錄將被轉換爲nils。

方案三:

這是以前的解決方案的更hackish的版本,但將適用於所有搜索,所以很可能是不值得的:重新打開與添加過濾器的類class_eval並更改方法定義:

ThinkingSphinx::Middlewares::SphinxQL::Inner.class_eval do 
    def inclusive_filters 
    # normally: 
    # (options[:with] || {}).merge({:sphinx_deleted => false}) 
    # but without the sphinx_deleted filter: 
    options[:with] || {} 
    end 
end 

現在,所有的說:我想你實際上並沒有刪除用戶,但不知何故刪除回調被解僱呢?因此,用戶存在,但目前正在被Sphinx濾除?如果是這樣,我強烈建議不要使用ActiveRecord的destroy方法,而是使用自定義方法將用戶標記爲非活動狀態。這避免了回調,從而避免了上述任何「解決方案」的需求。

+0

帕特,感謝您的快速回復。我需要能夠檢索某個條件下的已刪除記錄,並檢索所有記錄(包括標記爲已刪除和未刪除)的其他條件。如何修改查詢,以便我有時可以傳入sphinx_deleted = 1並在其他時間忽略sphinx_deleted條件? – user6015291

+1

增加了更多細節,但只是要清楚:如果你需要這樣做,感覺你的實現中的某些東西是不明智的,我建議找到一種不同的方法來處理這個特性,而不是使用我的任何解決方案建議。 – pat

+0

感謝您的詳細解決方案。我不使用銷燬刪除記錄。如果我們刪除用戶,則在用戶表中設置一個deleted_at列。我不知道爲什麼獅身人面像沒有檢索已設置deleted_at的記錄。 – user6015291