如何为使用Mkdocs生成的一组html页面实现良好的搜索系统?

时间:2020-01-21 16:55:02

标签: markdown tokenize mkdocs

我正在使用Mkdocs创建文章(静态HTML页面集)。这些文档的问题在于,由Mkdocs创建的搜索系统非常基础,仅基于文章文本中的存在而随机检索文章,并且不可能以任何方式进行连贯的短语匹配,因此无法进行“ ABC”严格匹配搜索要么。

有关当前搜索效果如何的一些示例:
当您输入“不选择自动填充”时,搜索将不会显示3条实际包含短语“默认情况下不选择”自动填充”的文章,而是显示所有包含do,in的文章,而不是选择自动填充其变体。

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

任何精通Mkdocs的人都可以提出建议吗?

我的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\\-\\.]+'  

{{{^由于某种原因,此搜索标记生成器绝对被忽略。如果将其删除,则搜索效果很差:)}}}

我想念什么?

1 个答案:

答案 0 :(得分:2)

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

搜索令牌化程序设置被忽略,因为您定义不正确。作为documented,该设置名为separator而不是tokenizer,需要将其定义为search插件的子部分。像这样:

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

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

顺便说一句,对auto-filling的搜索将不符合您的期望,因为连字符(-)是分隔符。换句话说,当创建搜索索引时,连字符被视为空格,并且单词autofilling被索引为两个单独的单词。如果您不希望出现这种情况,则需要从设置中删除连字符。但这可能不是您想要的。

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

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

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

此外,搜索引擎会忽略停用词。具体来说,有些单词非常普遍,以至于搜索引擎会完全忽略它们。例如,thea之类的单词在每个英语文档中都会出现多次。因此,搜索引擎将忽略它们。

然后是stemming的问题,在lunr.js的文档中对此问题进行了解释:

词干化是将变形词或派生词减少为 它们的基部或茎部形式。例如,“搜索”的词根, “搜索”和“可搜索”应为“搜索”。这有两个好处: 首先是搜索索引中的令牌数量,因此 尺寸显着减小,此外,它还增加了 进行搜索时回想一下。包含单词的文档 “搜索”可能与对“搜索”的查询有关。

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

最后,你问...

如何实施良好的搜索系统

请注意,这样的问题在这里太笼统了。但是,上面链接的lunr.js文档很好地总结了大多数搜索引擎使用的许多基本概念。尽管您可能会在实现方式中做出一些不同的选择(我也会如此),但是如果您真的有兴趣创建自己的整个搜索引擎,那么基本概念应该为您提供搜索术语的起点。 >