Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
Problema de índice de documentos de exportación e importación de Flexsearch

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'));
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar

0

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()
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda