3.6.3 全文索引
在一些信息管理平台上經常需要進行信息模糊查詢,最早的時候是利用了某個字段上實現的模糊查詢,但這個時候返回的信息並不會很准確,因為只能夠查A字段或B字段,而在MongoDB里面實現了非常簡單的全文檢索。
范例:定義一個新的集合
db.news.insert({"title" : "wangke", "content" : "lol"})
db.news.insert({"title" : "wangyan", "content" : "heshui"})
db.news.insert({"title" : "wangying", "content" : "cf"})
db.news.insert({"title" : "wangyanjun", "content" : "shuijiao"})
db.news.insert({"title" : "wangyan wangying", "content" : "heshui"})
范例:設置全文檢索
db.news.ensureIndex({"title" : "text", "content" : "text"})
范例:實現數據的模糊查詢
如果想表示出全文檢索,則使用"$text"判斷符,而想進行數據的查詢則使用"$search"運算符:
查詢指定關鍵字:{"$search" : "查詢關鍵字"}
查詢多個關鍵字(或關系):{"$search" : "查詢關鍵字 查詢關鍵字 ......"}
查詢多個關鍵字(與關系):{"$search" : "\"查詢關鍵字\" \"查詢關鍵字\" ......"} # \"轉義字符
排除多個關鍵字(排除某一個):{"$search" : "\"查詢關鍵字\" \"查詢關鍵字\"...... - 排除關鍵字"}
范例:查詢單個內容(全文檢索)
db.news.find({"$text" : {"$search" : "wangke"}})
范例:包含有"wangke"或"wangyanjun"的信息
db.news.find({"$text" : {"$search" : "wangke wangyanjun"}})
范例: 同時包含有“wangyan wagnying”的信息
db.news.find({"$text" : {"$search" : "\"wangyan\" \"wangying\""}})
范例:包含有"wangyan","wangying"沒有"wangke"的信息
db.news.find({"$text" : {"$search" : "\"wangyan\" \"wangying\" - wangke"}})
在進行全文檢索操作的時候還可以使用相似度的打分來判斷檢索成果。
范例:為結果打分
db.news.find({"$text" : {"$search" : "wangyan"}}, {"score" : {"$meta" : "textScore"}})
分數越高表示越接近最完美的查詢結果,打分操作可以使用戶更好地區分查詢准確度。
db.news.find({"$text" : {"$search" : "wangyan"}}, {"score" : {"$meta" : "textScore"}}).sort({"score" : {"$meta" : "textScore"}})
按照打分的成績進行排列,實際上就可以實現更加准確的信息搜索。
但是在這里還有一個小問題,如果一個集合的字段太多,那么每一個字段都分別設置全文檢索比較麻煩,這種情況可以為所有的字段設置全文檢索。
范例:為所有字段設置全文檢索
先將前面的索引刪除:
db.news.ensureIndex({"$**" : "text"})
這是一種最簡單的設置全文索引的方式,但是盡可能別用,一個字:慢。(索引越多,操作越慢)