激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - MongoDB - MongoDB實現基于關鍵詞的文章檢索功能(C#版)

MongoDB實現基于關鍵詞的文章檢索功能(C#版)

2020-05-05 17:24MRR MongoDB

這篇文章主要介紹了MongoDB實現基于關鍵詞的文章檢索功能(C#版)的相關資料,需要的朋友可以參考下

我的實現目標是:

可以通過一個或多個關鍵詞搜索到文章。

可以通過文章的關鍵詞列表查詢到其相關文章。

查詢到的結果依據相關程度降序排列。

查詢速度要夠快。(理論上關鍵詞檢索比全文檢索要快很多的)

在網上找了一大圈,就沒有一個靠譜的方法,基本都是只能傳入單詞來檢索,而且基本都沒有提供C#驅動版本的代碼,于是乎自己研究出了這個實現方案:

首先要求使用標簽、分詞、關鍵詞提取組件對文章對應的關鍵詞進行提取,然后作為數組格式,存入文章的Keywords字段中。

MongoDB實現基于關鍵詞的文章檢索功能(C#版)

核心檢索代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
/// 根據關鍵詞獲取文章編號與標題映射。
/// 注意:此方法會返回最為匹配的若干個項目,并根據匹配程度降序排列,即使是沒有任何關鍵詞匹配項,也會返回若干個結果的。
/// 另需注意:如果是根據文章關鍵詞來查詢,一般來說其中一定包含原文章,所以應該把期望獲得的數量加1,并在結果中移除原文。
/// </summary>
/// <param name="limitNum">數量上限</param>
/// <param name="keywords">關鍵詞集合</param>
/// <returns>文章編號與標題映射字典</returns>
public async Task<Dictionary<Guid, string>> GetArticleDicByKeywordsAsync(int limitNum, IEnumerable<string> keywords)
{
var list =
await
Database.GetCollection<Domain.Entity.Article>("Article").Aggregate()
.Match(q => !q.IsDeleted && q.Keywords != null)
.Project(q => new { q.Id, q.Title, Count = q.Keywords.Count(t => keywords.Contains(t)) })
.SortByDescending(q => q.Count)
.Limit(limitNum)
.ToListAsync();
return list.ToDictionary(f => f.Id, f => f.Title);
}

注意:這里一定要用Aggregate()方法做聚合,而不是常用的Find()方法做查詢,Find()方法后面跟Project()方法也不會改變方法鏈中操作的對象類型,這樣后面的SortByDescending()方法的目標對象還是Article類,而不是Project()方法中定義的匿名類,而SortByDescending()方法中傳入的表達式又僅允許用來選擇對象屬性,不允許進行任何計算,所以就根本無法實現我們的需求,我在發現Aggregate()方法之前就在這里一直卡著很久~

用作關鍵詞搜索時一般就是把關鍵詞傳入就可以了,不過傳回的結果也有可能壓根沒有匹配到任何關鍵詞,所以最好在發給用戶前再檢查一遍項目的匹配程度,把沒有任何匹配的結果濾掉。

用作相關文章搜索時,直接把原文章的Keywords屬性值傳入,獲取數量要比你預計的數量多1,因為非常可能你的原文章就在獲取到的列表中,而且是前列,獲取后濾掉原文章的ID,再執行Take方法返回你需要數量的項目即可(執行Take方法是為了以防你的原文沒出現在列表中,這概率極小但也是有的)。

為了增進查詢效率,還可以預設好索引,代碼如下:

?
1
2
3
4
5
var c=Database.GetCollection<Domain.Entity.Article>("Article");
c.Indexes.DropAll();
await c.Indexes.CreateOneAsync(
Builders<Domain.Entity.Article>.IndexKeys.Ascending(q => q.Keywords));
//參考自:http://mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/admin/#creating-an-index

所使用的C#官方驅動版本是:MongoDB.Driver.2.2.3

延伸 · 閱讀

精彩推薦
  • MongoDB遷移sqlserver數據到MongoDb的方法

    遷移sqlserver數據到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數據到MongoDb的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
  • MongoDBMongoDB中javascript腳本編程簡介和入門實例

    MongoDB中javascript腳本編程簡介和入門實例

    作為一個數據庫,MongoDB有一個很大的優勢——它使用js管理數據庫,所以也能夠使用js腳本進行復雜的管理——這種方法非常靈活 ...

    MongoDB教程網6982020-04-24
  • MongoDB分布式文檔存儲數據庫之MongoDB分片集群的問題

    分布式文檔存儲數據庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數據庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDBMongodb實現定時備份與恢復的方法教程

    Mongodb實現定時備份與恢復的方法教程

    這篇文章主要給大家介紹了Mongodb實現定時備份與恢復的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
  • MongoDBMongoDB憑什么躋身數據庫排行前五

    MongoDB憑什么躋身數據庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
  • MongoDBMongoDB 內存使用情況分析

    MongoDB 內存使用情況分析

    都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢...

    MongoDB教程網10002020-09-29
  • MongoDBmongodb基本命令實例小結

    mongodb基本命令實例小結

    這篇文章主要介紹了mongodb基本命令,結合實例形式總結分析了MongoDB數據庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
主站蜘蛛池模板: 色淫网站免费视频 | 免费黄色大片网站 | 久久久久久久久久久久久久国产 | 中文字幕欧美视频 | 人人玩人人爽 | 蜜桃网在线观看 | 精品一区二区三区中文字幕 | 麻豆视频网 | 麻豆porn | 中文字幕欧美日韩 | 黄色高清免费 | 精品三级内地国产在线观看 | 精品成人av一区二区在线播放 | 激情亚洲一区二区三区 | 欧美激情精品久久久久久久久久 | 黑色丝袜美美女被躁视频 | 久久久久成人免费 | 美女一级视频 | 麻豆视频在线免费观看 | 色综合久久久久久久久久 | 免费国产网站 | sesee99| 欧美老逼| 中文字幕在线永久 | 一区二区久久电影 | 国产无遮挡成人免费视频 | 久久情爱网 | 奶子吧naiziba.cc免费午夜片在线观看 | 一色视频 | 免费国产视频大全入口 | 青草伊人网 | 成人区一区二区三区 | 国产乱淫a∨片免费观看 | 国产午夜精品一区二区三区不卡 | 免费国产视频在线观看 | 精品久久中文字幕 | 极品大长腿啪啪高潮露脸 | 免费在线观看成人av | 99精品视频在线免费观看 | 亚洲天堂中文字幕在线观看 | 日日操夜夜透 |