2013-04-15 2 views
2

I, есть таблица:Sphinx пользовательских сортировка (FIELD)

id | geo_id | values .... 
1  1  wvrevev 
2  2  wvrevev 
3  3  wvrevev 
3  4  wvrevev 
7  5  wvrevev 
8  6  wvrevev 
9  8  wvrevev 

В двух областях сфинкс индексы: идентификатор и geo_id

мне нужно какое-то, что бы в верхней части моего указанного записей. В SQL получает такой запрос:

SELECT * FROM table ORDER BY FIELD(geo_id, "2", "3", "6") DESC 

Как указать сортировку в Sphinx? Эта запись:

$cl->SetSortMode(SPH_SORT_EXTENDED, "FIELD(geo_id, "2", "3", "6") DESC"); 

Выдает ошибку:

enter code hereindex sphinxoffers: sort-by attribute 'field' not found 

Как выйти из ситуации?

ответ

2
  1. Sphinx оленья кожа имеет функции FIELD()
  2. Вы не можете указать функции в режиме SORT_EXTENDED. есть Сортировка Expression, но не поможет из-за 1.

Если вы всегда использовать этот список, можно просто создать его в качестве атрибута во время индексации ...

sql_query = SELECT id, geo_id, FIELD(geo_id, "2", "3", "6") AS sorter, .... 

затем в sphinxAPI коде. ..

$cl->SetSortMode(SPH_SORT_EXTENDED, "sorter DESC"); 

[Редактировать] или (добавить информацию из комментариев) ...

Can build the same logic as FIELD out of nested IF() functions. Can probaly use EXPRESSION sorting, or just create a virtual attribute with SetSelect, and sort by that (using EXTENDED)


[Edit2], чтобы использовать этот новый атрибут, в sphinxQL, его просто еще один атрибут сортировки, используемый в ORDER BY (sphinxQL действует JUST SPH_SORT_EXTENDED сортировка) ...

SELECT * FROM index WHERE MATCH(...) ORDER BY sorter DESC, WEIGHT() DESC 

рода вещи.

+0

И если у меня этот атрибут динамический, что-то делать с помощью SetSelect, это невозможно? –

+0

Его возможно, но поскольку нет функции FIELD(), необходимо построить логику из функций IF(). – barryhunter

+0

Спасибо! Это сработало. Извините, что я еще не могу поставить рейтинг! –

Смежные вопросы