数据库全文搜索功能/限制?

继续讨论 当标题匹配搜索词时,搜索结果应优先显示话题的首帖

这完全偏离了原始讨论的主题,但我不确定自己是仅仅感到惊讶,还是彻底震惊

(强调部分为我所加)

我无意质疑数据库的选择,因为我在这一领域毫无经验,但这句话暗示 Postgres 在内部并不区分这些情况。这种限制在数据库文本搜索引擎中常见吗?如果是这样,那就能很好地解释为什么大多数网站搜索功能都糟糕透顶了……

让我澄清一下这个说法。对于精确匹配,无需对结果进行排序,因为要么匹配,要么不匹配。对于部分匹配,我们该如何决定哪些结果应该排在前面?

  1. 这是我的搜索词
  2. 搜索词很有趣
  3. 由于标题更长,这里的搜索词更有趣

以上所有标题都包含搜索词,因此问题在于如何对结果进行排序?目前我们依赖 PostgreSQL 的排序函数来为我们确定这一点。

排序尝试 旨在衡量文档与特定查询的相关性,以便在存在大量匹配项时,将最相关的结果优先显示。PostgreSQL 提供了两个预定义的排序函数,它们考虑了词汇、邻近性和结构信息;也就是说,它们会考虑查询词在文档中出现的频率、这些词在文档中的接近程度,以及它们所在的文档部分的重要性。然而,“相关性”的概念较为模糊,且非常依赖于具体应用场景。不同的应用可能需要额外的信息进行排序,例如文档修改时间。内置的排序函数仅作为示例。您可以编写自己的排序函数,和/或将它们的结果与其他因素结合,以满足您的特定需求。

PostgreSQL 会考虑许多因素,但最终排序仍然有些模糊,并且很大程度上取决于各个网站的具体情况,尤其是论坛内容的结构方式。我们在此(Discourse)的目标是提供一个良好的默认方案,使其适用于大多数论坛。

5 个赞

啊……看来可能是我这边有些误解。我以为您的意思是数据库无法区分“完全匹配”和“包含匹配”。

在我们最初讨论的关于在主题标题中优先排序匹配的语境下:

  • 就我的意图而言,我会将您的三个示例都称为“完全匹配”。
  • “这里有一个您可以搜索术语"则属于“包含匹配”。

  • 您的三个示例排名相同,只需按找到的顺序列出即可。
  • 我的示例排名低于它们。
  • 不过,它们都排在那些仅因帖子内容(而非标题)而匹配/相关的帖子之前。

如果您担心顶部搜索结果会被“标题”匹配淹没,那么仅在搜索词达到最低复杂度级别时才启用标题搜索。目标是让顶部搜索结果中最多出现 4 到 5 个“标题”匹配。(不过我意识到这可能很难实现)