MongoDB搜索 - 自动完成

问题描述:

我们目前正在MySQL上运行我们的应用程序,并计划迁移到MongoDB。我们已经移动了一些部分,但在MongoRegex性能方面存在问题。MongoDB搜索 - 自动完成

我们有一个自动完成搜索框,可以连接6个表(索引/非索引字段)并在mysql上返回结果超快。 MongoDB上的相同事情执行起来非常慢。它只需要一个集合约2.3秒。用户必须等待很长时间。连接时间为0.064秒。查询时间2.36秒。我做了一些谷歌搜索,找不到完美的答案。大家都说MongoRegex很慢。如果那是真的,其他公司如何克服这个问题呢?

在MongoDB上运行时改进自动完成性能/体验的最佳方式是什么?

+0

由于这是用于某种“自动完成”功能,所以您的模式前缀为固定字符串。就像'Mongo。*'/'Mongo%'。所以,作为一个疯狂的猜测,_maybe最终may_ MySQL将优化RE/LIKE搜索时,左前缀是不变的使用索引。 _最终可能_ MongoDB无法达到同样的效果?你在这个领域有适当的索引吗? –

+0

[使用MongoDB搜索实现自动完成功能]可能的重复(http://*.com/questions/29892947/implement-auto-complete-feature-using-mongodb-search) –

很难说,因为我们没有搜索查询,但值得一提的是,在看过文档后,看起来MongoDB能够在使用RE搜索时使用索引,如果模式是由常量字符串前缀,只有当它被固定

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

所以,引用文档:

正则表达式是一个“前缀表示”如果它与一个插入符号开始(^)或a左锚(\ A),后跟一串简单的符号。例如,正则表达式/^abc.*/将通过匹配仅与从abc开始的索引中的值进行匹配。

但是/abc.*//^.*abc/不会使用该索引。

+0

如果它是一个标准的正则表达式,这也应该这样做:'/^abc /' –

+0

@Rick哦是的。当然,任何前缀表达式都可以工作。 –

首先,你将不得不仔细设计你的查询。小心地选择合适的索引字段并进行相应的设计。此外,如果您使用的是正则表达式,请确保您以强制查询使用索引字段的方式编写正则表达式。像/ ^前缀/将做。 [见这个链接:http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use]

我见过很多使用mongodb范围查询的实现,但林不知道这是否是最好的,因为即时结果是一个关键的事情。

除此之外,我见过一些推荐前缀树的人。它将前缀有效地存储在一个字段中,然后将以该特定前缀开头的所有单词作为数组存储在下一个字段中。这个解决方案听起来很有说服力和快速,因为前缀字段应该被索引,但是你也必须考虑存储因素。