【问题标题】:MongoDB text index search by multiple words is too slowMongoDB文本索引多词搜索太慢
【发布时间】:2017-06-26 08:22:38
【问题描述】:

问题描述

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)或按短语搜索的速度吗?

已编辑

刚发现用逻辑OR多词搜索也很慢:

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

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

    非常快。

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

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

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

    查询

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

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

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

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

    或者看看 Elasticsearch。

    【讨论】:

    • 你找到解决方案了吗?
    • 你创建了 $text 索引了吗?
    • 我正在使用 MongoDB 4.2 但问题仍然相同,因为即使对于索引 $text 搜索,响应对于大集合也响应太慢
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2018-09-27
    • 2022-12-22
    • 2014-05-10
    • 1970-01-01
    • 2014-01-11
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多