MongoDB搜索 - 自动完成

时间:2015-05-09 10:17:25

标签: php mysql performance mongodb autocomplete

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

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

在MongoDB上运行时,提高自动完成性能/体验的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

很难说我们没有搜索查询,但值得一提的是,在看了一下文档之后,如果模式带有前缀,MongoDB似乎可以在使用RE搜索时使用索引通过常量字符串仅当它被锚定

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

所以,引用文档:

  

正则表达式是“前缀表达式”,如果它以插入符号(^)或左键(\ A)开头,后跟一串简单符号。例如,将通过仅匹配以/^abc.*/开头的索引中的值来优化正则表达式abc

/abc.*/ ou /^.*abc/不会使用索引。

答案 1 :(得分:0)

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

我见过许多使用mongodb范围查询的实现,但我不确定那是否是最好的,因为瞬时结果是关键。

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