0

我正在使用 Mkdocs 来创建文章(一组静态 HTML 页面)。这些文档的问题在于 Mkdocs 创建的搜索系统非常基础,仅根据文章文本中的文章随机检索文章,并且不可能以任何方式进行连贯的短语匹配,没有“AB C”严格匹配搜索。

目前搜索效果如何糟糕的一些示例:
当您输入“不选择自动填充”时,搜索不会显示实际包含“默认情况下不选择“自动填充”这一短语的 3 篇文章,但而是调出所有包含 do、in、not、select、auto、fill + 它们的变体的文章。

当您在搜索字段中输入一个简短的词(例如“while”)时,不会检索到任何结果,即使该词出现在十几篇文章中也是如此。再比如:当你输入“选择器窗口”时,没有包含“时间选择器窗口”的文章被带到搜索结果的顶部;相反,检索所有包含单词“window”的文章。

请问有 Mkdocs-savvy 的人可以提供这方面的建议吗?

我的 Mkdocs.yml 中有什么:

markdown_extensions:  
    - smarty  
    - toc:  
        permalink: True  
        separator: "_"  
    - sane_lists  
    - tables  
    - meta  
    - fenced_code  
    - admonition  
    - footnotes  
plugins:  
    - search  
extra:  
    version: 1.0  
    search:  
      tokenizer: '[\\s\\-\\.]+'  

{{{ ^ 由于某种原因,这个搜索标记器绝对被忽略了。如果它被删除,搜索会很糟糕:) }}}

我错过了什么?

4

1 回答 1

2

首先,由于您的mkdocs.yml文件没有指定主题,因此假设您使用的是默认主题,该主题使用默认搜索实现。请注意,其他一些主题(尤其是material)实现了自己的搜索解决方案,这与默认设置不同。此答案不适用于这些主题。

搜索标记器设置被忽略,因为您定义不正确。如文档所述,该设置未命名separatortokenizer需要将其定义为search插件的子部分。像这样:

plugins:
    - search:
        separator: '[\s\-\.]+'

关于搜索词,请注意 MkDocs 使用 [lunr.js] 作为其搜索引擎。Lunr.js记录了最终用户如何以各种方式修改搜索。

顺便说一句,由于连字符 ( ) 是分隔符,因此您的搜索auto-filling不会像您预期的那样匹配。-换句话说,当创建搜索索引时,连字符被视为与空格和单词相同,auto并被filling索引为两个单独的单词。如果您不想要这种行为,则需要从设置中删除连字符。但这可能不是你想要的。

默认是使用 OR 搜索。如果文档中存在任何一个术语(每个术语由任何一个分隔符分隔),则该文档将作为搜索结果返回。如果文档中存在多个术语,则该文档的排名较高。但是,OR 搜索不考虑文档中彼此相关的术语。

您可能会发现 AND 搜索更有效。只需+在每个术语前添加一个 ( +do +not +select +auto +filling),然后您将只获得包含所有术语的结果。请注意,我还在搜索词中留下了连字符,因为它是如上所述的分隔符。

但是,虽然这只会返回包含所有术语的结果,但它不支持包含按特定顺序组合在一起的术语的结果。搜索引擎采用的常见解决方案是要求用引号括起来的术语以匹配特定顺序。但是,根据livernn/lunr.js#62,lunr.js 目前不支持该功能。

此外,搜索引擎会忽略停用词。具体来说,有些词很常见,以至于搜索引擎完全忽略了它们。例如,每个英语文档中的类似thea出现多次。因此,搜索引擎会忽略它们。

然后是stemming的问题,这在 lunr.js 的文档中有解释:

词干提取是将屈折词或派生词减少到其基础或词干形式的过程。例如,“searching”、“searched”和“searchable”的词干应该是“search”。这有两个好处:首先,搜索索引中的标记数量及其大小显着减少,此外,它增加了执行搜索时的召回率。包含“搜索”一词的文档可能与“搜索”的查询相关。

鉴于上述情况,您可能会发现搜索select auto fill很可能会返回与 完全相同的结果do not select auto-filling。但是,使用+filling应该会有所帮助,因为它会强制匹配术语filling而不是词干fill

最后,你问...

如何实现一个好的搜索系统

请注意,这样的问题在这里过于宽泛和离题。但是,上面链接的 lunr.js 文档很好地总结了大多数搜索引擎使用的许多基本概念。虽然您可能会在您的实现中做出一些不同的选择(就像我一样),但如果您真的有兴趣创建自己的整个搜索引擎,那么基本概念应该为您提供一个在研究中搜索术语的起点。

于 2020-01-21T20:13:18.847 回答