sphinx и приоритет цены

R
На сайте с 22.12.2009
Offline
94
2629

в данный момент sphinx нормально ищет по полям(назовем их просто)

name - название товара

text - описание товара

предположим в базе есть 2 абсолютно одинаковых товара(название/описание ), но с разной ценой

задача такая:

необходимо выводить товары по релевантности (как и было), но если 2 товара абсолютно одинаковые(но с разной ценой), то сначала первым должен идти товар с меньшей ценой и т.д.

IL
На сайте с 20.04.2007
Offline
435
#1
runseoman:
необходимо выводить товары по релевантности (как и было), но если 2 товара абсолютно одинаковые(но с разной ценой), то сначала первым должен идти товар с меньшей ценой и т.д.

Вместо SPH_SORT_RELEVANCE укажите нужный параметр вторым после "веса".

SPH_SORT_RELEVANCE is equivalent to sorting by "@weight DESC, @id ASC"

http://sphinxsearch.com/docs/manual-0.9.9.html#sorting-modes

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
R
На сайте с 22.12.2009
Offline
94
#2

$sphinx = new SphinxClient();

// Подсоединяемся к Sphinx-серверу

$sphinx->SetServer('192.168.0.1', 9312);

$sphinx->SetFieldWeights(array('price'=>100,'name' => 10, 'opisanie' => 1));

// Совпадение по любому слову

$sphinx->SetMatchMode(SPH_MATCH_ANY);

$sphinx->SetLimits(0,10);

$sphinx->SetSortMode("@weight DESC, @price ASC");

$result = $sphinx->Query($string, 'myindex');

print_r($result); выдает одно и тоже и при "@weight DESC, @price ASC" и при "@weight DESC, @price DESC"

IL
На сайте с 20.04.2007
Offline
435
#3

А @weight точно одинаковый?

Если без него? @price ASC и @price DESC?

R
На сайте с 22.12.2009
Offline
94
#4

$sphinx->SetSortMode("@price DESC");

$sphinx->SetSortMode("@price ASC");

результат один

---------- Добавлено 21.02.2013 в 23:01 ----------

если посмотреть print_r($result);

Array ( [error] => [warning] => [status] => 0 [fields] => Array ( [0] => name [1] => opisanie ) [attrs] => Array ( [price] => 1 ) [matches] => Array ( [37343902] => Array ( [weight] => 7 [attrs] => Array ( [price] => 322 ) ) [37343962] => Array ( [weight] => 7 [attrs] => Array ( [price] => 192 ) ) [37344050] => Array ( [weight] => 7 [attrs] => Array ( [price] => 1009 ) ) [37344628] => Array ( [weight] => 7 [attrs] => Array ( [price] => 1299 ) ) [37344810] => Array ( [weight] => 7 [attrs] => Array ( [price] => 1019 ) ) [37344956] => Array ( [weight] => 7 [attrs] => Array ( [price] => 818 ) ) [37343940] => Array ( [weight] => 3 [attrs] => Array ( [price] => 1248 ) ) [37344229] => Array ( [weight] => 3 [attrs] => Array ( [price] => 548 ) ) [37344627] => Array ( [weight] => 3 [attrs] => Array ( [price] => 1477 ) ) [37344646] => Array ( [weight] => 3 [attrs] => Array ( [price] => 1439 ) ) ) [total] => 648 [total_found] => 648 [time] => 0.000 [words] => Array ( [video] => Array ( [docs] => 66 [hits] => 102 ) [mp3] => Array ( [docs] => 638 [hits] => 860 ) ) )

как видите weight - от 7 до 3

price тоже разный

например записи 37344628 и 37343962 абсолютно одинаковы

но если менять сортировку от большего к меньшему или от меньшего к большему

они будут отображаться одинаково не взирая на указания как сортировать

$sphinx->SetSortMode("@price DESC"); или $sphinx->SetSortMode("@price ASC");

---------- Добавлено 21.02.2013 в 23:32 ----------

наверно можно конечно загнать результ в mysql

и сортиронуть по weight и потом price

но хотелось бы чтоб sphinx сразу выдал то что надо

IL
На сайте с 20.04.2007
Offline
435
#5

$sphinx->SetSortMode(SPH_SORT_EXTENDED ,"@weight DESC ,price ASC");

Первый параметр - константа (без кавычек)

И да.. с собакой @ только встроенные атрибуты.. price - без амперсанда

R
На сайте с 22.12.2009
Offline
94
#6

вот так $sphinx->SetSortMode("@weight DESC ,price ASC");

выдает, но сортировку не делает как надо

так $sphinx->SetSortMode(SPH_SORT_EXTENDED ,"@weight DESC ,price ASC");

вообще пустота тобишь print_r($result); вообще НИЧЕ не выдает

---------- Добавлено 22.02.2013 в 09:22 ----------

щас использую временное решение

$result = $sphinx->Query($string, 'myindex');

$ids = array_keys($result['matches']);

for ($qq=0;$qq<=count($ids)-1;$qq++)

{

$dataprod[]=array('id'=>$ids[$qq],'weight'=>$result['matches'][$ids[$qq]]['weight'],'price'=>$result['matches'][$ids[$qq]]['attrs']['price']);

}

foreach ($dataprod as $key => $row) {

$id[$key] = $row['id'];

$price[$key] = $row['price'];

$weight[$key] = $row['weight'];

}

array_multisort($weight, SORT_DESC,$price, SORT_DESC,$dataprod);

никак не получается заставить sphinx сортировать

IL
На сайте с 20.04.2007
Offline
435
#7
runseoman:
вообще пустота тобишь print_r($result); вообще НИЧЕ не выдает

Смотрите ошибку в логе.. Делайте частями пошагово.. "Заставьте" работать SPH_SORT_EXTENDED сначала с дефолтной сортировкой, без цены...

И да.. версия сфинкса какая? и PHP-клиента?

R
На сайте с 22.12.2009
Offline
94
#8

что-то сделал и заработало

буду копать в чем было дело

---------- Добавлено 22.02.2013 в 12:58 ----------

щас код такой

$sphinx = new SphinxClient();

$sphinx->SetServer('192.168.0.1', 9312);

$sphinx->SetMatchMode(SPH_MATCH_ANY);

$sphinx->SetSortMode (SPH_SORT_EXTENDED, "@weight desc, price desc");

$result = $sphinx->Query($string, 'myindex');

---------- Добавлено 22.02.2013 в 13:13 ----------

вообщем пока не разобрался в чем было дело

если пойму - отпишу

ivan-lev примного благодарен за советы

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий