Estoy tratando de crear un índice sobre el uso de flexsearch y nodejs y almacenarlo en un disco local, ya que lleva bastante tiempo construirlo. La exportación parece funcionar, pero cuando intento importar el archivo nuevamente con un nuevo índice de documentos, aparece este error:
TypeError: Cannot read property 'import' of undefined at Qtimport (/opt/hermetic/hermetic/server/node_modules/flexsearch/dist/flexsearch.bundle.js:33:330) at Object.retrieveIndex (/opt/hermetic/hermetic/server/build/search.js:86:25) at Object.search (/opt/hermetic/hermetic/server/build/search.js:96:32) at init (/opt/hermetic/hermetic/server/build/server.js:270:27)Estoy ejecutando la versión 14 de nodejs y la versión 0.7.21 de flexsearch. A continuación se muestra el código que estoy usando:
import fs from 'fs'; import Flexsearch from 'flexsearch'; const createIndex = async () => { 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')); await index.export((key, data) => fs.writeFile(`./search_index/${key}`, data, err => !!err && console.log(err))); 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', ], }, }); const keys = fs .readdirSync('./search_index', { withFileTypes: true }, err => !!err && console.log(err)) .filter(item => !item.isDirectory()) .map(item => item.name); for (let i = 0, key; i < keys.length; i += 1) { key = keys[i]; const data = fs.readFileSync(`./search_index/${key}`, 'utf8'); index.import(key, data); } return index; } await createIndex(); const index = await retrieveIndex(); console.log('cached search', index.search('aaa'));Después de investigar esto más a fondo, la función no está disponible actualmente para búsquedas de tipo de documento. Consulte este problema en github para obtener más información.
También estaba tratando de encontrar una manera de exportar el índice correctamente, originalmente tratando de poner todo en un solo archivo. Si bien funcionó, no me gustó mucho la solución .
Lo que me llevó a su pregunta SO, revisé su código y logré averiguar por qué recibe ese error.
Básicamente, la exportación es una operación de sincronización, mientras que también (aleatoriamente) usa async. Para evitar el problema, debe eliminar todo el código asíncrono y solo usar operaciones de sincronización node.fs Para mi solución, también creé solo una vez el almacén de Documentos, para luego simplemente llenarlo a través de retrieveIndex() en lugar de crear new Document() por función.
También agregué una extensión .json para garantizar que node.fs lea el archivo correctamente y por motivos de cordura; después de todo, está almacenado en json.
Así que gracias por darme la idea de almacenar cada key como archivo @Jamie Nicholls 🤝
import fs from 'fs'; import { Document } from 'flexsearch' const searchIndexPath = '/Users/user/Documents/linked/search-index/' let index = new Document({ document: { id: 'date', index: ['content'] }, tokenize: 'forward' }) const createIndex = () => { index.add({ date: "2021-11-01", content: 'asdf asdf asd asd asd asd' }) index.add({ date: "2021-11-02", content: 'fobar 334kkk' }) index.add({ date: "2021-11-04", content: 'fobar 234 sffgfd' }) index.export( (key, data) => fs.writeFileSync(`${searchIndexPath}${key}.json`, data !== undefined ? data : '') ) } createIndex() const retrieveIndex = () => { const keys = fs .readdirSync(searchIndexPath, { withFileTypes: true }) .filter(item => !item.isDirectory()) .map(item => item.name.slice(0, -5)) for (let i = 0, key; i < keys.length; i += 1) { key = keys[i] const data = fs.readFileSync(`${searchIndexPath}${key}.json`, 'utf8') index.import(key, data ?? null) } } const searchStuff = () => { retrieveIndex() console.log('cached search', index.search('fo')) } searchStuff()