MongoDB实现基于关键词的文章检索功能(C#版)

所属分类: 数据库 / MongoDB 阅读数: 110
收藏 0 赞 0 分享

我的实现目标是:

可以通过一个或多个关键词搜索到文章。

可以通过文章的关键词列表查询到其相关文章。

查询到的结果依据相关程度降序排列。

查询速度要够快。(理论上关键词检索比全文检索要快很多的)

在网上找了一大圈,就没有一个靠谱的方法,基本都是只能传入单词来检索,而且基本都没有提供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 =
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方法是为了以防你的原文没出现在列表中,这概率极小但也是有的)。

为了增进查询效率,还可以预设好索引,代码如下:

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插入、更新、删除文档实现代码

本文通过实例代码给大家简单介绍了mongodb插入、更新、删除文档的方法,需要的的朋友参考下吧
收藏 0 赞 0 分享

mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)

对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新。更新修改器是中特殊的键
收藏 0 赞 0 分享

mongodb 数据类型(null/字符串/数字/日期/内嵌文档/数组等)

MongoDB的文档类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),需要的朋友可以参考下
收藏 0 赞 0 分享

MongoDB的创建、更新和删除

下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D(删除);由于R(查询)操作相对来说内容比较多,也比较繁琐,同时使用频率也比较高,所以下一篇会拿出来单独介绍。废话不多说,连上服务器,我们直接进入正题
收藏 0 赞 0 分享

MongoDB的下载、安装与部署方法

这篇文章主要介绍了MongoDB的下载、安装与部署方法,需要的朋友可以参考下
收藏 0 赞 0 分享

MongoDB的基础知识简介

这篇文章主要介绍了MongoDB的基础知识简介,需要的朋友可以参考下
收藏 0 赞 0 分享

MongoDB的查询方法

这篇文章主要介绍了MongoDB的查询方法,需要的朋友可以参考下
收藏 0 赞 0 分享

MongoDB的索引

数据库中的索引就是用来提高查询操作的性能,但是会影响插入、更新和删除的效率,因为数据库不仅要执行这些操作,还要负责索引的更新
收藏 0 赞 0 分享

MongoDB数据查询方法干货篇

查询操作在我们日常操作数据库的时候是必不可少的一部分,最近有些空闲时间,所有就将MongoDB数据查询的一些方法技巧总结了处理,这篇文章主要介绍了MongoDB数据查询的相关资料,需要的朋友可以参考借鉴,一起来看看吧。
收藏 0 赞 0 分享

MongoDB数据更新方法干货篇

之前给大家分享了MongoDB中数据查询的相关方法和技巧,那么下面这篇文章主要给大家介绍了MongoDB中数据更新方法的相关资料,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享
查看更多