我正在开发一个需要搜索大量标题列表的应用程序。理想情况下我想使用 NoSQL,但似乎整个数据库的文本搜索不如 SQL 数据库(如果我错了请纠正我)
无论如何,我确实想优化搜索速度。普通搜索可能足够快,但我确实想要响应式实时搜索和模糊搜索。所以我只能想到两种方法:
将整个标题列表加载到内存中并作为 trie 或前缀树进行索引
使用 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 process
和data processZ
之间的键,你会得到:
{"key": "data processing on large clusters", "id": "foo", "value":{"position": 22}}
关于search - 使用 mapreduce 在 NoSQL 中进行文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335266/