最近我注意到,当我搜索特定主题时,搜索结果会直接跳转到该主题中间的某篇帖子,而不是首帖。这种情况发生在主题内的某篇帖子包含了与主题标题相同的搜索词时。以下是来自 http://community.wanikani.com 的两个近期示例:
搜索“Self Study Quiz”或“Self-Study Quiz”时,我得到的是 https://community.wanikani.com/t/userscript-self-study-quiz/13191/731,而不是首帖。
搜索“ご注文はうさぎですか”时,我得到的是 https://community.wanikani.com/t/ご注文はうさぎですか-miscellaneous-discussion/32323/93,而不是首帖。
我将此问题归类为 #feature ,因为我不完全确定该功能是否曾按我描述的方式运行过。不过,我每年会多次搜索上述第二个术语,而且我相当确定搜索结果过去会返回主题的首帖。如果这是某次更新中无意导致的变更,你们也可以将其视为 #bug。
我知道有一个高级搜索选项可以仅搜索主题标题,但在这种情况下似乎没有必要。由于搜索词不仅匹配主题标题,还匹配主题内的多篇帖子,我认为系统应自动优先匹配标题,并返回首帖。
6 个赞
这是 @tgxworld 和 @sam 近期对搜索功能进行修改的结果。或许他们可以回应一下。
4 个赞
sam
(Sam Saffron)
2021 年1 月 7 日 05:59
3
是的,我们对此有过长时间的讨论。总体而言,我更倾向于让搜索功能非常“简单”,即无论排名如何,始终优先显示主题中的第一个匹配项。这样向用户解释起来要容易得多,因为排名机制往往显得非常随意且充满神秘感。
7 个赞
fhe
(Florian)
2021 年1 月 7 日 08:46
5
我理解在原始帖子(OT)中的请求,即如果主题标题 符合搜索条件,则让搜索结果引用该主题本身(即第一楼)。如果不匹配,则引用实际出现匹配的具体帖子。
3 个赞
sam
(Sam Saffron)
2021 年1 月 7 日 08:48
6
问题在于,一个主题下可能有15个匹配项,其中只有一个匹配项具有最高的“排名”。
4 个赞
坦率地说,只要第一条帖子(通过标题匹配)被置于最高优先级,我对其他方面并不太在意,但你所说的听起来很合理。当一个主题中有十几条帖子都完全匹配你搜索的短语时,当前搜索结果中返回的那一条确实显得很随意。始终返回主题中最早出现的匹配帖子,在我看来是个不错的解决方案。
不过,搜索算法可能至少仍应优先处理完全匹配的情况,以确保只有部分匹配搜索词的较早帖子,不会被排在完全匹配的较晚帖子之前。我不确定这是否相关,因为我对该算法并不熟悉。无论如何,正如我之前所说,我认为这些细节远不如将标题匹配置于最高优先级来得重要。
6 个赞
我总被人误标,他们本想分享整个话题,却只链接了我帖子中的某一段落。目前的做法确实造成了混淆。
1 个赞
是的,@tgxworld 和 @sam ,这确实必须改变。我们早已远远超出了“三条规则”的范畴。标题匹配在排名中应具有巨大的超新星黑洞 般的权重。
9 个赞
tgxworld
(Alan Tan)
2021 年1 月 18 日 02:16
10
我认为情况不能简单地总是优先显示某个主题的第一个帖子,因为改变一个特定的搜索场景会影响另一个场景。考虑以下情况:
主题 X 和主题 Y 都包含匹配搜索词"discourse"的帖子。
主题 X 中的第 1 条帖子和第 100 条帖子都匹配搜索词"discourse"。
第 100 条帖子的排名更高,因为其内容与搜索词"discourse"的匹配度更好。
主题 Y 中的第 1 条帖子匹配搜索词"discourse"。
主题 Y 的第 1 条帖子排名高于主题 X 的第 1 条帖子,因为其内容与搜索词"discourse"的相关性更强。
在之前的方法中,我们使用主题 X 中第 100 条帖子的排名来与主题 Y 中的第 1 条帖子进行对比。在这种情况下,主题 X 的第 1 条帖子在搜索结果中排在主题 Y 的第 1 条帖子之前,尽管主题 Y 的第 1 条帖子显然比主题 X 的第 1 条帖子更符合搜索词。这等同于通过取主题中排名最高的帖子来对主题进行排名。
如果我们仅仅选取主题中第一个匹配搜索词的帖子,就会排除那些匹配度更好但帖子编号较大的内容,这会引发疑问:为什么这些帖子没有被包含在搜索结果中?
我认为我主要反对的是:默认情况下搜索是针对帖子的,因此用户实际搜索的是帖子的正文,而不是标题。标题的作用是帮助我们筛选所有主题,以找到需要搜索的正确帖子。
我们实际上确实赋予了标题匹配更高的权重。唯一的问题是,标题是每个主题中所有帖子的搜索数据的一部分,因此所有帖子实际上都从相同的标题匹配权重中受益。
2 个赞
tgxworld:
这相当于按主题中帖子的最高排名来对主题进行排序。
不过,我认为没人是在提议这样做。我们说的是将标题匹配的结果排名提高,这与您刚才描述的情况并不相同。当标题与搜索词匹配时,应专门提升首帖的排名,而不是提升主题中所有帖子的排名。
我不同意这一评估。用户并不关心专门寻找某个帖子,而是关心找到内容 。当主题命名得当时,标题往往是用户意图的最佳指示,而在大多数情况下,这意味着从首帖开始。
至少在我所使用的社区中,某些子类别下的主题经常被搜索,目的是当其他用户寻求帮助时分享这些主题。搜索结果中出现的是主题中的随机帖子而非首帖,导致分享了错误的帖子,结果用户无法像预期那样快速获得帮助。
无论是为了分享还是个人使用,我也认为您低估了用户反复搜索同一主题的频率。在这些情况下,绝大多数时候,用户要么想要查看首帖,要么希望从上次离开的位置继续。
5 个赞
tgxworld
(Alan Tan)
2021 年1 月 18 日 04:47
12
我描述的情况是 Discourse 搜索功能过去的运作方式,这种行为是不正确的。
我认为这种表述方式有误。默认情况下,搜索是同时针对主题标题和帖子正文的组合进行的。
虽然这可能属实,但并不总是如此,因为这种假设认为搜索词总会与主题标题匹配。在编程论坛上,有时我在搜索代码片段,而这些内容通常不会出现在标题中。
所提出的方案并非不可能实现,尽管我们需要做出一些技术决策并权衡利弊。例如,我们需要从非首帖的 PostSearchData 中移除主题标题。这能确保标题匹配时首帖的排名高于主题内的其他帖子,但这同时也意味着我们仍受制于 PostgreSQL 的排名算法。
4 个赞
tgxworld
(Alan Tan)
2021 年1 月 19 日 01:41
14
@sam 我想知道你对这个问题的看法。搜索之所以排名正确,是因为“帖子中的某处”在标题和正文中都包含了搜索词,而第一个帖子仅在标题中包含搜索词。如果我们想显示第一个帖子,而另一个帖子显然是更好的匹配,这似乎有违直觉。据我所见,我们可以考虑以下几个选项:
恢复到旧的行为。当一个主题中的多个帖子匹配给定的搜索词时,始终选择帖子编号最小的那个。这里的缺点是,最小的帖子编号并不总是第一个帖子,在这种情况下,我们的搜索结果可能会变得很差。此外,还存在一些情况,某个帖子的正文显然是更好的匹配,却仅仅因为主题中另一个帖子编号更小的帖子也匹配了搜索词而被排除在外。
我在想,我们能否从用户体验(UX)的角度解决这个问题。与其只提供一条直接跳转到该帖子的链接,不如让搜索结果的标题始终跳转到该主题的第一个帖子,而搜索摘要则链接到实际在搜索结果中排名的那个帖子。
从非首帖的 PostSearchData 中排除主题标题信息。我们需要对此进行一些实验,但我预计这将严重偏向于返回第一个帖子。
我有点倾向于尝试选项 2,因为它既能保持搜索结果的准确性,又能为清楚自己搜索内容的用户提供一种从搜索结果跳转到第一个帖子的途径。
4 个赞
这让我感觉非常别扭。这一点并不显而易见,除非用户习惯于阅读(并解读)悬停链接时显示的数据。
或许可以考虑采用两阶段搜索?
搜索主题标题,仅匹配 EXACT_MATCH(完全匹配)和 CONTAINS_ALL(包含所有关键词)
这些结果将排在顶部,其中 EXACT_MATCH 具有最高优先级
然后,使用当前的加权搜索填充其余结果,排除 第一阶段已匹配到的任何主题起始帖子。
3 个赞
tgxworld
(Alan Tan)
2021 年1 月 19 日 02:18
16
Sailsman63:
这并不显而易见,
我们的想法是通过改进用户体验,使其变得显而易见。
Sailsman63:
或许可以考虑分两阶段进行搜索?
搜索主题标题,仅匹配 EXACT_MATCH(完全匹配)和 CONTAINS_ALL(包含所有关键词)
这些结果将排在最前面,其中 EXACT_MATCH 具有优先权
然后,使用当前的加权搜索填充其余结果,排除 第一阶段已捕获的任何主题起始帖。
这个想法是合理的,但我不认为我们能高效地执行 PostgreSQL 搜索查询,因为在使用 like 和 ilike 运算符进行匹配时没有索引支持。另一个需要考虑的因素是,无法对完全匹配或包含匹配进行排名。这就是为什么我们依赖 PostgreSQL 提供的全文本搜索功能的原因。
1 个赞
我认为你可能需要一种更明显的方式来区分首帖链接和匹配帖链接。我觉得你提出的方案可能不够直观。(不过我明白这只是一个示例。)
我想到的一个可能性是,使用某种展开/折叠机制来显示某个主题下的所有匹配帖子。这样,你可以像当前视图一样展示所有匹配主题中的最佳匹配帖子,然后在每个匹配主题旁边添加一个箭头或其他标识,点击后可以展开列表,显示该主题下的所有匹配帖子。不过,这可能有些过度设计,我也不确定。
Sailsman63:
或许可以考虑分两阶段进行搜索?
首先搜索主题标题,仅匹配 EXACT_MATCH(精确匹配)和 CONTAINS_ALL(包含所有关键词)
这些结果将排在最前面,其中 EXACT_MATCH 优先
然后,使用当前的加权搜索填充其余结果,排除 第一阶段已捕获的主题起始帖。
我认为这绝对值得尝试。通过优先处理标题匹配,这将解决我一直抱怨的问题。同时,它也能解决你提到的编程论坛场景 @tgxworld ,因为正如你所说,代码片段通常不会出现在标题中。
当然,如果这在实际操作中不可行,那情况就另当别论了。也许其他人知道如何让它在性能上足够高效。
依赖现有技术固然很好,但前提是该技术能真正解决你的使用场景。听起来,鉴于本主题中提出的问题,PostgreSQL 的全文搜索单独使用并不足够。如果可行的话,像 @Sailsman63 提出的混合方法似乎是理想的选择。
tgxworld:
恢复到旧的行为。
既然目前似乎没有“简单的答案”,我真心认为在更完善的解决方案开发出来之前,这是最佳选择。任何涉及数据库优化或其他性能考量的用户体验变更或新算法,都可能需要很长时间才能完善,因此我认为暂时恢复到旧行为是一个合理的权宜之计。
tgxworld
(Alan Tan)
2021 年1 月 19 日 02:39
18
不幸的是,事情并不像“我们只需切换到更适合我们的方案”那样简单。在做出我们自己的决定之前,我们需要从业务和技术两个角度权衡利弊。
seanblue:
所以我认为,暂时恢复旧行为是合理的权宜之计。
我对此持保留态度,因为这并不能推动我们走向更好的解决方案。事实上,我强烈认为旧的行为是不正确的。本主题中描述的案例仅基于一种情况,即当用户确切知道他们想搜索的话题时,搜索结果链接到首帖似乎很直观。我甚至要主张,那些已经知道自己要搜索的话题标题的用户,应该使用 in:title 高级搜索过滤器。在大多数搜索场景中,帖子内容至关重要,仅凭话题标题的部分匹配就显示该话题的首帖是不合适的。
1 个赞
tgxworld:
本主题中描述的案例均基于单一案例。
是的,我想这很合理。
如果高级搜索更简单,这或许就足够了。就我个人而言,我觉得它非常难用,因为选项实在太多,导致很难找到我需要的选项。也许只是我个人的问题
也许将 in:title 复选框设为始终可见是合适的。或者更好的是,在输入框左侧添加一个下拉菜单,提供“全部”、“标题”和“帖子”等选项,让用户指定搜索范围。我认为这种搜索过滤器相当常见,因此用户应该会(希望如此)直观地选择使用或忽略它。一个可比较的例子是 IMDb,它允许你搜索“全部”、“标题”、“演员”等(我一时想不起确切的选项)。你需要想办法区分“全部”和“帖子”,因为它们目前本质上是一样的,但也许这种方法值得考虑。
2 个赞
这正是我们应该做的——所有主题内的帖子都关联主题标题,这对我来说完全说不通。
2 个赞
tgxworld
(Alan Tan)
2021 年1 月 19 日 06:02
21
需要与 @sam 确认这一点,因为我们的搜索索引一直是这样构建的。实际上,每篇帖子的搜索索引都包含标题、分类名称以及标签名称,即使该帖子不是首帖。
1 个赞