IntroductionMongo provides some functionality that is useful for text search and tagging. Multikeys (Indexing Values in an Array)The Mongo multikey feature can automatically index arrays of values. Tagging is a good example of where this feature is useful. Suppose you have an article object/document which is tagged with some category names: obj = {
name: "Apollo",
text: "Some text about Apollo moon landings",
tags: [ "moon", "apollo", "spaceflight" ]
}
and that this object is stored in db.articles. The command db.articles.ensureIndex( { tags: 1 } );
will index all the tags on the document, and create index entries for "moon", "apollo" and "spaceflight" for that document. You may then query on these items in the usual way: > print(db.articles.findOne( { tags: "apollo" } ).name);
Apollo
The database creates an index entry for each item in the array. Note an array with many elements (hundreds or thousands) can make inserts very expensive. (Although for the example above, alternate implementations are equally expensive.) Text SearchIt is fairly easy to implement basic full text search using multikeys. What we recommend is having a field that has all of the keywords in it, something like:
{ title : "this is fun" ,
_keywords : [ "this" , "is" , "fun" ]
}
Your code must split the title above into the keywords before saving. Note that this code (which is not part of Mongo DB) could do stemming, etc. too. (Perhaps someone in the community would like to write a standard module that does this...) Comparison to Full Text Search EnginesMongoDB has interesting functionality that makes certain search functions easy. That said, it is not a dedicated full text search engine. For example, dedicated engines provide the following capabilities:
Bulk index building makes building indexes fast, but has the downside of not being realtime. MongoDB is particularly well suited for problems where the search should be done in realtime. Traditional tools are often not good for this use case. Real World ExamplesThe Business Insider web site uses MongoDB for its blog search function in production. Mark Watson's opinions on Java, Ruby, Lisp, AI, and the Semantic Web - A recipe example in Ruby. |

PLEASE POST QUESTIONS IN THE USER GROUPS FORUM. Post non-question comments and helpful hints here.
blog comments powered by Disqus