J'essaie d'utiliser ThinkingSphinx dans mon projet Rails 5. J'ai lu une instruction à http://freelancing-gods.com/thinking-sphinx/ThinkingSphinx: condition-OR sur les index SQL?
J'ai besoin d'implémenter la logique OR
sur les index SQL.
Voici ma classe:
class Message < ApplicationRecord
belongs_to :sender, class_name: 'User', :inverse_of => :messages
belongs_to :recipient, class_name: 'User', :inverse_of => :messages
end
et son indexeur:
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
donc je dois rechercher uniquement dans les 2 indices à une fois - :sender_email
et :recipient_email
- mais ignorin g indexes text
.
En pseudocode je besoin de quelque chose comme ceci:
Message.search '[email protected]' :conditions => {:sender_email => '[email protected]' OR :receiver_email => '[email protected]'}
Ce qui signifie: trouver tous les messages entre « [email protected] » et « [email protected] » (chacun d'entre eux pourrait être un expéditeur ou un destinataire) - en ignorant les messages contenant le texte avec les mots «[email protected]» ou «[email protected]».
Malheureusement, les docs disent:
The :conditions option must be a hash, with each key a field and each value a string.
En d'autres termes, je besoin d'un ensemble d'indices sous condition (à l'exécution) - mais en même temps plus de 2 indices (non 1 comme documenté).
Je veux dire que c'est une mauvaise idée de ne permettre que des hachages comme condition - et aucune chaîne (comme les requêtes ActiveRecord permettent http://guides.rubyonrails.org/active_record_querying.html#pure-string-conditions). PS Je dirais que la documentation de ThinkingSphinx http://freelancing-gods.com/thinking-sphinx/ est plutôt mauvaise et doit être entièrement réécrite. J'ai tout lu et n'ai rien compris. Il n'a pas d'exemples (exemples complets - seulement partiel - donc totalement flou). Je ne comprends même pas ce que sont les champs et les attributs et comment ils diffèrent. Associations, conditions, etc. - tout n'est pas clair. Très mauvais. La gemme elle-même semble plutôt bien - mais sa documentation est horrible.