Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implement autocomplete on MongoDB

Say I have a collection of users and want to implement autocomplete on the usernames of those users. I looked at the mongodb docs and $regex seems to be one way to do this. Is there a better way? By better I mean more performant/better practice.

like image 985
jhchen Avatar asked Nov 22 '11 08:11

jhchen


2 Answers

As suggested by @Thilo, you can use several ideas including prefixing.

The most important thing is to have very quick request (because you want autocomplete to feel instaneous). So you have to use query which will use properly indexes.

With regexp : use /^prefix/ (the important thing is the ^ to specify the beginning of line which is mandatory to make the query use index).

The range query is good too : { $gt : 'jhc', $lt: 'jhd' } }

More complicated but faster : you can store prefix-trees in mongo (aka tries) with entries like :

 {usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]}
 {usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]}

This last solution is very fast (if indexes on compl of course) but not space efficient at all. You know the trade-off you have too choose.

like image 134
kamaradclimber Avatar answered Sep 28 '22 15:09

kamaradclimber


We do it using regex and it's fast as long as you have an index and you use /^value/

Be aware you can't use the case insensitive option with an index, so you may want to store a lower case version of your string as another field in your document and use that for the autocomplete.

I've done tests with 3 million+ documents and it still appears instantaneous.

like image 44
Joe Avatar answered Sep 28 '22 17:09

Joe