最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MongoDB實(shí)現(xiàn)基于關(guān)鍵詞的文章檢索功能(C#版)

 更新時(shí)間:2016年04月18日 11:08:06   投稿:mrr  
這篇文章主要介紹了MongoDB實(shí)現(xiàn)基于關(guān)鍵詞的文章檢索功能(C#版)的相關(guān)資料,需要的朋友可以參考下

我的實(shí)現(xiàn)目標(biāo)是:

可以通過(guò)一個(gè)或多個(gè)關(guān)鍵詞搜索到文章。

可以通過(guò)文章的關(guān)鍵詞列表查詢(xún)到其相關(guān)文章。

查詢(xún)到的結(jié)果依據(jù)相關(guān)程度降序排列。

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

在網(wǎng)上找了一大圈,就沒(méi)有一個(gè)靠譜的方法,基本都是只能傳入單詞來(lái)檢索,而且基本都沒(méi)有提供C#驅(qū)動(dòng)版本的代碼,于是乎自己研究出了這個(gè)實(shí)現(xiàn)方案:

首先要求使用標(biāo)簽、分詞、關(guān)鍵詞提取組件對(duì)文章對(duì)應(yīng)的關(guān)鍵詞進(jìn)行提取,然后作為數(shù)組格式,存入文章的Keywords字段中。

核心檢索代碼:

/// <summary>
/// 根據(jù)關(guān)鍵詞獲取文章編號(hào)與標(biāo)題映射。
/// 注意:此方法會(huì)返回最為匹配的若干個(gè)項(xiàng)目,并根據(jù)匹配程度降序排列,即使是沒(méi)有任何關(guān)鍵詞匹配項(xiàng),也會(huì)返回若干個(gè)結(jié)果的。
/// 另需注意:如果是根據(jù)文章關(guān)鍵詞來(lái)查詢(xún),一般來(lái)說(shuō)其中一定包含原文章,所以應(yīng)該把期望獲得的數(shù)量加1,并在結(jié)果中移除原文。
/// </summary>
/// <param name="limitNum">數(shù)量上限</param>
/// <param name="keywords">關(guān)鍵詞集合</param>
/// <returns>文章編號(hào)與標(biāo)題映射字典</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()方法做查詢(xún),F(xiàn)ind()方法后面跟Project()方法也不會(huì)改變方法鏈中操作的對(duì)象類(lèi)型,這樣后面的SortByDescending()方法的目標(biāo)對(duì)象還是Article類(lèi),而不是Project()方法中定義的匿名類(lèi),而SortByDescending()方法中傳入的表達(dá)式又僅允許用來(lái)選擇對(duì)象屬性,不允許進(jìn)行任何計(jì)算,所以就根本無(wú)法實(shí)現(xiàn)我們的需求,我在發(fā)現(xiàn)Aggregate()方法之前就在這里一直卡著很久~

用作關(guān)鍵詞搜索時(shí)一般就是把關(guān)鍵詞傳入就可以了,不過(guò)傳回的結(jié)果也有可能壓根沒(méi)有匹配到任何關(guān)鍵詞,所以最好在發(fā)給用戶(hù)前再檢查一遍項(xiàng)目的匹配程度,把沒(méi)有任何匹配的結(jié)果濾掉。

用作相關(guān)文章搜索時(shí),直接把原文章的Keywords屬性值傳入,獲取數(shù)量要比你預(yù)計(jì)的數(shù)量多1,因?yàn)榉浅?赡苣愕脑恼戮驮讷@取到的列表中,而且是前列,獲取后濾掉原文章的ID,再執(zhí)行Take方法返回你需要數(shù)量的項(xiàng)目即可(執(zhí)行Take方法是為了以防你的原文沒(méi)出現(xiàn)在列表中,這概率極小但也是有的)。

為了增進(jìn)查詢(xún)效率,還可以預(yù)設(shè)好索引,代碼如下:

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#官方驅(qū)動(dòng)版本是:MongoDB.Driver.2.2.3

相關(guān)文章

最新評(píng)論

浪卡子县| 广丰县| 靖宇县| 虎林市| 南雄市| 资源县| 东丽区| 谢通门县| 六安市| 长泰县| 安远县| 石渠县| 石景山区| 乐山市| 汽车| 克拉玛依市| 滁州市| 长治市| 金阳县| 宕昌县| 南通市| 铜山县| 崇明县| 神池县| 桓台县| 扬州市| 英吉沙县| 满洲里市| 山阴县| 涞源县| 武清区| 屏山县| 仁寿县| 策勒县| 德格县| 津市市| 栾城县| 金寨县| 色达县| 乌苏市| 开封县|