[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SphinxQL custom ranker
Invis1ble
Есть SphinxQL-запрос вида:
SELECT *, WEIGHT() AS `weight`
FROM `index`
WHERE MATCH('*foo*')
LIMIT 15
OPTION
ranker = EXPR('SUM(min_hit_pos)')

задача вроде бы простая, ранжировать записи, в которых поле начинается с foo выше, чем те, в которых foo в середине строки. Наглядно, нужный порядок:

1. foo
2. foobar
3. barfoo

Однако min_hit_pos не подходит по причине того, что он считает не символы, а слова, т.е. для всех 3-х записей выше min_hit_pos == 1.
Может кто-то из вас решал/знает как решить такую задачу малой кровью? Пока что делаю 2 отдельных запроса, что не есть гуд конечно.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

NitroGenerate
Разве в Сфинксе запрещены условия if ?
    ranker = EXPR(  IF(...)  )
Invis1ble
NitroGenerate
вроде нет, а как ты напишешь условие? Синтаксис в SphinxQL более "строгий", чем в SQL и много чего не поддерживается.
Вообще, мне на форуме sphinx'а уже подсказали, как решить задачу, просто не успел отписаться. Варианта 2:
1) добавить в секцию индекса в конфиге expand_keywords = 1 и убрать "*" из запроса
2) делать запрос вида 'foo|foo*|*foo*' + ranker=wordcount (это вроде как эмуляция expand_keywords)
1-й вариант у меня не сработал, а вот второй работает, однако на большом индексе при высокочастотном запросе сфинкс очень долго тупит (минутами). Возможно из-за бета-версии (2.1.1-beta). Или я неправильно "готовлю" конфиг. При двух отдельных запросах таких тормозов не наблюдается, поиск выполняется в течение миллисекунд.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.