mongodb索引 全文索引


全文索引,也叫文本索引,平時,我們百度的搜索,比如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的一條信息
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM