Это сильно оффтоп для исходного обсуждения, но я не знаю, стоит ли быть просто удивлённым или в полном шоке:
(Выделение моё)
Я не собираюсь оспаривать выбор базы данных, так как у меня нет опыта в этой области, но это утверждение подразумевает, что PostgreSQL внутренне не различает эти случаи. Подобное ограничение распространено среди поисковых движков баз данных? Если да, то это во многом объясняет, почему большинство систем поиска по сайтам — полный мусор…
Позвольте мне прояснить это утверждение. Для точных совпадений ранжирование результатов не требуется, так как либо совпадение есть, либо его нет. Что касается совпадений по частичному вхождению, как мы решим, какие результаты должны занимать более высокие позиции?
Это мой поисковый запрос
Поисковый запрос интересен
Поисковый запрос здесь более интересен, так как заголовок длиннее
Все вышеперечисленные заголовки содержат поисковый запрос, поэтому вопрос в том, как ранжировать результаты. В настоящее время мы полагаемся на функцию ранжирования Postgres, которая делает это за нас.
Попытки ранжирования направлены на оценку релевантности документов конкретному запросу, чтобы при наличии множества совпадений наиболее релевантные отображались первыми. PostgreSQL предоставляет две встроенные функции ранжирования, которые учитывают лексическую информацию, близость терминов и структуру документа; то есть они принимают во внимание, как часто термины запроса встречаются в документе, насколько близко они расположены друг к другу и насколько важна часть документа, в которой они находятся. Однако понятие релевантности размыто и сильно зависит от конкретного приложения. Различные приложения могут требовать дополнительной информации для ранжирования, например, дату изменения документа. Встроенные функции ранжирования являются лишь примерами. Вы можете написать свои собственные функции ранжирования и/или комбинировать их результаты с дополнительными факторами, чтобы удовлетворить ваши специфические потребности.
Postgres учитывает множество факторов, но в конечном итоге ранжирование остаётся несколько нечётким и действительно зависит от конкретного сайта, в зависимости от того, как структурировано содержание форума. Наша цель в Discourse — предоставить хорошее решение по умолчанию, которое подойдёт для большинства форумов.
Ах… Похоже, здесь возникло недопонимание с моей стороны. Я подумал, что вы имели в виду, что база данных не может отличить точное совпадение от совпадения по включению.
В контексте приоритизации совпадений в заголовках тем, о котором мы изначально говорили:
Я бы на самом деле назвал все три ваших примера «точными совпадениями» для целей моей задачи.
«Есть термин, который можно найти» было бы совпадением по включению.
Ваши три примера имеют равный рейтинг. Просто перечислите их в порядке обнаружения.
Мой пример имеет более низкий рейтинг, чем они.
Однако все они занимают место перед любыми постами, которые соответствуют или релевантны только благодаря содержимому поста без учета заголовка.
Если вы обеспокоены тем, что верхние результаты поиска будут переполнены совпадениями по «заголовку», используйте поиск по заголовку только тогда, когда поисковый запрос достигнет минимального уровня сложности. Целевое количество — не более 4–5 совпадений по «заголовку» в верхней части результатов поиска. (Хотя я понимаю, что это, вероятно, будет сложно реализовать).