2017-05-30 10 views
0

Rails 5プロジェクトでThinkingSphinxを使用しようとしています。私は指示を読むhttp://freelancing-gods.com/thinking-sphinx/ThinkingSphinx:SQL支援インデックスのOR条件?

私はORのロジックをSQL支援のインデックスに実装する必要があります。ここで

は私のクラスである:

class Message < ApplicationRecord 
    belongs_to :sender, class_name: 'User', :inverse_of => :messages 
    belongs_to :recipient, class_name: 'User', :inverse_of => :messages 
end 

とそのインデクサ:

ThinkingSphinx::Index.define :message, :with => :active_record, :delta => true do 
    indexes text 

    indexes sender.email, :as => :sender_email, :sortable => true 

    indexes recipient.email, :as => :recipient_email, :sortable => true 

    has sender_id, created_at, updated_at 

    has recipient_id 

end 

がschema.rb:

create_table "messages", force: :cascade do |t| 
    t.integer "sender_id" 
    t.integer "recipient_id" 
    t.text  "text" 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    t.boolean "read",   default: false 
    t.boolean "spam",   default: false 
    t.boolean "delta",  default: true, null: false 
    t.index ["recipient_id"], name: "index_messages_on_recipient_id", using: :btree 
    t.index ["sender_id"], name: "index_messages_on_sender_id", using: :btree 
    end 

だから私はで2つのインデックス内のみ検索する必要があります一度 - :sender_email:recipient_email - しかし無視するg indexes text

Message.search '[email protected]' :conditions => {:sender_email => '[email protected]' OR :receiver_email => '[email protected]'} 

意味:擬似コードで

が、私はこのような何か必要な「[email protected]」と「[email protected]」の間のすべてのメッセージを見つけることを(それらのそれぞれは、可能性のいずれか送信者または受信者) - 単語「[email protected]」または「[email protected]」を含むテキストを含むメッセージを無視する。

残念ながら、ドキュメントは言う:つまり

The :conditions option must be a hash, with each key a field and each value a string. 

を、私は(実行時に)条件付きのインデックスセットを必要とする - しかし、同時に2つの指標(文書化されていない1として)を超えます。

つまり、ハッシュのみを条件として許可し、文字列(ActiveRecordクエリはhttp://guides.rubyonrails.org/active_record_querying.html#pure-string-conditionsを許可するなど)を許可しないことをお勧めします。

PS ThinkingSphinxのドキュメントhttp://freelancing-gods.com/thinking-sphinx/は非常に悪いものであり、完全に最初から書き直す必要があります。私はそれをすべて読んで何も理解しなかった。これには例はありません(完全な例 - 部分的なものなので完全に不明です)。私はフィールドと属性が何であるか、そしてそれらがどのように異なっているのかを理解していない。団体、条件などはすべて不明です。ひどい。宝石自体はかなりよく見えますが、そのドキュメントはひどいです。

答えて

0

ドキュメントであなたに適した解決策を見つけられなかったとのことご迷惑をおかけして申し訳ありません。 Sphinxの挑戦的なことは、SphinxQL構文はSQLと非常によく似ていますが、時にはかなり異なっているため、SQLのような動作が期待されることがよくあります。

これは、この宝石を維持することの挑戦の一部です。ActiveRecordの構文をあまりにも模倣することは賢明ではありません。そうしなければ、混乱を招く可能性があります。

ここで注意すべき重要なことは、あなたが後にしている動作を取得するための一致のためのスフィンクスのextended query syntaxを利用することができるということです。

Message.search :conditions => { 
    :sender_email => "([email protected] | [email protected])", 
    :receiver_email => "([email protected] | [email protected])" 
} 

これは、送信者が2つの値のいずれかであるものを返します。 、およびレシーバは2つの値のいずれかです。もちろん、にはには、client1からclient1、またはmanager1からmanager1に送信されるメッセージが含まれていますが、それはまれであり、大きな問題ではないと思います。

注意すべき点は、@.は通常検索可能な単語文字として扱われないため、add them to your charset_tableが必要な場合があります。

また、実際にはデータベース列の値全体に対して完全一致を実行しているため、実際には列の一部のデータベースインデックスが役立ち、代わりにSQLを使用するクエリのように感じられます。スフィンクス(と私はほとんどの/すべての他の全文検索ライブラリ)は、大きなテキストフィールド内の単語とフレーズのマッチングに最適です。

ドキュメンテーションに関しては...私はそれらを有用にしようと多くの努力を払ってきましたが、まだ改善が残っていることが分かりました。私はhow fields and attributes differの輪郭を描いたページを持っています - それが明確でない場合、フィードバックは間違いなく歓迎です。

文書を最新の状態に保つことは、新しいプロジェクトには多くの労力が必要です。また、Thinking Sphinxはこれらのどちらでもなく、数ヶ月で10歳になります。私はそれがどのようにうまくいくのか自慢しています。それでも、Railsの最新バージョンをサポートしています。それはまだ活発に維持管理されています。しかし、それはオープンソースです - それは私の(そして他の人たちの)空き時間に行われました。完璧ではありません。あなたが物事を改善する方法を見つけたら、貢献してください!コードとドキュメントはGitHubにあり、プルリクエストは大歓迎です。