2010-01-21 4 views
2

Я хотел был бы иметь возможность отфильтровать мои заказы в диапазоне количества И конкретный user_id Ожидаемый результат - получить только заказы, в которых указанный пользователь сделал ставку в определенном количество область.Sphinx: Фильтрация MVA на нескольких полях

Например, есть заказ с идентификатором 1. Пользователь 5 ставку на него на сумму 200. Теперь, если я хочу фильтровать, я устанавливаю фильтр user_id на 5 и устанавливаю фильтр диапазона на сумму 150-250 ,

Как настроить sphinx для фильтрации таким образом?

У меня есть следующие таблицы:

Order:

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

торгов:

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

Я попытался следующие в конфигурации сфинкса. Но я не могу установить user_id как ведущий. В результате я получаю все заказы, в которых есть ставки в этом количестве (от всех пользователей), и я получаю все заказы, на которых пользователь сделал ставку.

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 

Благодаря

ответ

2

Это могло бы быть лучше индексировать отдельные ставки для использования этой функции.

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 

фильтровать на основе конкретного пользователя:

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

, чтобы фильтр, основанный на диапазоне предложение от 150 до 250:

SetFilterRange("amount", 150, 250); 

фильтровать на основе идентификатора заказа:

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

их можно смешивать d, при необходимости, для выбора ставок, которые вы хотите просмотреть. Теперь, когда индекс использует идентификаторы ставок, Sphinx вернет их вам в качестве набора результатов, и вы сможете использовать их по мере необходимости в своих последующих MySQL-запросах.

+0

Я получил это, чтобы работать таким образом. Но нужно было создать 2 индекса. Первый индекс остался, как это было, и 2-й индекс на user_id, чтобы получить все заказы, связанные с указанным пользователем. Благодаря! –

+0

Это действительно красота Sphinx ... вы можете индексировать свои данные разными способами, чтобы получить быстрый и удобный доступ ко многим различным аспектам. –