Spinx поисковый запрос с фильтрацией

0

Мне нужно добавить дополнительную фильтрацию в запросе 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");

Плес, помоги мне.

Теги:
sphinx

1 ответ

0
Лучший ответ

Поскольку у вас есть (потенциально) несколько категорий для каждой должности, нужно выбрать способ индексирования. 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, его обычно лучше, если возможно, фильтровать, используя полнотекстовый запрос (поле).

  • 0
    barryhunter, большое спасибо !!! это работа)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню