溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MongoDB之索引(全文索引)

發(fā)布時(shí)間:2020-08-11 17:01:27 來源:ITPUB博客 閱讀:123 作者:stonebox1122 欄目:關(guān)系型數(shù)據(jù)庫
在一些信息管理平臺(tái)上經(jīng)常需要進(jìn)行信息模糊查詢,最早的時(shí)候是在某個(gè)字段上實(shí)現(xiàn)的模糊查詢,但是這個(gè)時(shí)候返回的信息并不會(huì)很準(zhǔn)確,因?yàn)橹荒軌虿锳字段或者是B字段,而在MongoDB里面實(shí)現(xiàn)了非常簡(jiǎn)單的全文檢索。

范例:定義一個(gè)新的集合
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"});

范例:創(chuàng)建全文索引
> db.news.createIndex({"title":"text","content":"text"});
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

范例:實(shí)現(xiàn)數(shù)據(jù)的模糊查詢
如果要想表示出全文檢索,則使用“$text"判斷符,而要想進(jìn)行數(shù)據(jù)的查詢則使用“$search”運(yùn)算符:
  ● 查詢指定的關(guān)鍵字:{"$search":"查詢關(guān)鍵字"}
  ● 查詢多個(gè)關(guān)鍵字(或關(guān)系):{"$search":"查詢關(guān)鍵字 查詢關(guān)鍵字 ..."}
  ● 查詢多個(gè)關(guān)鍵字(與關(guān)系):{"$search":"\"查詢關(guān)鍵字\" \"查詢關(guān)鍵字\" ..."}
  ● 查詢多個(gè)關(guān)鍵字(排除某一個(gè)):{"$search":"查詢關(guān)鍵字 查詢關(guān)鍵字 ...-排查關(guān)鍵字"}

范例:查詢單個(gè)內(nèi)容
> db.news.find({"$text":{"$search":"stoneA"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }

范例:查詢包含有“stoneA”和“stoneB”的信息
> db.news.find({"$text":{"$search":"stoneA stoneB"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbc"), "title" : "stoneB", "content" : "ttB" }
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }

范例:查詢同時(shí)包含有“ttC”和“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" }

范例:查詢包含有“ttE”但是不包含“ttF”
> db.news.find({"$text":{"$search":"ttE -ttF"}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE" }

但是在進(jìn)行全文檢索操作的時(shí)候還可以使用相似度的打分來判斷檢索結(jié)果。

范例:為查詢結(jié)果打分
> 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 }

按照打分的成績(jī)進(jìn)行排列,實(shí)際上就可以實(shí)現(xiàn)更加準(zhǔn)確的信息搜索。
如果一個(gè)集合的字段太多了,那么每一個(gè)字段都分別設(shè)置全文索引比較麻煩,簡(jiǎn)單一些,可以為所有字段設(shè)置全文索引。

范例:為所有字段設(shè)置全文索引
> 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
}
這是一種最簡(jiǎn)單的設(shè)置全文索引的方式,但是盡可能別用,會(huì)慢。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI