Результаты поиска должны отдавать приоритет первому сообщению в теме, если заголовок совпадает с поисковым запросом

Недавно я заметил, что при поиске конкретной темы результаты поиска выдают сообщение из середины темы, а не первое сообщение. Это происходит, когда в сообщении внутри темы содержится тот же поисковый термин, что и в заголовке темы. Вот два недавних примера с сайта http://community.wanikani.com:

Поиск по запросу “Self Study Quiz” или “Self-Study Quiz” выдаёт ссылку https://community.wanikani.com/t/userscript-self-study-quiz/13191/731 вместо первого сообщения.

Поиск по запросу “ご注文はうさぎですか” выдаёт ссылку ご注文はうさぎですか miscellaneous discussion - #93 by seanblue - Book Clubs - WaniKani Community вместо первого сообщения.

Я разместил это в разделе #feature, потому что не на 100% уверен, что поиск когда-либо работал именно так, как я описываю. Однако я ищу второй термин несколько раз в год и довольно уверен, что раньше результаты поиска возвращали первое сообщение в теме. Если это изменение произошло случайно, вы можете считать это #багом.

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

6 лайков

Это результат недавних изменений в поиске, внесённых @tgxworld и @sam. Возможно, они смогут ответить.

4 лайка

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

7 лайков

Я понимаю запрос в основной теме (OT) о том, чтобы поиск ссылался на саму тему (то есть на первый пост), если название темы соответствует критериям поиска. В противном случае следует ссылаться на конкретный пост, где найдено совпадение.

3 лайка

Проблема в том, что в одной теме может быть 15 совпадений, и одно из этих 15 имеет наивысший «рейтинг».

4 лайка

Честно говоря, пока первый пост (по совпадению с заголовком) имеет наивысший приоритет, остальное меня мало волнует, но ваши слова звучат разумно. Когда в теме дюжина постов содержит точную искомую фразу, тот, который сейчас возвращается в результатах поиска, действительно кажется случайным. Всегда возвращать самый ранний совпадающий пост в теме, на мой взгляд, отличное решение.

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

6 лайков

Меня постоянно отмечают люди, которые ссылаются на мой пост из середины темы, хотя хотели поделиться самой темой. Текущий подход, безусловно, вызывает путаницу.

1 лайк

Да, @tgxworld и @sam, это действительно нужно изменить. Мы уже далеко ушли от правила трёх. Совпадение заголовка должно иметь огромный вес сверхновой чёрной дыры в ранжировании.

9 лайков

Я не думаю, что всё может быть так просто, как всегда отдавать приоритет первому посту в теме, потому что изменение одного конкретного сценария поиска повлияет на другой. Рассмотрим следующий сценарий:

  1. Тема X и тема Y содержат посты, которые соответствуют поисковому запросу «discourse».
  2. Пост №1 и пост №100 в теме X соответствуют поисковому запросу «discourse».
  3. Пост №100 имеет более высокий рейтинг, так как его содержание гораздо лучше соответствует запросу «discourse».
  4. Пост №1 темы Y соответствует поисковому запросу «discourse».
  5. Пост №1 темы Y имеет более высокий рейтинг, чем пост №1 темы X, так как его содержание более релевантно запросу «discourse».

При предыдущем подходе мы использовали рейтинг поста №100 темы X для сравнения с постом №1 темы Y. В этом случае пост №1 темы X появляется выше в результатах поиска, чем пост №1 темы Y, хотя пост №1 темы Y явно лучше соответствует поисковому запросу, чем пост №1 темы X. Это эквивалентно ранжированию тем на основе наивысшего рейтинга поста в теме.

Если мы будем просто брать первый пост в теме, который соответствует поисковому запросу, мы исключим посты, которые лучше соответствуют запросу, но имеют больший номер в теме. Это вызовет вопросы о том, почему эти посты не были включены в результаты поиска.

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

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

2 лайка

Однако, я не думаю, что кто-то предлагает именно это. Мы говорим о том, чтобы повышать ранг совпадений по заголовку, что не соответствует описанной вами ситуации. Когда заголовок совпадает с поисковым запросом, это должно конкретно повышать ранг первого сообщения, а не всех сообщений в теме.

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

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

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

5 лайков

Описанная вами ситуация отражает то, как поиск в Discourse работал ранее, и это было некорректным поведением.

Я считаю, что это было сформулировано неверно: по умолчанию поиск осуществляется по комбинации заголовка темы и содержимого поста.

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

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

4 лайка

Вот ещё один пример, демонстрирующий мой случай использования. Я искал «special kanji» на https://community.wanikani.com с целью найти эту тему: Special kanji words derived from other words - Kanji - WaniKani Community. Я хотел посмотреть таблицу данных в первом сообщении, которая является вики-страницей. Как видите, мой поисковый запрос точно совпадает с началом заголовка темы. Однако в первом сообщении на самом деле нет слова «special», поэтому другое сообщение было выдано на первое место просто потому, что слова «special» и «kanji» где-то в нём присутствовали.

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

