国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MongoDB > 正文

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

2020-10-29 18:49:47
字體:
來源:轉載
供稿:網友

我的實現目標是:

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

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

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

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

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

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

核心檢索代碼:

/// <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 =awaitDatabase.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方法是為了以防你的原文沒出現在列表中,這概率極小但也是有的)。

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东阳市| 通山县| 溧阳市| 弥渡县| 双柏县| 富阳市| 如皋市| 永福县| 聂荣县| 西丰县| 临湘市| 象州县| 阜康市| 阿瓦提县| 邢台县| 绥中县| 白玉县| 云南省| 黄梅县| 茌平县| 上饶县| 双鸭山市| 安乡县| 礼泉县| 大安市| 青海省| 锡林浩特市| 泽州县| 德阳市| 睢宁县| 军事| 阿拉善右旗| 穆棱市| 雷波县| 老河口市| 永昌县| 栖霞市| 民勤县| 含山县| 临西县| 江山市|