2010-01-21 7 views
2

Je voudrais être en mesure de filtrer mes commandes sur une plage de montants ET un ID utilisateur spécifique Le résultat attendu serait d'obtenir uniquement les commandes où l'utilisateur spécifié a fait une enchère dans une certaine gamme de quantité. Par exemple, il existe un ordre avec l'ID 1. L'utilisateur 5 enchère dessus pour un montant de 200. Maintenant, si je veux filtrer, je mets le filtre user_id à 5 et mets un filtre de plage sur le montant pour 150-250. .Sphinx: Filtrage MVA sur plusieurs champs

Comment configurer le sphinx pour pouvoir filtrer de cette manière?

J'ai les tableaux suivants:

Ordre:

+-------------+-----------------------+ 
| Field  | Type     | 
+-------------+-----------------------+ 
| id   | mediumint(8) unsigned | 
| title  | varchar(100)   | 
| description | text     | 
+-------------+-----------------------+ 

offre:

+--------------+-----------------------+ 
| Field  | Type     | 
+--------------+-----------------------+ 
| id   | mediumint(8) unsigned | 
| order_id  | mediumint(8) unsigned | 
| user_id  | mediumint(8) unsigned | 
| amount  | mediumint(9)   | 
+--------------+-----------------------+ 

J'ai essayé ce qui suit dans la configuration de sphynx. Mais je ne peux pas définir l'user_id comme leader. Le résultat est que je reçois toutes les commandes où il y a des offres dans cette fourchette de prix (de tous les utilisateurs), et je reçois toutes les commandes où l'utilisateur a fait une offre.

sql_attr_multi = uint amount from query; SELECT order_id as id, amount FROM bids 
sql_attr_multi = uint user_id from query; SELECT order_id as id, user_id FROM bids 

Merci

Répondre

2

Il pourrait être préférable d'offres individuelles d'index à utiliser pour cette fonctionnalité.

sql_query = 
    SELECT 
    b.id 
    b.order_id 
    b.user_id 
    b.amount 
    o.title 
    o.description 
    FROM 
    bid b JOIN 
    order o ON b.order_id=o.id; 
sql_attr_uint = order_id 
sql_attr_uint = user_id 
sql_attr_uint = amount 

de filtre basé sur un utilisateur particulier:

SetFilter("user_id", array(5)); 

à filtrer en fonction d'une plage de soumission de 150 à 250:

SetFilterRange("amount", 150, 250); 

à filtrer en fonction de l'ID de commande:

SetFilter("order_id", array(1)); 

ces peuvent être mélangés un d correspondant au besoin pour sélectionner les enchères que vous voulez voir. Maintenant que l'index utilise les identifiants d'offre, Sphinx vous les renvoie en tant que jeu de résultats et vous pouvez les utiliser au besoin dans vos requêtes MySQL suivantes.

+0

Je l'ai eu à travailler de cette façon. Mais a dû créer 2 index. Le premier index est resté comme il était et les index 2ème sur le user_id pour obtenir toutes les commandes liées à un utilisateur spécifié. Merci! –

+0

c'est vraiment la beauté de Sphinx ... vous pouvez indexer vos données de différentes façons pour obtenir un accès rapide et pratique à de nombreuses facettes de celui-ci. –

Questions connexes