mongodb 搜索速度_MongoDB文本索引按多个单词搜索太慢

针对MongoDB 3.4.4版本,发现在使用文本索引进行多词AND搜索时速度极慢。单词搜索速度较快,但当搜索词出现频率高时也会变慢。解决方案可能包括限制结果数量、升级硬件或考虑切换到Elasticsearch。
摘要由CSDN通过智能技术生成

问题描述

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值