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
    }
})