中文搜索摘要似乎已损坏

当我在论坛中尝试搜索中文时,返回的搜索结果句子破碎,标点符号缺失,词语之间出现了意外的空格,甚至还有一些词语丢失。

例如,我尝试搜索 管理员,原句是:

管理人员可见的分类。只有管理员和版主才能阅览主题

但在搜索结果中看到的却是下面这样。

如您所见,可见的 缺失了,句号 也缺失了,导致句子断裂。此外,只有 以及 才能 也丢失了,并且词语之间出现了意外的空格。

有人能帮我解决这个问题吗?谢谢

2 个赞

看起来那些缺失的字符在中文里被视为停用词。

(byebug) data = CppjiebaRb.segment(search_data, mode: mode)
["管理人员", "可见", "的", "分类", "。", "只有", "管理员", "和", "版主", "才能", "阅览", "主题"]
(byebug) CppjiebaRb.filter_stop_word(data)
["管理人员", "分类", "管理员", "版主", "阅览", "主题"]
3 个赞

等等,这里的 bug 是指结果中的“摘要”显示异常吗?而不是搜索功能本身存在实际问题?

是的,搜索功能仍然正常,只是显示的摘要不够理想。对于中文,搜索的处理方式有所不同。我们不是在搜索查询中忽略停用词,而是完全将其从搜索数据中排除。

3 个赞

感谢您对此进行调查。

这不是中文中的停用词,而是一个形容词,意思是“可见的”。

能否修复此问题(包括搜索结果中的所有内容)?或者有什么变通方法吗?

谢谢。

1 个赞

停用词指的是那些非常常见且会损害搜索性能的词语。

例如,在英语中,“And”就是一个停用词。

这个问题是可以修复的,预计需要几个月时间才能完成。在此期间,如果您需要快速修复,可以参考 #marketplace。

标记为 #pr-welcome。

2 个赞

停用词是通过 GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub 确定的。鉴于最近对搜索摘要显示方式的更改,我们应该直接删除以下行,因为它干扰了实际的搜索数据。

无论如何,我们目前对中文的搜索支持并不理想,但我们可以考虑使用 PostgreSQL 扩展,以便更好地支持那些没有原生支持的语言。例如 https://pgroonga.github.io/?

5 个赞

谢谢!让我试试看效果如何。

@tgxworld 我不确定我是否理解正确,PGroonga 不支持中文和日文。在 https://pgroonga.github.io/ 中:

PostgreSQL 仅支持对使用字母和数字的语言进行全文搜索。这意味着 PostgreSQL 不支持对日文、中文等语言进行全文搜索。通过在 PostgreSQL 中安装 PGroonga,您可以对所有语言使用超高速的全文搜索功能!

@tgxworld 按照您的建议,我已创建了一个 PR:FIX: keep chinese stopwords on search by t0t07 · Pull Request #11530 · discourse/discourse · GitHub

实际情况恰恰相反。普通的 PostgreSQL 不支持中文和日文,而 PGroonga 则增加了对这些语言的支持。

3 个赞

顺便提一下 @riking,想确认一下,目前 Discourse 是使用 PostgreSQL 内置函数来实现全文搜索的,就像这里:discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub

是这样吗?

1 个赞

抱歉,之前没有说得更具体。如果我们现在真的想修复这个问题,我们需要确保在搜索数据中不删除中文的停用词,同时确保在作为搜索查询使用时仍会删除停用词。

1 个赞

@tgxworld 我不太明白搜索数据与搜索查询之间的区别。能否请您提供更多详细信息?谢谢。

如果我们将停用词加入索引,会导致索引膨胀,并降低搜索性能。

PostSearchData 表中存储了两列数据:#search_data 用于根据搜索词进行查询,#raw_data 则用于显示搜索摘要。此处的修复方案应为:在从 #search_data 中移除中文停用词的同时,保留 #raw_data 中的中文停用词。

这个bug有进展了吗?

我以为我在这里做了一些修改:

您的语言环境是否设置为 zh_TWzh_CNja?如果不是,search_tokenize_chinese_japanese_korean 是否设置为 true?

我们在这里有一个绕过方案:

2 个赞