MongoDB text index and text search


I have a mongodb collection db.articles,it has 2 keys ,”title” and “abstract”.I want to do text search on these two keys.For example, the search text is “physics”,and I want all the documents whose “title” or “abstract” contains keyword “physics” is returned.But how to create the text index to meet my command is really confusing me:

Should I create two separate text indexes for both of them like this:

db.articles.ensureIndex({title:"text"})
db.articles.ensureIndex({abstract:"text"})

or

shoule I create a index in a single command and give the equal weight:

db.articles.ensureIndex(
                     {
                       title: "text",
                       abstract: "text",
                     },
                     {
                       weights: {
                                  title: 1,
                                  abstract:1,
                                },
                       name: "TextIndex"
                     }
                   )

I am already get used to the operation find(),whose query granularity is key,that is ,you should indicate the key you want to query on.But for text index, it seems like a document granularity,you cannot indicate the key you want to query on , instead ,you can only indicate the document name.So , what can I do if I want to do text search on a special key?

One Response to “MongoDB text index and text search”

  1. Adam C says:

    So, no need to test as it turns out, I just remembered the key deciding limitations. You can only create one text index on a collection (reference here), so you have no real choice. Additionally, MongoDB can only use one index at a time to satisfy a query (until index intersection is introduced in 2.6).

    Hence, the only workable option is to create the compound index as you outlined, on both fields as a single index:

    db.articles.ensureIndex(
                         {
                           title: "text",
                           abstract: "text",
                         },
                         {
                           weights: {
                                      title: 1,
                                      abstract:1,
                                    },
                           name: "TextIndex"
                         }
                       )
    

    The same remains true for 3 or 4 fields, you would first have to drop the existing index, then create the new index and include 3/4/other.

Leave a Reply

Question and Answer is proudly powered by WordPress.
Theme "The Fundamentals of Graphic Design" by Arjuna
Icons by FamFamFam