search - 使用 mapreduce 在 NoSQL 中进行文本搜索

标签 search nosql mapreduce information-retrieval trie

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

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

  1. 将整个标题列表加载到内存中并作为 trie 或前缀树进行索引

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

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

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

最佳答案

要有效地执行此操作,您必须按单词为文本编制索引。

换句话说,名为 MapReduce:大型集群上的简化数据处理 的对象 foo 将映射到以下键:

  • MapReduce:大型集群上的简化数据处理
  • 大型集群上的简化数据处理,
  • 大型集群上的数据处理,
  • 大型集群处理,
  • 在大型集群上
  • 大型集群,
  • 集群

如果文本太长,您可以将键截断为给定的字符数(比如 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}}

关于search - 使用 mapreduce 在 NoSQL 中进行文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335266/

相关文章:

PHP - 使用两个下拉菜单中的两个搜索词进行搜索

在 ClearCase 的文档中搜索短语

c# - 在RavenDB中,如何查询文档中嵌套的 "objects"?

firebase - Firestore 多范围查询

mysql - OpenStack Nova 切换到 Cassandra —— 优点和缺点?

hadoop - 在 Hadoop 中分组数据

php - 如何在 Codeigniter 中创建用于搜索的 MVC?

java - Words Count 输出显示 mapred 而不是 mapreduce

hadoop - 从映射器输出中获取前 N 个项目 - Mapreduce

javascript - 如何在搜索栏下添加来自数据库的自动完成建议?