问题描述
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/