Index of MongoDB (full-text index)
Fuzzy query of information is often needed on some information management platforms, the earliest time is the fuzzy query on a certain field, but the information returned at this time will not be very accurate, because only A field or B field can be checked, and a very simple full-text search is realized in MongoDB.
Example: define a new collection
Db.news.insert ({"title": "stoneA", "content": "ttA"})
Db.news.insert ({"title": "stoneB", "content": "ttB"})
Db.news.insert ({"title": "stoneC", "content": "ttC"})
Db.news.insert ({"title": "stoneD", "content": "ttD"})
Example: create a full-text index
> db.news.createIndex ({"title": "text", "content": "text"})
{
"createdCollectionAutomatically": false
"numIndexesBefore": 1
"numIndexesAfter": 2
"ok": 1
}
Example: implement fuzzy query of data
If you want to represent a full-text search, use the "$text" judge, and if you want to query the data, use the "$search" operator:
Keyword specified by ● query: {"$search": "query keyword"}
● query multiple keywords (or relationships): {"$search": "query keywords query keywords."}
● query multiple keywords (and relations): {"$search": "\" query keywords\ "\" query keywords\ "..."}
● query multiple keywords (excluding one): {"$search": "query keywords query keywords...-troubleshoot keywords"}
Example: query individual content
> db.news.find ({"$text": {"$search": "stoneA"}})
{"_ id": ObjectId ("5992c4310184ff511bf02bbb"), "title": "stoneA", "content": "ttA"}
Example: the query contains information for "stoneA" and "stoneB"
> db.news.find ({"$text": {"$search": "stoneA stoneB"}})
{"_ id": ObjectId ("5992c4310184ff511bf02bbc"), "title": "stoneB", "content": "ttB"}
{"_ id": ObjectId ("5992c4310184ff511bf02bbb"), "title": "stoneA", "content": "ttA"}
Example: query contains both "ttC" and "ttD"
> db.news.find ({"$text": {"$search": "\" ttC\ "\" ttD\ "}})
{"_ id": ObjectId ("5992c61d0184ff511bf02bc1"), "title": "stoneC", "content": "ttC ttD ttE"}
{"_ id": ObjectId ("5992c61d0184ff511bf02bc2"), "title": "stoneD", "content": "ttC ttD ttF"}
Example: the query contains "ttE" but not "ttF"
> db.news.find ({"$text": {"$search": "ttE-ttF"}})
{"_ id": ObjectId ("5992c61d0184ff511bf02bc1"), "title": "stoneC", "content": "ttC ttD ttE"}
However, in the full-text retrieval operation, we can also use the similarity score to judge the retrieval results.
Example: score query results
> db.news.find ({"$text": {"$search": "ttC ttD ttE"}}, {"score": {"$meta": "textScore"}}) .sort ({"score": {"$meta": "textScore"}})
{"_ id": ObjectId ("5992c61d0184ff511bf02bc1"), "title": "stoneC", "content": "ttC ttD ttE", "score": 2}
{"_ id": ObjectId ("5992c61d0184ff511bf02bc2"), "title": "stoneD", "content": "ttC ttD ttF", "score": 1.3333333333333333}
Ranking according to the scored results, you can actually achieve a more accurate information search.
If there are too many fields in a collection, it is troublesome to set a full-text index for each field, which is simpler, and you can set a full-text index for all fields.
Example: set up a full-text index for all fields
> db.news.dropIndexes ()
{
"nIndexesWas": 2
"msg": "non-_id indexes dropped for collection"
"ok": 1
}
> db.news.createIndex ({"$* *": "text"})
{
"createdCollectionAutomatically": false
"numIndexesBefore": 1
"numIndexesAfter": 2
"ok": 1
}
This is the easiest way to set up a full-text index, but don't use it as much as possible and it will be slow.