minisearch模糊搜索
·0 字·0 分钟阅读
minisearch
import MiniSearch from 'minisearch'
const tokenizer = (str) => {
// 分词逻辑,返回完整的单词以及单词的部分片段
const words = str.match(/[\u4e00-\u9fa5]+|[a-zA-Z0-9]+/g) || [];
const subStrings = [];
words.forEach(word => {
if (/^[a-zA-Z0-9]+$/.test(word)) { // 英文或数字
// 生成所有可能的子串
for (let i = 1; i <= word.length; i++) {
subStrings.push(...word.slice(0, i));
}
} else { // 中文
// 生成所有可能的 n-gram 子串
for (let i = 1; i <= word.length; i++) {
for (let j = 0; j <= word.length - i; j++) {
subStrings.push(word.substring(j, j + i));
}
}
}
});
return subStrings.filter((value, index, self) => self.indexOf(value) === index); // 去重
};
let miniSearch = new MiniSearch({
fields: ['name', 'description'], // 搜索哪些字段
storeFields: ['name', 'description', 'url'], // 返回哪些字段
tokenize: tokenizer
})
miniSearch.addAll(documents); // 配置搜索源
// 搜索
miniSearch.autoSuggest('搜索词', {
filter: (result) => {
// 处理搜索结果
searchData.value.push({
name: result.name,
description: result.description,
url: result.url
})
return true
}
})