Переменные SphinxQL устарели, альтернативный запрос?
У меня был довольно простой запрос к SphinxQL, но оказалось, что @ переменные устарели (см. Пример ниже).
SELECT *,@weight AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC LIMIT 0,1000 OPTION ranker=bm25, max_matches=3000, field_weights=(title=10, content=5);
Я чувствую, что должен быть способ отсортировать результаты по силе матча. Какая замена?
С другой стороны, что если я захочу включить в него девальвацию, если появятся некоторые другие слова. Например, скажем, я хотел обесценить результаты, в которых было слово "одежда". Может ли это быть выполнено в том же запросе?
Спасибо!
1 ответ
Ну, результаты "по умолчанию" в снижении веса, так что просто...
SELECT * FROM test1 WHERE MATCH('tennis') LIMIT 0,1000 OPTION ...
Но в противном случае его, просто переменные @, заменяются на "функции", главным образом потому, что он более "похож на SQL". Так что @weight, это WEIGHT()
SELECT * FROM test1 WHERE MATCH('tennis') ORDER BY WEIGHT() DESC ...
или же
SELECT *,WEIGHT() AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC ...
Для справки @group вместо GROUPBY()
@count - это COUNT(*)
@distinct - это COUNT(DISTINCT ...)
@geodist это GEODIST(...)
и @expr на самом деле не имеет эквивалента, либо просто используйте выражение напрямую, либо используйте свой собственный псевдоним с именем.
Что касается второго вопроса. Хитро, они на самом деле не "отрицательный" вес. Ther является оператором повышения ключевых слов, но пока не может использовать его для конкретной девальвации.
Единственный способ, которым я могу думать, может быть, это работает, если отрицательное совпадение с определенным полем, может создать сложное выражение ранжирования. Как правило, вместо отрицательного веса потребуется определенное поле для выражения ранжирования, поэтому его можно использовать для выбора этого столбца.
... MATCH('@!(negative) tennis @negative apparel')
... OPTION ranker=expr('SUM(word_count*IF(user_weight=99,-1,1))'), field_weights(negative=99)
Это очень простое демонстрационное выражение для иллюстративных целей, реальное, вероятно, будет гораздо более сложным. Это просто показывает использование 99 в качестве заполнителя для "отрицательного" умножения. Понадобится новый negative
создание поля, которое может быть просто дубликатом другого поля