搜索存储在mongodb中的文件中的关键字

时间:2014-06-21 05:12:16

标签: node.js mongodb file mongodb-query gridfs

我使用gridFS和node.js在mongodb中存储了一个.txt文件。 我们可以存储.pdf和其他格式吗?当我尝试存储.pdf并在控制台上检索内容时,它会在doc中显示文本,并在其中显示一些垃圾值。我用这行来检索“GridStore.read(db,id,function(err,fileData)” 还有其他更好的方法吗?

我们可以直接对存储在mongodb中的文件中的内容进行文本搜索吗?如果是这样我们怎么能这样做?

还可以告诉你mongodb中存储的文件数据以及格式是什么? 在这方面的任何帮助都会很棒。 --Thanks

1 个答案:

答案 0 :(得分:2)

你真正想要的是"文本搜索"功能,在MongoDB中要求您只需存储"文本"在文档中的一个或多个字段中。放"文字"进入MongoDB非常简单,只需提供"文本"作为字段的内容,MongoDB将存储它。对于任何类型的其他数据也是如此,这些数据仅仅存储在您指定的字段下。

这里的一般情况是你似乎真的想要"文本搜索"为此你必须存储"文本"你的数据。但在实现之前,让我们谈谈GridFS实际上是什么以及它不是什么,以及它当然不是你认为的那样。


GridFS的

GridFS不是MongoDB的软件或特殊功能。事实上,它是由可用驱动程序实现的功能规范,其唯一目的是使您能够存储超过16MB BSON存储限制的内容。

为此,实现使用两个集合。默认情况下,这些名称为fs.filesfs.chunks,但实际上可以是您告诉旅游驱动程序实现实际使用的任何内容。这些集合存储这些默认名称所指示的内容。作为"文件的唯一标识符和元数据"以及存储

的其他集合

以下是您通过GridFS API作为" chunk"中的文档发送的数据的快速摘要。系列:

{ 
    "_id" : ObjectId("539fc66ac8b5e6dc058b4568"), 
    "files_id" : ObjectId("539fc66ac8b5e6dc058b4567"), 
    "n" : NumberLong(0), 
    "data" : BinData(2,"agQAADw/cGhwCgokZGJ....
}

对于上下文,该数据属于" text"我通过GridFS API函数发送的文件。正如您所看到的,尽管实际内容是文本,但这里显示的内容是"散列"原始二进制数据的形式。

这实际上是API函数的功能,通过读取您提供的数据作为字节流并提交该二进制流,以及可管理的"块",所以很可能是你的部分功能"文件"事实上不会保存在同一份文件中。实际上,这是实施的重点。

对于MongoDB本身而言,这些只是普通的集合,您可以将它们视为所有常规操作,例如查找,删除和更新。您的驱动程序实施的GridFS API规范为您提供了“读取"来自所有这些块甚至返回该数据,就像它是一个文件一样。但事实上,它只是集合中的数据,二进制格式,并且跨文档分割。这些都不会帮助您执行"搜索"这不是" text"或包含在同一文件中。


文字搜索

所以你真正想要的是"文本搜索"允许您找到您要搜索的单词。如果你想存储"文字"例如,从PDF文件中,您需要从外部提取该文本并存储在文档中。或者使用外部文本搜索系统,它会做同样的事情。

对于MongoDB实现,任何提取的文本都将存储在文档中,或者可能存储在多个文档中,以便您启用"text index"以启用搜索功能。基本上你会在这样的集合上做到这一点:

db.collection.ensureIndex({ "content": "text" })

一旦字段或"字段"您的文档中包含文档索引,然后您可以使用.find()运算符db.collection.find({ "$text": { "$search": "word" } }) 进行实际搜索:

fs.files

这种形式的查询允许您匹配您在搜索中指定的字词上的文档,并确定与您的搜索的相关性和"排名"相应的文件。

有关详细信息,请参阅$text上的教程部分。


联合

实际上没有什么能阻止你采取综合方法。在这里,您实际上将使用text search API方法存储您的原始数据文档,然后存储提取的"文本"在另一个知道并包含对原始{{1}}文档的引用的集合中,该文档引用了您的大型文本文档或PDF文件或其他内容。

但你需要提取"文本"来自原文"文件"并将其存储在您的集合中的MongoDB文档中。否则,可以使用外部文本搜索解决方案采用类似的方法,其中提供可以执行诸如从PDF文档之类的内容中提取文本之类的操作的接口是很常见的。

使用外部解决方案,您还可以将引用发送到文档的GridFS表单,以便在您打算提供原始内容的情况下,使用其他请求从任何搜索中检索此数据。

所以最终你会发现这两种方法实际上是针对不同的事情。你可以建立自己的方法"结合"功能,但"搜索"用于搜索和" chunk"存储是为了完成你想要它做的事情。

当然,如果您的内容总是低于16MB,那么就像平常一样将其存储在文档中。但是,当然,如果这是二进制数据而不是文本,除非您明确提取文本,否则对搜索没有好处。