Flexsearch 0.7.21导出索引正常,新Document实例导入时报undefined错误如何解决
问题根因
这个报错是Flexsearch v0.7.21版本的特性限制导致的,核心有两点:
- Document实例的
import方法是异步方法,未加await就连续调用会导致内部状态初始化异常 - 通过
readdirSync拿到的文件顺序是文件系统默认排序,和导出时的key输出顺序不一致。Flexsearch要求导入必须严格按导出时的key顺序执行,否则内部对应索引实例还没初始化就调用导入逻辑,就会触发Cannot read property 'import' of undefined报错
修复方案
你需要在导出时记录key的顺序,导入时严格按该顺序、加await逐个导入即可,修改后的完整代码如下:
import fs from 'fs'; import Flexsearch from 'flexsearch'; // 先确保索引存储目录存在 const initIndexDir = async () => { await fs.promises.mkdir('./search_index', { recursive: true }); } const createIndex = async () => { await initIndexDir(); const { Document } = Flexsearch; const index = new Document({ document: { id: 'id', tag: 'tag', store: true, index: [ 'record:a', 'record:b', 'tag', ], }, }); index.add({ id: 0, tag: 'category1', record: { a: '1 aaa', b: '0 bbb' } }); index.add({ id: 1, tag: 'category1', record: { a: '1 aaa', b: '1 bbb' } }); index.add({ id: 2, tag: 'category2', record: { a: '2 aaa', b: '2 bbb' } }); index.add({ id: 3, tag: 'category2', record: { a: '2 aaa', b: '3 bbb' } }); console.log('search', index.search('aaa')); // 收集导出的key顺序 const exportKeys = []; await index.export(async (key, data) => { exportKeys.push(key); await fs.promises.writeFile(`./search_index/${key}`, data); }); // 持久化存储key顺序 await fs.promises.writeFile('./search_index/__keys.json', JSON.stringify(exportKeys)); return true; } const retrieveIndex = async () => { const { Document } = Flexsearch; const index = new Document({ document: { id: 'id', tag: 'tag', store: true, index: [ 'record:a', 'record:b', 'tag', ], }, }); // 读取之前存储的key顺序 const exportKeys = JSON.parse(await fs.promises.readFile('./search_index/__keys.json', 'utf8')); // 按导出顺序、加await逐个导入 for (const key of exportKeys) { const data = await fs.promises.readFile(`./search_index/${key}`, 'utf8'); await index.import(key, data); } return index; } await createIndex(); const index = await retrieveIndex(); console.log('cached search', index.search('aaa'));
注意事项
- 构建索引和导入索引的Document配置必须完全一致,否则也会出现导入异常
- 尽量使用fs的promise版本API配合async/await,避免回调嵌套导致的逻辑顺序错误
内容的提问来源于stack exchange,提问作者Jamie Nicholls
相关产品推荐
相关产品推荐

