全文索引,也叫文本索引,平時,我們百度的搜索,比如api文檔的搜索,這種全局的索引就可以使用全文索引實現
全文索引:對字符串與字符串數組創建全文可搜索對索引
使用情況:比如有一個數據集合,存儲了用戶的文章,用以下的數據結構存儲,{author:'',title:'',article:''},這個數據結構有三個字段,這提供了全文索引的搜索
建立方法
全文索引的建立方法跟之前的單鍵索引,復合索引,比較相似
單鍵索引:db.articles.ensureIndex({key:'text'}) 復合索引:db.articles.ensureIndex({key_1:'text',key_2:'text'}) 全文索引:db.articles.ensureIndex({"$**":"text"})
全文索引中,我們可能存在不同的字段,比如api,比如問答,比如公告,mongod中存儲的表結構是不固定的
創建全文索引
> db.articles.ensureIndex({'article':'text'}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
成功后,我們看下如何使用全文查詢,在這之前先插入幾條簡單的數據
db.articles.find({$text:{$search:'coffee'}}) db.articles.find({$text:{$search:'aa bb cc'}}) db.articles.find({$text:{$search:'aa bb -cc'}}) db.articles.find({$text:{$search:'"aa" "bb" "cc"'}})
使用全文索引跟使用其他索引不一樣,我們不再需要字段的名字,而是直接使用$text,$search進行查詢,這個時候有個問題,如果創建了兩個全文索引,它查的是哪一個,這個問題在mongodb中不會發生,因為在mongodb中,每個數據集合只能創建一個全文索引
模糊查找包含某個字段
> db.articles.find({$text:{$search:'aa'}}) { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" } { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" } { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
看到返回結構有三個包涵aa
我們查個只有第二個包含的
> db.articles.find({$text:{$search:'rr'}}) { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" }
可以看到只有第二條文檔返回了
模糊查找多個字段
有時候我們查詢時,關鍵詞不只有一個,可能多個,在mongodb中,可以非常簡單的將他們分開
> db.articles.find({$text:{$search:'aa bb cc'}}) { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" } { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" } { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
我們看到都返回了,這里是或查詢,包含aa或者包含bb,或者包含cc都會返回
不包含某個字段
有時候我們查詢,想要不包含某個字符串,可以用負號
> db.articles.find({$text:{$search:'aa bb -cc'}}) { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" } { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
可以看到,返回了兩條,包含aa bb,但是不包含cc的數據
與查找
我們的aa bb cc是或的查找方式,有的時候我們想用與的方式查找,就需要將字符串用引號引起來
> db.articles.find({$text:{$search:'"aa" "bb" "cc"'}}) { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
或
> db.articles.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}}) { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
可以看到只返回一條包含aa bb cc的一條信息