在MongoDB中搜索(来自NodeJS)

时间:2013-09-11 15:14:06

标签: node.js mongodb search full-text-search search-engine

我有一个MongoDB数据库,每天每天会有5到10个插入。将要插入的数据结构如下所示:

{
    question: 'text here', 
    date: '01/01/2000 01:01',
    title: 'Some title',
    client: 'name',
    assigned_to: ['name1', 'name2', 'name3'],
    answers: [
        {answer: 'bla bla'}, 
        {answer: 'bla bla'}, 
        {answer: 'bla bla'}
    ]
}

我需要在所有文本字段(问题,标题和所有答案)中搜索单词或一系列单词。 我一直在寻找,这是我到目前为止所发现的。有3个解决方案:

a) $regexp 
b) Enable full-text search in MongoDB and use it
c) Save the structure with the following format (and then use multi-key search)

{
    question: 'text here', 
    question_s: ['text', 'here'],
    date: '01/01/2000 01:01',
    title: 'Some title',
    title_s: ['Some', 'title'],
    client: 'name',
    assigned_to: ['name1', 'name2', 'name3'],
    answers: [
        {answer: 'bla bla', answer_s: ['bla', 'bla']}, 
        {answer: 'bla bla', answer_s: ['bla', 'bla']}, 
        {answer: 'bla bla', answer_s: ['bla', 'bla']}
    ]
}

了解我的数据的确切格式以及它的大小(估计未来10年),其中哪一个在速度和可用性方面更好? (考虑到每个解决方案所需的时间/脑痛,如设置,配置等)

1 个答案:

答案 0 :(得分:1)

第二当然速度要好得多,尤其是索引。第一个可用性更好,因为可以使用简单的RegExp。

另一种选择是拥有所有单词的另一个集合,然后将单词添加为_id,并添加_id的项目数组(在您的情况下为问题)。 这样就减少了存储空间,外部收集负责搜索。将使每个单词搜索更容易,并且还可以通过此RegExp进行搜索:^someText,它是字符串的开头 - 也将使用索引。

这里的负面部分是您需要适当的系统,以确保更新单词集合并与实际项目(您的案例中的问题)保持一致。 但是一旦完成,这将是快速且易于使用的,并且能够以良好的性能返回多个搜索结果,而不管使用索引的单词的集合大小。

另一个问题可能开始,如果单词集合索引数据太大而且不适合RAM,那么它会将这个索引数据移动到文件中 - 这通常会减慢写入和读取速度。
但是为此您需要数百万或更多的记录,然后您可以考虑使用数据库聚类来按字母集合分割,例如首字母。