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