Мне нужно добавить дополнительную фильтрацию в запросе Spinx по столбцу post_category_name (String value), мой текущий индекс:
source min
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_query = select p.id, p.title, p.description, l.Latitude, l.Longitude FROM post p join location l on l.id = p.location_id
// here I need filter by category name with post_id the same as
// p.id in table post
sql_attr_float = Latitude
sql_attr_float = Longitude
}
У меня 3 таблицы: post, location и post_category. Отношение к моей БД: 1) сообщение с местоположением один к одному, 2) сообщение с post_category - одно для многих.
post_category, эта таблица имеет только два столбца: post_id и post_category_name, и мне нужен поиск по этому post_category_name, когда post_id в этой таблице зачищается на расстояние.
Я фильтрую по местоположению с таким запросом, и он отлично работает:
select *, geodist(48.712002, 2.677411, latitude, longitude) dist from serv1 where match('searchText*') and dist < 20 ;
после моего запроса select, я хочу иметь такие столбцы в результате:
| id | широта | долгота | post_category_name | расстояние
и фильтровать по post_category_name.
поэтому, когда я ищу, мне нужно что-то вроде этого:
select *, geodist(48.712002, 2.677411, latitude, longitude) dist from serv1 where match('searchText*') and dist < 20 and post_category_name in ("All", "Shop");
Плес, помоги мне.
Поскольку у вас есть (потенциально) несколько категорий для каждой должности, нужно выбрать способ индексирования. 1) Мог бы сохранить его как сейчас, и иметь документ sphinx за сообщение, а затем post_category_name будет содержать несколько значений, если post в многоуровневых категориях.
... или 2) вместо этого может иметь один документ для каждой должности и категории. Таким образом, может быть несколько результатов, если документ находится в нескольких категориях.
Вариант 1 проще, но 2 в конечном итоге будет более гибким (так как можно выполнить поиск в сочетании или нет, но вашему запросу sphinx может понадобиться GROUP BY, чтобы получить один результат за сообщение)
Но на данный момент вариант 1...
sql_query = SELECT p.id, p.title, p.description, l.Latitude, l.Longitude,
GROUP_CONCAT(c.category_name) AS post_category_name \
FROM post p \
INNER JOIN location l ON (l.id = p.location_id) \
LEFT JOIN category c ON (c.post_id = p.id) \
GROUP BY p.id \
ORDER BY NULL
sql_field_string = post_category_name
... ставит категорию как BOTH атрибут строки (для извлечения) и поле (для сопоставления)
select id, post_category_name , geodist(48.712002, 2.677411, latitude, longitude) dist
from serv1
where match('searchText* @post_category_name All|Shop') and dist < 20;
Хотя вы могли бы использовать атрибут post_category_name в WHERE, его обычно лучше, если возможно, фильтровать, используя полнотекстовый запрос (поле).