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

我的实现目标是:

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

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

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

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

在网上找了一大圈,就没有一个靠谱的方法,基本都是只能传入单词来检索,而且基本都没有提供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 全文检索、mongodb 中文全文检索、mongodb 中文检索、mongodb 检索、mongodb3.2 全文检索,以便于您获取更多的相关知识。

时间: 2024-09-28 01:02:38

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

基于JavaScript实现类似于百度学术高级检索功能_javascript技巧

百度学术http://xueshu.baidu.com/高级检索是通过前台生成后台内部高级语法来实现高级检索的,可以通过前台js做字符串拼接传给后台实现,难度不大: 下面是高级检索的核心功能代码,我使用的是纯js实现,并未使用jquery: <p class="fl srh-btn"> <input type="submit" class="srh-submit" style="height:px" valu

从算法角度去了解关键词与文章的相关性

一般来说,一个词语或短语能否成为文章的关键词,主要取决于这个词语或短语反应文章中心思想能力的大小.关键词与文章之间的相关性,也主要是为了说明任选的一个词语和短语,对于指定的文章,它反应这篇文章的中心思想或主题意思的能力有多少.关键词的抽取受到词语在文章中出现的位置,出现的频率以及词语的语义特征的影响.那么,搜索引擎到底是如何判断关键词和文章之间的相关性呢?在这里,笔者从自己的一些观点出发,产生了一些想法,应该抛砖引玉,得到大家的指点.个人认为,搜索引擎应该是从以下几步来如何分析关键词和文章性的:

利用ASP技术开发基于WWW的数据库检索程序

程序|数据|数据库  ASP是微软公司推出的用以取代CGI的新技术,是目前公认的建立Windows NT动态站点最好的工具.它与ADO(Active Data Object,一种新的数据访问模型)的充分结合,提供了强大的数据库访问功能,使之成为进行网上数据库管理的重要手段.     一.ASP简介   ASP内含于Internet Information Server(简称IIS3.0)中,扩展名以.asp表示.ASP文件可以用常规的文本编辑器编辑,也可以利用专门的辅助开发工具InterDev进

百度指数关键词数据累加检索怎么用

  在多个关键词当中,利用加号将不同的关键词相连接,可以实现不同关键词数据相加.相加后的汇总数据作为一个组合关键词展现出来.例如,您可以检索"百度+百度搜索".利用这个功能,您可以将若干同义词的数据相加.目前,百度指数最多支持5个关键词的累加检索.

iOS 10支持图片搜索?带你认识下安防领域的检索功能!

9月14日凌晨,比iPhone 7先来到的是苹果系统iOS 10的更新推送.根据苹果官方介绍,iOS 10 是 iOS发布史上的重磅之作,所以在功能上做了非常大的更新.其中,关于"照片"的更新引起了小编的注意: "照片"的更新 1.运用深度学习技术设计先进的人脸识别功能,可自动将相似的面孔分组 2.通过物体和场景的识别功能,使用先进的计算机视觉来扫描设备上的本地图库,可以通过照片内容智能搜索照片 3.通过"地点"相簿可在地图上查看您的所有照片.视

PHP简单实现“相关文章推荐”功能的方法_php技巧

通常在做内容网站的时候,需要在每一篇文章中出现与该文章相关的文章列表.对于大多数人来说,使用的方法通常是:建立一个关键词列表,判断每篇文章包含有那些关键词,最后根据关键词找出与某篇文章最相关的文章.对于内容比较复杂的网站,确定关键列表词显然会比较麻烦. 本文介绍了与以往方法不同的similar_text(php4,php5)函数来方便的达到我们的预期要求.具体的思路是:从文章列表中取出所有的文章标题,将所有的文章标题都同当前标题对比,将对比结果生成一个数组,按照相似度的大小由大到标题,利用sim

微信小程序实现博客园文章阅读功能

在微信小程序开发中,我们可以根据不同的业务场景,开发不同的业务应用,可以基于自身域名服务接口,也可以基于第三方的域名接口进行处理(如果被禁用除外),本篇随笔介绍使用小程序来实现我博客(http://wuhuacong.cnblogs.com)的文章阅读功能,这个小程序主要用来介绍使用介绍基于Javascript的正则表达式的处理应用,和常规在C#里面使用正则表达式有一些差异,因此可以作为后续使用正则表达式处理业务数据的一个练兵吧. 1.Request接口合法域名配置 一般情况下,我们知道微信的R

长尾关键词挖掘技巧五:如何根据关键词写文章

大家好,我是虚子雨.前面我给大家写了四篇关于长尾词挖掘技巧的文章,分别是<长尾关键词挖掘技巧一:弄清楚四个问题>< 长尾关键词挖掘技巧二:做到三个方面><长尾关键词挖掘机巧三:分析用户心理><长尾关键词挖掘技巧四:挖掘的具体工作>,在这四篇文章中我介绍的都是关于长尾词具体的该怎样去挖掘,很多朋友看过之后觉得很不错,很多人都跟我做了一定的交流,也有人要求我写今天的这个主题.其实在做这个系列之前我就想好了在这个系列之中一定要写一些关于如何根据关键词写文章的经验和

微信公众号已经开通文章评论功能

摘要: 根据微信公众平台官方给 36氪 的通知,微信公众号已经开通文章评论功能,开通微信认证的公众号可以申请,然后在微信后台添加该功能模块后即可显示用户评论. 值得注意的是,公 根据微信公众平台官方给36氪的通知,微信公众号已经开通文章评论功能,开通微信认证的公众号可以申请,然后在微信后台添加该功能模块后即可显示用户评论. 值得注意的是,公众号的文章默认是不开启评论的,发布之前选择开启评论才能评论.而且运营者可以选择精选评论,公众帐号文章只显示被运营者放入精选的评论.看来微信对于灌水.恶意评论等