MongoDB文本索引按多个单词搜索太慢

问题描述

MongoDB版本:3.4.4

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

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

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

按单词搜索非常快:

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

但是用逻辑AND搜索几个单词是如此之慢,以至于我甚至不能等到它结束才能获得解释(‘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: "ГОТЛИБ ЛИМИТИД"
    }
})

最佳答案 看起来问题不在于多个单词搜索速度慢,但如果搜索词出现在许多文档中,搜索速度会很慢.

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寻找术语“МИЦУБИСИ”(快速)和“СЕРВИС”(慢),然后交叉或其他东西.

现在我想找到一种限制结果数量的方法(limit()不适用于文本查询).像找到10个文件并停止的东西.

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

或者看看Elasticsearch.

点赞