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

时间:2017-06-26 08:22:39

标签: mongodb

问题描述

MongoDB版本:3.4.4

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

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

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

用一个字搜索非常快:

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

但是用逻辑AND搜索几个单词是如此之慢,以至于我甚至不能等到它结束才能得到explain('executionStats')结果。

E.g。下一个查询很慢。查找所有包含“ГОТЛИБ”和“ЛИМИТИД”字样的文件:

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

按短语搜索也很慢。 E.g查找所有包含短语“ГОТЛИБЛИМИТИД”的文件:

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: "ГОТЛИБ ЛИМИТИД"
    }
})

1 个答案:

答案 0 :(得分:1)

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

电子。 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()不适用于文本查询)。类似于find 10 documents and stop

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

或者看看Elasticsearch。