首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flexsearch导出和导入文档索引问题

Flexsearch导出和导入文档索引问题
EN

Stack Overflow用户
提问于 2021-10-28 20:29:02
回答 2查看 389关注 0票数 0

我正在尝试使用flexsearch和nodejs构建索引,并将其存储在本地磁盘上,因为它需要相当长的时间来构建。导出似乎可以工作,但当尝试使用新的文档索引再次导入文件时,我收到以下错误:

代码语言:javascript
复制
TypeError: Cannot read property 'import' of undefined
at Q.t.import (/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)

我正在运行nodejs版本14和flexsearch版本0.7.21。下面是我使用的代码:

代码语言:javascript
复制
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'));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-05 13:13:28

我也在试图找到一种正确导出索引的方法,最初是试图将所有内容都放到一个文件中。While it worked, I didn't really like the solution

这就引出了你的问题,我已经检查了你的代码,并设法找出了为什么你会得到这个错误。

基本上,导出是同步操作,而您也(随机)使用异步。为了避免这个问题,您需要移除所有异步代码,只使用同步node.fs操作。对于我的解决方案,我也只创建了一次文档存储,然后只需通过retrieveIndex()填充它,而不是为每个函数创建new Document()

我还添加了一个.json扩展来保证node.fs正确地读取文件,并且出于正常的目的-毕竟它是json存储的。

因此,感谢您给我这个想法,让我将每个文件存储为@Jamie Nicholls?文件

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2021-11-01 21:45:36

进一步研究后,该功能当前不适用于文档类型搜索。See this issue in github for more information

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69760524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档