Уточнения поиска тестируются на Meta

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

Эти изменения уже развернуты на всех сайтах как часть версии Discourse 3.1.0.beta3. После обновления ваш сайт автоматически начнет переиндексацию всего контента для поиска.

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

Приоритет точного совпадения термина в заголовке над частичным совпадением

Discourse использует алгоритм stem + префиксное совпадение при поиске. Это иногда приводит к очень неожиданным результатам.

Например: слово redis сводится к redi, поэтому поиск по redis может находить все слова, начинающиеся с redi, такие как redirect и другие.

Добавлен новый скрытый параметр сайта: prioritize_exact_search_title_match, который теперь включен по умолчанию.

До:

После:

Это означает, что если вы помните заголовок и вводите его, вероятность найти именно этот заголовок значительно возрастает.

Снижение максимального дублирования в индексе

Наш алгоритм ранжирования ставит посты с несколькими вхождениями термина выше, чем посты, содержащие термин только один раз. Это означает, что можно «обмануть» поиск, просто многократно повторяя одно и то же слово. Чем чаще вы вводите слово, тем выше оно поднимается в результатах поиска.

Добавлен новый скрытый параметр сайта SiteSetting.max_duplicate_search_index_terms, значение по умолчанию — 6.

После применения этого изменения, если вы введете слово sam 6 раз или 60 раз в посте, его ранг останется прежним. Это устанавливает предел для бонуса, который можно получить за повторения.

Это изменение также положительно сказывается на производительности, так как индекс поиска становится немного меньше.

Различные исправления ошибок

Часть работы была посвящена анализу патологических случаев поиска.

  • Ранее мы снижали приоритет закрытых тем, но забыли про архивированные. Это теперь исправлено.

  • Ранее мы слишком сильно полагались на префиксные совпадения для поисков по «домену». Это означало, что слово happy не находило https://happy.com, так как happy сводится к happi, и префиксное совпадение не срабатывало. Это было исправлено.

Планы на будущее

  • Мы планируем экспериментировать с «нечетким» поиском для автодополнения упоминаний (например, позволять пропускать одну букву).

  • Мы планируем изучить возможность снижения приоритета дублирующихся терминов в заголовках. В настоящее время закрытая тема hello goodbye hello ранжируется выше, чем открытая тема hello world.

  • PageRank… в настоящее время мы не учитываем количество входящих внутренних ссылок при ранжировании результатов. Это означает, что иногда темы с огромным количеством ссылок могут ранжироваться ниже редких тем, на которые никто не ссылается. Было бы неплохо учесть это в нашем алгоритме ранжирования.

  • У нас есть открытая инициатива по интеграции с ИИ, и мы можем почерпнуть вдохновение из инструментов, подобных GPT.

Чем вы можете помочь?

Заметили ли вы плохие результаты поиска на meta? Если да, пожалуйста, укажите термин, по которому вы искали, и объясните, почему результаты оказались неудовлетворительными.

Как вам кажутся эти изменения (нейтрально/лучше/хуже)?

47 лайков

На всякий случай… Если я обновлю/улучшу свою настройку, найду ли я эти два параметра? Я знаю, как найти скрытый — это не проблема, но являются ли эти параметры пока только для Meta? Для меня проще протестировать это в моих кругах, чем здесь :wink:

7 лайков

Да, но также необходимо выполнить rake search:reindex

7 лайков

Думали ли вы об улучшении поиска с помощью Meilisearch? Это требует очень мало ресурсов и может быть включено в сборку Docker.

5 лайков

7 сообщений были перенесены в новую тему: Приоритет закрытых или решённых тем в поиске

Мы уже начали эксперименты в этой области:

Первые эксперименты ограничены поиском по пользователям и группам, но, если всё пойдёт хорошо, функционал будет расширен.

8 лайков

Мы рассматривали различные интеграции, включая Sphinx, Melli, Elastic, Solr/Lucene, но они сопряжены с затратами. Развёртывание ещё одного процесса для индексации, риск устаревания индексов, сложность и так далее — всё это не бесплатно.

Я хотел бы сначала оценить, насколько эффективно работает PostgreSQL, прежде чем рассматривать другие варианты, и оставить их на крайний случай.

Очень интересная проблема, да, они (и всегда были) имеют более низкий приоритет. Я думаю, как минимум мы можем добавить настройку сайта для плагина discourse-solved, чтобы администраторы могли решать, как поступать в таких случаях (приоритизация, деприоритизация, нейтрально и т. д.).

16 лайков

К сожалению, PostgreSQL не адаптирован для использования в качестве поискового движка. В то же время Meilisearch обладает фантастически низким потреблением памяти и безграничными возможностями поиска. Нагрузка на сервер по сравнению с Ruby будет просто незаметна.

3 лайка

Это непростая задача. Наш поиск охватывает огромное количество измерений, содержит множество параметров и напрямую обращается к таблицам PostgreSQL.

При использовании внешнего поискового провайдера необходимо беспокоиться о «синхронизации»:

  • Тема закрыта на Discourse → уведомление движка
  • Сообщение удалено → уведомление движка
  • Поставлена оценка → уведомление движка
  • Тема разделена или объединена → уведомление движка

Список можно продолжать, включая создание нескольких индексов (пользователи/сообщения/темы/категории).

Тем не менее, при правильных инвестициях это не обязательно непреодолимая задача, однако это огромная работа, и пока нет никаких доказательств концепции, показывающих, насколько лучше это будет. Несомненно, что у Meilisearch есть ранжировщик опечаток и множество других функций — здесь нет спора. Но интеграция с ним отнюдь не бесплатна.

Как грубая оценка, я думаю, что потребуется около трёх месяцев работы для создания тесной и надёжной интеграции с Meilisearch. Возможно, даже шесть месяцев, если мы захотим спроектировать Discourse так, чтобы поисковый движок был «подключаемым».

Обратите внимание, что у нас есть поддержка интеграции с Algolia: https://discourse.algolia.com/. Она не совсем надёжна, и вы можете видеть, что весь расширенный поиск опущен в этой реализации.

8 лайков

Я готов поспорить, что с таким большим сообществом разработчиков Discourse это может занять гораздо меньше времени — не более трех месяцев.

2 лайка

Недавно я спросил, что думают мои самые активные пользователи (strike>думают :man_facepalming:) о поиске — я даже не ожидал, что он получит такое усиление.

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

Одна часть Discourse работает как система комментариев для WordPress. Нет, комментариев стало не больше (ничто не переоценено так сильно, как комментарии к блогам), но это показало существование (так ли это пишется?) форума. Сейчас у меня есть несколько пользователей, которые используют Discourse как поисковую систему. Они не комментируют, но ищут то, что им нужно, в темах WordPress через Discourse, а затем возвращаются на блог. Конечно, система тегов тоже очень помогает. А в WordPress не хватает ни эффективного поиска, ни работающей системы тегов.

Не знаю, стоит ли мне публиковать это в канале #praise, но я просто хотел сказать, что я очень доволен тем, как работает этот новый и улучшенный поиск.

11 лайков

Вау, спасибо, это действительно заставляет меня чувствовать себя отлично! У нас уже есть запрос на слияние (PR), и мы очень скоро начнём внедрять изменения по всему миру.

11 лайков

Извините, если я туплю — должно ли это работать на хостинговых сайтах (с последним деплоем)? В объявлении о релизе есть ссылка сюда, но здесь говорится о скрытом параметре — включен ли этот скрытый параметр?

6 лайков

Вам не нужно ничего делать:

Я обновлю исходный пост примечанием.

9 лайков

Спасибо за отличное обновление. Для нас возможность определять синонимы поиска стала бы огромным улучшением :pray: Спасибо.

7 лайков

9 сообщений были перемещены в новую тему: Могу ли я исключить имена пользователей из поиска

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

Пример результата при поиске по таким терминам, как «автоматически закрыто»:

4 лайка

Я не могу воспроизвести это здесь.

3 лайка

Я могу воспроизвести это: если сортировать их по последнему сообщению вместо релевантности, в результатах будет много системных сообщений.

4 лайка

А, да, я понял. Это не всё, но вполне разумно. Похоже, эти сообщения следует исключить из поиска.

3 лайка