3

我正在开发一个需要搜索大量标题列表的应用程序。理想情况下,我想使用 NoSQL,但似乎整个数据库的文本搜索不如 SQL 数据库好(如果我错了,请纠正我)

无论如何,我确实想优化搜索速度。普通搜索可能足够快,但我确实想要响应式实时搜索和模糊搜索。因此我只能想到两种方法:

  1. 在内存中加载整个标题列表并索引为 trie 或前缀树

  2. 使用 mapreduce 函数实现某种类型的 trie 算法。这将是首选的解决方案,但我不确定它是否可以完成,或者磁盘空间成本可能超过好处。

有任何想法吗?此外,我不确定“模糊搜索”是否最好用 trie 或 B+ 树实现。

由于“标题”是独一无二的。我应该只使用完整的标题作为 ID 吗?

4

1 回答 1

3

为了有效地做到这一点,您必须按单词索引您的文本。

换句话说,foo授权的对象MapReduce: Simplified Data Processing on Large Clusters将被映射到以下键:

  • MapReduce: Simplified Data Processing on Large Clusters,
  • Simplified Data Processing on Large Clusters,
  • Data Processing on Large Clusters,
  • Processing on Large Clusters,
  • on Large Clusters,
  • Large Clusters,
  • Clusters.

如果文本太长,您可以将键截断为给定数量的字符(例如24)。

这是 CouchDB 的代码示例:

function map(o) {
  const SIZE = 24;
  function format(text, begin) {
    return text.substr(begin, SIZE).toLowerCase();
  }
  const WORD_MATCHER = /\S+/g;
  while ((match = WORD_MATCHER.exec(o.title))) {
      var begin = match.index;
      emit(format(o.title, begin), {position: begin});
  }
}

然后,如果您要求 和 之间的键data processdata processZ您将得到:

{"key": "data processing on large clusters", "id": "foo", "value":{"position": 22}}
于 2013-03-11T13:27:32.673 回答