lunr-languages
是一个扩展库,用于扩展 Lunr.js 的多语言支持,包括中文、德语、法语、西班牙语等多种语言。以下是如何在项目中实际使用 lunr-languages
来构建和查询多语言索引的步骤总结:
1. 安装依赖
使用 npm 安装
npm install lunr
npm install lunr-languages
或者使用 CDN 引入
<script src="https://cdn.jsdelivr.net/npm/lunr/lunr.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lunr-languages/lunr.stemmer.support.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lunr-languages/tinyseg.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lunr-languages/lunr.zh.js"></script>
2. 单语言索引的构建(以中文为例)
示例文档
const documents = [
{ id: 1, title: "恁好,世界", content: "这是一个中文测试文档。" },
{ id: 2, title: "搜索技术", content: "Lunr.js 非常轻量,但功能强大。" }
];
构建中文索引
在初始化 Lunr 索引时,使用 lunr.zh
提供的中文支持:
const lunr = require("lunr");
require("lunr-languages/lunr.stemmer.support")(lunr);
require("lunr-languages/tinyseg")(lunr);
require("lunr-languages/lunr.zh")(lunr);
const idx = lunr(function () {
this.use(lunr.zh); // 启用中文支持
this.field("title");
this.field("content");
this.ref("id");
documents.forEach((doc) => this.add(doc));
});
// 搜索示例
const results = idx.search("测试");
console.log(results);
3. 多语言索引
多语言示例文档
const documents = [
{ id: 1, title: "恁好,世界", content: "这是一个中文测试文档。" },
{ id: 2, title: "Hello World", content: "This is an English test document." },
{ id: 3, title: "Bonjour le monde", content: "Ceci est un document de test français." }
];
构建多语言索引
多语言索引需要加载所有目标语言的插件,并使用 lunr.multiLanguage
方法:
const lunr = require("lunr");
require("lunr-languages/lunr.stemmer.support")(lunr);
require("lunr-languages/lunr.zh")(lunr);
require("lunr-languages/lunr.fr")(lunr);
require("lunr-languages/lunr.multi")(lunr);
const idx = lunr(function () {
this.use(lunr.multiLanguage("en", "fr", "zh")); // 支持英语、法语和中文
this.field("title");
this.field("content");
this.ref("id");
documents.forEach((doc) => this.add(doc));
});
// 搜索示例
const results = idx.search("document");
console.log(results);
4. 序列化和反序列化索引
序列化索引
将构建的索引保存为 JSON 文件,以便前端或其他脚本加载使用:
const serializedIndex = JSON.stringify(idx);
反序列化索引
在前端或另一个脚本中加载索引并使用:
const lunr = require("lunr");
require("lunr-languages/lunr.stemmer.support")(lunr);
require("lunr-languages/lunr.zh")(lunr);
require("lunr-languages/lunr.fr")(lunr);
require("lunr-languages/lunr.multi")(lunr);
const serializedIndex = /* 从文件或 API 加载的 JSON */;
const idx = lunr.Index.load(JSON.parse(serializedIndex));
// 搜索示例
const results = idx.search("document");
console.log(results);
5. 提高中文分词效果
默认情况下,lunr-languages
使用 tinyseg
进行中文分词,但其效果有限。可以结合服务端分词工具(如 nodejieba
)进行预分词:
示例:使用 nodejieba
分词
安装分词工具:
npm install nodejieba
对文档内容进行分词后再索引:
const jieba = require("nodejieba");
const documents = [
{ id: 1, title: jieba.cut("恁好,世界").join(" "), content: jieba.cut("这是一个中文测试文档。").join(" ") },
{ id: 2, title: "Hello World", content: "This is an English test document." }
];
构建索引的方式与之前类似。
总结
- 通过
lunr-languages
,恁可以方便地为 Lunr.js 添加多语言支持。 - 对于中文搜索,推荐结合预分词工具(如
nodejieba
)提升效果。 - 支持的语言丰富,可以轻松构建单语言或多语言索引。
- 通过序列化和反序列化,可以将索引部署到前端,或在多个环境中复用。