Как получить id документов отсортированных в порядке убывания вхождения слов в запрос (одно слово из запроса учитывается только один раз для каждого документа - например, для документа с текстом “шкаф шкаф шкаф шкаф” - считаем только одно совпадение). Т.е. из указанных выше данных получить такой порядок для запроса “шкаф двухдверный черный деревянный”
Как я могу этот запрос отправить через PHP API?
select * from t where match(’“шкаф двухдверный черный деревянный”/1’) option
ranker=expr(‘sum(word_count)’)
Правильно ли я понимаю? для каждого найденного документа вычисляется количество вхождений запрашиваемых при поиске слов в индекс документа - значение word_count. Тогда для чего делать sum? Что с чем суммируется?
Как переделать эту конструкцию, чтобы учитывался также мой рейтиг документов?
Каждому документу присваиваю “рейтинг” от 1 до 3 (записываю в поле myRating, в операторе SELECT конфигурации индекса), где 3 наиболее приоритетные документы.
Нужно что-то типа:
В описании к факторам написано что это field level factor, те он считается для каждого поля и после вам нужно использовать какой-то агрегат sum / min / max - чтобы получить одно число
max_count - соответствует query_word_count но вы можете использовать форму “шкаф двухдверный черный деревянный”/0.5 как описано в документации для того чтобы получить нормализованные значения в диапазоне 0.0 - 1.0
и ваш запрос выглядел бы
SELECT ( weight() + myRating * 0.5 / 3 ) as sort FROM idx where match('“шкаф двухдверный черный деревянный”/0.5') ORDER by sort desc OPTION RANKER=expr('sum(word_count)'
Спасибо. Как теперь правильно оформить этот запрос с помощью API?
Делаю:
$sphinx->SetSelect(‘*,( weight() + myRating * 0.5 / 3 ) as sort’);
$sphinx->SetRankingMode(“SPH_RANK_EXPR”, “sum(word_count)”);
// ORDER by sort desc как оформить?
$result = $sphinx->Query(“"$searchText"/0.5”, ‘idx’);
Я так понимаю, если для запроса “шкаф деревянный” слово “шкаф” будет встречаться в нескольких полях документа, то каждое такое встретившееся слово будет добавлять +1. Можно ли сделать так, чтобы одно и то же слово из запроса, которое встречается сразу в нескольких полях прибавляло бы только единицу?
Не могу понять, как опция RANKER=expr(‘sum(word_count)’) и функция weight() связаны между собою. Простите, но в голове путаница, а документация только еще больше вносит непонятного)
Можно ли сделать так, чтобы одно и то же слово из запроса, которое встречается сразу в нескольких полях прибавляло бы только единицу?
надо пробовать разные запросы с разными факторами - может быть подойдет вот этот фактор doc_word_count ту судя по описанию он на целый документ сразу вычисляется
number of unique keywords matched in the document
или же пробовать разные факторы и выражения с ними или же написать UDF ранкер который будет сам вычислять, что вам надо по хитам или факторам.
про WEIGHT() сказано же, что это функция - вес документа, который можно получить \ использовать в select list