Как сделать чтобы sphinx выдавал сперва точные совпадения а потом остальные?
Сортировка на php вполне справляется, но хочется как то сортировать на уровне бд. Не пойму что и куда копать для того чтобы сфинкс выдавал сперва точные совпадения а потом остальные.
djacode, переиндексация тоже имеет смысл, если вы хотите улучшить качество поиска на уровне самого индекса и использовать более точные алгоритмы ранжирования. Обратите внимание на то, какие методы ранжирования поддерживает Sphinx. Правильность выбора ранкера может значительно повлиять на результаты поиска.
Для каждого потенциального запроса создаются rank ? Был бы признателен, если подскажите где можно почитать про rank и иже сними. Я вот не пойму откуда например у запроса "сто лет" берется rank или custom_rank .
Например у меня выводит так:
1).... сто лет...
2)...сто лет....
3)...сто...
4)...лет...
5)...сто лет...
6)...сто лет...
то есть вперемешку.
ORDER в файле tools/sphinx.php такой : ORDER BY custom_rank DESC, rank DESC, date_change DESC
это для каждого запроса есть вес в таблицах сфинкса? я чего то не догоняю(
index bitrix
{
#main settings
type = rt
path = /var/lib/sphinxsearch/data/bitrix
docinfo = inline
#choose appropriate type of morphology to use
#morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all, stem_enru
morphology = stem_enru, soundex
#these settings are used by bitrix:search.title component
dict = keywords
prefix_fields = title
infix_fields=
min_prefix_len = 2
enable_star = 1
#all fields must be defined exactly as followed
rt_field = title
rt_field = body
rt_attr_uint = module_id
rt_attr_string = module
rt_attr_uint = item_id
rt_attr_string = item
rt_attr_uint = param1_id
rt_attr_string = param1
rt_attr_uint = param2_id
rt_attr_string = param2
rt_attr_timestamp = date_change
rt_attr_timestamp = date_to
rt_attr_timestamp = date_from
rt_attr_uint = custom_rank
rt_attr_multi = tags
rt_attr_multi = right
rt_attr_multi = site
rt_attr_multi = param
#depends on settings of your site
# uncomment for single byte character set
charset_type = sbcs
# uncomment for UTF character set
#charset_type = utf-8
}
djacode, ранжирование происходит динамически на основе выбранного алгоритма ранжирования (ranker) и зависит от многих факторов, таких как количество совпадений, близость слов, их частота и т.д. Каждому документу, подходящему под запрос, присваивается "вес" (в данном случае - rank), который и используется для сортировки результатов.
Когда вы выполняете запрос в Sphinx, механизм ранжирования учитывает несколько факторов:
- Частота совпадений. Чем больше терминов запроса встречается в документе, тем выше его релевантность.
- Близость совпадений. Чем ближе друг к другу находятся термины из запроса, тем выше оценка релевантности. Например, в запросе "сто лет" документы, где эти слова находятся рядом, будут иметь более высокий ранг.
- Позиция терминов. Если термины запроса находятся в начале документа, документ может быть оценен выше.
- Полнотекстовая релевантность. Различные алгоритмы ранжирования используют специфические подходы для вычисления релевантности. Например, в BM25 используется статистический подход, учитывающий, насколько часто слово встречается в документе по сравнению с другими документами.
ranker - это алгоритм, который используется для вычисления значения ранка для каждого документа. Sphinx поддерживает несколько ранкеров, например:
SPH_RANK_PROXIMITY_BM25: Комбинация близости терминов и статистической модели BM25.
SPH_RANK_BM25: Статистическая модель, основанная на частоте терминов в документе и коллекции.
SPH_RANK_NONE: Не использует ранжирование, результаты выводятся без оценки релевантности.
SPH_RANK_MATCHANY: Оценивает совпадение любых терминов в документе.
А custom_rank - это уже ваше пользовательское поле, которые вы создали. Оно может быть настроено в конфигурации индекса или сгенерировано при индексации данных для более детализированной сортировки.
Например, когда у вас есть запрос "сто лет", и вы сортируете по custom_rank DESC, rank DESC, date_change DESC, это значит, что сначала Sphinx отсортирует результаты по пользовательскому весу (custom_rank), затем по значению ранка, которое он вычисляет динамически для каждого документа на основе выбранного алгоритма ранжирования, и уже в последнюю очередь - по дате изменения (date_change).
djacode, смотря на конфиг я вижу вы его особо не трогали. Могу посоветовать использовать морфологию лемматизации, которая может быть точнее для сложных языков, как русский
morphology = lemmatize_ru_all, lemmatize_en_all
В своих запросах можете также использовать метод SPH_RANK_PROXIMITY_BM25, который учитывает как близость слов, так и статистические характеристики запроса.
SELECT *
FROM bitrix
WHERE MATCH('сто лет')
OPTION ranker = SPH_RANK_PROXIMITY_BM25
ORDER BY custom_rank DESC, rank DESC, date_change DESC;