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