使用lunr.js及Lunr-languages实现静态HTML中文全文搜索

静态HTML如何实现中文的全文搜索功能


前言

记录探索实现静态HTML中文的全文搜索历程
Github地址:https://github.com/MihaiValentin/lunr-languages

一、Lunr.js和Lunr-language是什么?

Lunr.js 是一个轻量级的 JavaScript 库,专门用于在浏览器中实现全文搜索功能。它允许你在前端创建一个搜索索引,使用户能够在网页内容中快速找到与关键词匹配的内容。Lunr.js 主要用于静态网站或单页应用中,以便在不依赖后端服务的情况下提供搜索功能

但是,Lunr.js 的核心库仅支持英文搜索,而 Lunr-language 是一系列插件或扩展库,用于添加对其他语言的支持。这些插件包括特定语言的分词、词干提取和其他自然语言处理功能,使 Lunr.js 能够处理非英语文本。

二、踩坑过程

Lunr-language中的lunr.zh.js是不能在静态网页直接用的

lunr.zh.js用到了nodejieba分词,需要使用node.js提供运行环境,不能在浏览器中直接运行,否则会报错

Uncaught TypeError: nodejieba.cut is not a function
at lunr.zh.tokenizer (lunr.zh.js:98:1)
at lunr.Builder.add (lunr.js:2479:1)
at lunr.Builder. (xxx)
at lunr (lunr.js:53:1)
at XMLHttpRequest. (xxx)

三、解决方案

在issue里有人针对这个问题给出了解决方案,使用Intl.Segmenter替代nodejieba,并提交了代码。在这里插入图片描述
代码分支链接:点击跳转github

对lunr.zh.js进行测试,测试代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="../test/lunr/lunr-0.7.0.min.js"></script>
    <script src="../lunr.stemmer.support.js" charset="UTF-8"></script>
    <script src="../lunr.zh.js" charset="UTF-8"></script>
    <title>中文搜索</title>
</head>

<body>
    <p>测试中文搜索</p>
    <script>
        /* init lunr */
        var idx = lunr(function () {
            // use the language (zh)
            this.use(lunr.zh);
            // then, the normal lunr index initialization
            // this.field('title', { boost: 10 })
            this.field('text')

            /* add documents to index */
            this.add(
                {"type": 0, "text": "\u4f60\u5df2\u6dfb\u52a0\u4e86\u4f59\u9b45\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86\u3002", "is_send": 0, "avatar_path": "", "timestamp": 1613707281, "is_chatroom": 0, "displayname": "", "id": 5986869003124430289, "token": "ad4747bac520e8b69b5259aa1612e06e"}
            );
            this.add({"type": 1, "sub_type": 0, "is_send": 0, "timestamp": 1613707318, "id": "1163201509197690610", "text": "\u5f00\u59cb\u73a9\u5fae\u4fe1\u4e86\uff1f", "avatar_path": 1, "token": "8959fef627b7b56e875c5b58edabe359"});
        });

        console.log('Search for `添加`: ', idx.search('添加'));
        console.log('Search for `微信`: ', idx.search('微信'));
        console.log('Search for `大哥`: ', idx.search('大哥'));
    </script>
</body>

</html>

结果输出如下:

在这里插入图片描述
代码中所需的js代码在上述github仓库中!

<think>好的,用户的问题是关于GCC配置命令中的两个点(..)在路径中的含义。首先,我需要回忆一下Unix-like系统中的路径表示方法。两个点通常代表父目录,所以在路径中使用../可能是指向上级目录。但用户提到的路径中有两个连续的..,比如可能是../../something,或者是像target_bin_nonsec中的某个部分。不过根据用户提供的引用[2],路径是os.path.join(target_bin_base, target_bin_dir, \),这里可能用户误解了命令中的两个点,或者是在特定上下文中有特殊意义。 接下来,我需要确定用户提到的具体命令结构。用户给出的例子是gcc configure命令中的两个点,比如在路径中的使用。通常,在配置GCC时,可能会在构建目录中运行../configure,这里的两个点表示构建目录的上一级目录,即源代码目录。例如,如果用户在build目录中,而源代码在父目录,那么../configure就是运行上级目录中的configure脚本。 用户可能是在查看某个编译脚本或配置命令时遇到了两个点,不明白其作用。需要解释Unix路径中..的含义,以及它在GCC配置中的具体应用。此外,用户还提到了--disable-multilib和--enable-languages选项,这些是GCC的常见配置选项,但与路径中的两个点无关,可能需要简要说明。 然后,我需要检查用户提供的引用内容。引用[1]提到GCC和Clang的-finstrument-functions选项,以及LTTng-UST的相关库,这可能与函数跟踪有关,但与当前问题无关。引用[2]显示的是一个Python的os.path.join调用,其中可能包含路径拼接,但用户的问题是关于命令行中的路径,所以需要区分开。 总结用户的问题,核心在于解释路径中两个点的含义,特别是在GCC配置命令中的使用场景。需要说明在命令行中,..表示上一级目录,因此在类似../configure的命令中,它指向父目录中的configure脚本,通常用于分离源码和构建目录,保持构建环境的干净。 最后,生成相关问题时要围绕路径符号、GCC配置选项、构建目录结构等方面展开,确保用户能全面理解相关概念。</think>在GCC配置命令中,路径中的两个点`..`表示**返回上一级目录**的路径符号。这是Unix/Linux系统中标准的路径表达方式,具体作用如下: --- ### 一、路径符号解析 1. **单个点`.`** 表示当前工作目录,例如`./configure`表示执行当前目录下的configure脚本。 2. **两个点`..`** 表示当前目录的父目录。例如: - 路径`../src`指向当前目录的父目录下的`src`子目录; - 命令`../../configure`表示执行上两级目录中的configure脚本[^2]。 --- ### 二、GCC配置命令示例 在典型的GCC源码编译场景中,通常会创建独立的构建目录(build directory)来隔离源码和编译产物: ```bash mkdir build && cd build ../configure --disable-multilib --enable-languages=c,c++ ``` 这里`../configure`的含义是: 1. 当前位于`build`目录; 2. 通过`..`定位到`build`的父目录(即GCC源码根目录); 3. 执行父目录中的`configure`脚本。 --- ### 三、相关配置选项说明 1. **`--disable-multilib`** 禁用多库支持,即只编译当前架构的库(如64位系统仅生成64位库)。 2. **`--enable-languages=c,c++`** 指定需要编译的语言前端,此处选择C和C++。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枕石zs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值