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
should 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?
Best Answer
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:
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.