MongoDB 文本索引多词搜索太慢

标签 mongodb

问题描述

MongoDB 版本:3.4.4

MongoDB 集合中的文档是从 XML 文件(而非 GridFS)创建的,看起来像这样:

{
    ...
    "СвНаимЮЛ" : {
        "@attributes" : {
            "НаимЮЛПолн" : "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"КОНСАЛТИНГОВАЯ КОМПАНИЯ \"ГОТЛИБ ЛИМИТИД\"",
            ...
        },
        ...
    }
    ...
}

语言是俄语。集合中有大约 10,000,000 个文档 和“СвНаимЮЛ.@attributes.НаимЮЛПолн”字段上的文本索引。

一个词搜索非常快:

db.records.find({
    $text: {
        $search: "ГОТЛИБ"
    }
})

但是用逻辑 AND 搜索几个词太慢了,我什至不能等到它结束才能得到 explain('executionStats') 结果。

例如下一个查询很慢。查找所有包含单词“ГОТЛИБ”和“ЛИМИТИД”的文档:

db.records.find({
    $text: {
        $search: "\"ГОТЛИБ\" \"ЛИМИТИД\""
    }
})

按词组搜索也很慢。例如,查找所有包含短语“ГОТЛИБ ЛИМИТИД”的文档:

db.records.find({
    $text: {
        $search: "\"ГОТЛИБ ЛИМИТИД\""
    }
})

getIndexes() 输出:

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "egrul.records"
        },

        ...

        {
                "v" : 2,
                "key" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                },
                "name" : "СвНаимЮЛ.@attributes.НаимЮЛПолн_text",
                "ns" : "egrul.records",
                "default_language" : "russian",
                "weights" : {
                        "СвНаимЮЛ.@attributes.НаимЮЛПолн" : 1
                },
                "language_override" : "language",
                "textIndexVersion" : 3
        }
]

问题

我能否以某种方式提高按多个词搜索(使用逻辑 AND)或按短语搜索的速度?

已编辑

刚刚发现用逻辑或的多个单词搜索也很慢:

db.records.find({
    $text: {
        $search: "ГОТЛИБ ЛИМИТИД"
    }
})

最佳答案

看起来问题不在于多词搜索速度慢,而是如果搜索词出现在许多文档中则搜索速度慢。

E. G。单词“МИЦУБИСИ”仅出现在 24 个(从 10,000,000 个)文档中,因此查询

db.records.find({
    $text: {
        $search: "МИЦУБИСИ"
    }
}).count()

非常快。

但是单词“СЕРВИС”出现在160,000个文档和query中

db.records.find({
    $text: {
        $search: "СЕРВИС"
    }
}).count()

非常慢(大约需要 40 分钟)。

查询

db.records.find({
    $text: {
        $search: "\"МИЦУБИСИ\" \"СЕРВИС\""
    }
}).count()

也很慢,因为(我想)MongoDB 会查找术语“МИЦУБИСИ”(快)和“СЕРВИС”(慢),然后进行交集或其他操作。

现在我想找到一种方法来限制结果的数量,例如 find 10 documents and stop 因为 limit() 不适用于文本查询。 .

或者升级我的服务器硬件。

或者看看 Elasticsearch。

关于MongoDB 文本索引多词搜索太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44755601/

相关文章:

mongodb - $filter 如果属性不存在

PHP MongoDB 身份验证失败

ruby - 使用 minPoolSize optoin 时 Mongo Ruby 2.4 未定义方法错误

angularjs - 使用 AngularJS 和 NodeJS、MongoDB 进行动态 URL 查询

mongodb - Golang GraphQL MongoDB 努力从数据库中获取日期和 ID

javascript - meteor /蒙戈 : Finding and updating certain elements in a collection

mongodb - 插入到 mongo 数组的特定索引

javascript - 在 Mongoose 模式中添加带有破折号字符的字段

arrays - 更新数组mongodb中的嵌套数组

javascript - 无法编写 GraphQL Mutation 来在数据库中创建新用户