【问题标题】:Searching in MongoDB (from NodeJS)在 MongoDB 中搜索(来自 NodeJS)
【发布时间】:2013-09-15 16:54:16
【问题描述】:

我有一个 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 年),这 3 种数据中哪一种在速度和可用性方面更好? (还要考虑每个解决方案所需的时间/脑痛,如设置、配置等)

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以,我能做的最好的事情是不伤脑筋并陷入疯狂的配置是第二个选择,对吧?顺便说一句,你知道全文搜索何时会被认为是稳定的生产环境吗?
    • 搜索总是非常具体的。全文搜索算法已经是一个热门话题,网上有很多关于不同实现的数据。这仍然是一项复杂的任务。
    猜你喜欢
    • 2012-11-29
    • 2020-07-10
    • 2021-01-21
    • 2017-04-15
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多