Сфинкс: фильтрация MVA по нескольким полям - PullRequest
2 голосов
/ 21 января 2010

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

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

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

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

Заказ:

+-------------+-----------------------+
| 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

Спасибо

1 Ответ

2 голосов
/ 21 января 2010

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

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));

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

...