3 лайка

@sam интересно, что ты думаешь по этому поводу. Поиск работает корректно, потому что в посте «где-то» содержатся поисковые запросы как в заголовке, так и в теле, тогда как в первом посте они есть только в заголовке. Казалось бы, нелогично показывать первый пост, когда другой пост гораздо лучше подходит. Судя по моим наблюдениям, есть несколько вариантов, которые можно рассмотреть:

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

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

  3. Исключить информацию о заголовке темы из PostSearchData для постов, которые не являются первыми. Нам придется немного поэкспериментировать, но я ожидаю, что это сильно сместит результаты поиска в сторону возврата первых постов.

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

4 лайка

Мне это кажется очень неприятным. Это неочевидно, если только пользователь не привык читать (и интерпретировать) данные, появляющиеся при наведении на ссылку.


Возможно, стоит рассмотреть двухэтапный поиск?

  • Поиск заголовков тем, с совпадением только по ТОЧНОЕ_СОВПАДЕНИЕ и СОДЕРЖИТ_ВСЕ
    • Эти результаты размещаются в верхней части выдачи, при этом ТОЧНОЕ_СОВПАДЕНИЕ имеет приоритет
  • Затем заполнить остальные результаты текущим взвешенным поиском, исключив любые посты-заголовки тем, которые были найдены на первом этапе.
3 лайка

Идея заключается в том, чтобы внести изменения в UX, сделав это очевидным.

Идея здравая, но я не думаю, что мы сможем эффективно выполнить запрос к PostgreSQL, так как при использовании операторов like и ilike нет поддержки индексов. Ещё один фактор: нет способа ранжировать точные совпадения или совпадения по содержимому. Именно поэтому мы полагаемся на возможности полнотекстового поиска, предоставляемые PostgreSQL.

1 лайк

Думаю, вам, вероятно, понадобится более очевидный способ различения ссылок на первый пост и на пост, совпавший с запросом. Мне кажется, ваше предложение не будет интуитивно понятным. (Хотя я понимаю, что это был просто пример.)

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

Думаю, это определённо стоит попробовать. Это решит проблему, на которую я жаловался, расставив приоритеты для совпадений по заголовкам. Но это также решит сценарий, который вы упомянули насчёт форумов для программистов @tgxworld, так как, как вы сказали, фрагменты кода не будут в заголовке.

Конечно, если это непрактично, то, видимо, всё по-другому. Возможно, кто-то другой знает способ сделать это достаточно производительным.

Опора на существующие технологии — это хорошо и всё такое, но только когда они действительно решают вашу задачу. Похоже, что полнотекстовый поиск PostgreSQL сам по себе недостаточен, учитывая проблемы, поднятые в этой теме. Похоже, гибридный подход, подобный предложенному @Sailsman63, был бы идеален, если удастся сделать его реализуемым.

Поскольку, похоже, прямо сейчас нет «простого решения», я честно считаю, что это лучший вариант, пока работает над более полным решением. Любые изменения в UX или новые алгоритмы, требующие оптимизации базы данных или других соображений производительности, могут занять много времени для правильной реализации, поэтому я думаю, что возвращение к старому поведению было бы разумным временным решением.

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

Я колеблюсь сделать это, потому что это не приближает нас к лучшему решению. Более того, я убеждён, что старое поведение неверно. Случаи, описанные в этой теме, основаны на единственном примере, где кажется интуитивно понятным, что результат поиска должен вести только к первому сообщению, поскольку пользователь, выполняющий поиск, точно знает, какую тему он хочет найти. Я даже могу утверждать, что пользователи, которые уже знают название темы, которую они ищут, должны использовать расширенный фильтр поиска in:title. В большинстве случаев поиска важен контент сообщения, и частичное совпадение с названием темы не должно означать, что должно показываться первое сообщение темы.

1 лайк

Да, я полагаю, это справедливо.

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

Возможно, было бы уместно сделать галочку in:title всегда видимой. Или, что ещё лучше, добавить выпадающий список слева от поля ввода с вариантами вроде «Все», «Заголовки» и «Сообщения», чтобы пользователь мог указать область поиска. Такой фильтр поиска, думаю, довольно распространён, поэтому он (надеюсь) будет интуитивно понятен пользователям: они смогут использовать его или игнорировать по своему усмотрению. В качестве примера можно привести IMDb, где можно искать по «Все», «Заголовки», «Актёры» и т. д. (Точные варианты я сейчас не помню.) Придётся подумать, как различить «Все» и «Сообщения», поскольку сейчас это, по сути, одно и то же, но, возможно, такой подход стоит рассмотреть.

2 лайка

Вот что мы должны делать — для меня совершенно непонятно, почему у всех постов в теме ассоциирован заголовок темы?

2 лайка

Нужно уточнить это у @sam, потому что наш поисковый индекс всегда строился именно так. Фактически, поисковый индекс для каждого поста включает заголовок, название категории, а также названия тегов, даже если пост не является первым.

1 лайк