佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Mongodb實戰(zhàn)之全文搜索功能

Mongodb實戰(zhàn)之全文搜索功能

熱門標簽:百度競價排名 AI電銷 Linux服務器 鐵路電話系統(tǒng) 地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 服務外包 呼叫中心市場需求

前言

眾所周知在傳統(tǒng)的關系型數(shù)據(jù)庫中,我們通常將數(shù)據(jù)結(jié)構化,通過一系列表關聯(lián)、聚合來查詢我們所需的結(jié)果。而在非結(jié)構化的數(shù)據(jù)中,缺少這種預定義的結(jié)構,因而如何快速查詢定位到我們所需要的結(jié)果,不是一件容易的事。

Mongodb作為一種NoSQL數(shù)據(jù)庫,非常適合存儲和管理非結(jié)構化數(shù)據(jù),例如互聯(lián)網(wǎng)上的各種文本數(shù)據(jù)。假如我們用Mongodb存儲了很多博客文章,那么如何快速找到所有關于“nodejs”這個主題的文章呢?Mongodb內(nèi)建的全文搜索可以幫助我們完成這個功能。下面話不多說了,來一起看看詳細的介紹:

在本篇博文中,將要介紹的是我使用Mongdb text search的一些經(jīng)驗。

Mongodb text search是什么?

Mongodb text search是Mongodb對數(shù)據(jù)庫進行搜索的功能模塊,類似于數(shù)據(jù)庫內(nèi)建的搜索引擎。有些人可能會疑問,查數(shù)據(jù)庫為什么還需要搜索引擎?直接用條件查詢不就得了。例如在前面的文章主題搜索中,我們不可能事先提取出每篇文章的主題,然后用專門的字段存儲,因此沒辦法進行條件查詢。并且同一個主題詞,有多種不同的表達方式,例如”node”、”nodejs”可視為同一個主題。

Mongodb text search可以自動地對大段的文本數(shù)據(jù)進行分詞處理、模糊匹配、同義詞匹配,解決文本搜索的問題。

建立文本索引

要使Mongodb能夠進行全文搜索,首先要對搜索的字段建立文本索引。建立文本索引的關鍵字是text,我們既可以建立單個字段的文本索引,也可以建立包含多個字段的復合文本索引。需要注意的是,每個collection只能建立一個文本索引,且只能對String或String數(shù)組的字段建立文本索引。

我們可以通過以下命令,建立一個文本索引:

db.collection.createIndex({ subject: "text", content: "text" })

在mongoose中我們可以通過以下代碼,創(chuàng)建文本索引:

schema.index({ subject: "text", content: "text" })

需要注意的是:由于每個collection只支持一個文本索引,所以當你需要在schema中添加或刪除文本索引字段時,往往不起作用。這時候你需要到數(shù)據(jù)庫中,手動刪除已經(jīng)建立的文本索引。

文本搜索示例

文本搜索的語法為:

{
 $text:
  {
   $search: string>,
   $language: string>,
   $caseSensitive: boolean>,
   $diacriticSensitive: boolean>
  }
}

在mongoose中,我們可以通過以下語句進行文本搜索:

var query = model.find({ $text: { $search: "hello world" } })

$search后面的關鍵詞可以有多個,關鍵詞之間的分隔符可以是多種字符,例如空格、下劃線、逗號、加號等,但不能是-和\",因為這兩個符號會有其他用途。搜索的多個關鍵字是or的關系,除非你的關鍵字包含-。例如hello world會包含所有匹配hello或world的文本,而hello -world只會匹配包含hello且不包含world的文本。

$language指示搜索的語言類型,在最新的Mongodb 3.2 enterprise版本中,已經(jīng)增加了對中文文本的搜索。

$caseSensitive設置是否區(qū)分大小寫。

$diacriticSensitive設置是否區(qū)別發(fā)音符號,CAFÉ于Café是同一語義,只是重音不一樣。

我們還可以對搜索的結(jié)果按匹配度進行排序:

db.posts.find(
  { $text: { $search: "hello world" } },
  { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

注意事項

Mongodb建立文本索引時,會對提取所有文本的關鍵字建立索引,因而會造成一定的性能問題。所以對于結(jié)構化的字段,建議用普通的關系查詢,如果需要對大段的文本進行搜索,才考慮用全文搜索。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持

您可能感興趣的文章:
  • MongoDB 使用Skip和limit分頁
  • 利用node.js+mongodb如何搭建一個簡單登錄注冊的功能詳解
  • mac下安裝和配置mongodb的步驟詳解
  • Windows下MongoDb簡單配置教程
  • 在Linux服務器中配置mongodb環(huán)境的步驟
  • Mongodb實現(xiàn)的關聯(lián)表查詢功能【population方法】
  • MongoDB 中Limit與Skip的使用方法詳解

標簽:仙桃 衡水 崇左 蘭州 湘潭 湖南 黃山 銅川

巨人網(wǎng)絡通訊聲明:本文標題《Mongodb實戰(zhàn)之全文搜索功能》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    石泉县| 绥德县| 商河县| 雷州市| 淮南市| 乌兰浩特市| 三台县| 永顺县| 孝义市| 伊宁县| 富源县| 丹江口市| 吉林省| 景洪市| 二连浩特市| 策勒县| 射阳县| 夏津县| 易门县| 义乌市| 济源市| 县级市| 乡宁县| 安远县| 汝州市| 颍上县| 和龙市| 扬州市| 博客| 察哈| 离岛区| 凤翔县| 五华县| 汨罗市| 翁牛特旗| 华阴市| 井冈山市| 哈密市| 古丈县| 宁明县| 务川|