MongoDB实现基于关键词的文章检索功能(C#版)
2016-04-18 00:00
781 查看
我的实现目标是:
可以通过一个或多个关键词搜索到文章。
可以通过文章的关键词列表查询到其相关文章。
查询到的结果依据相关程度降序排列。
查询速度要够快。(理论上关键词检索比全文检索要快很多的)
在网上找了一大圈,就没有一个靠谱的方法,基本都是只能传入单词来检索,而且基本都没有提供C#驱动版本的代码,于是乎自己研究出了这个实现方案:
首先要求使用标签、分词、关键词提取组件对文章对应的关键词进行提取,然后作为数组格式,存入文章的Keywords字段中。
核心检索代码:
注意:这里一定要用Aggregate()方法做聚合,而不是常用的Find()方法做查询,Find()方法后面跟Project()方法也不会改变方法链中操作的对象类型,这样后面的SortByDescending()方法的目标对象还是Article类,而不是Project()方法中定义的匿名类,而SortByDescending()方法中传入的表达式又仅允许用来选择对象属性,不允许进行任何计算,所以就根本无法实现我们的需求,我在发现Aggregate()方法之前就在这里一直卡着很久~
用作关键词搜索时一般就是把关键词传入就可以了,不过传回的结果也有可能压根没有匹配到任何关键词,所以最好在发给用户前再检查一遍项目的匹配程度,把没有任何匹配的结果滤掉。
用作相关文章搜索时,直接把原文章的Keywords属性值传入,获取数量要比你预计的数量多1,因为非常可能你的原文章就在获取到的列表中,而且是前列,获取后滤掉原文章的ID,再执行Take方法返回你需要数量的项目即可(执行Take方法是为了以防你的原文没出现在列表中,这概率极小但也是有的)。
为了增进查询效率,还可以预设好索引,代码如下:
所使用的C#官方驱动版本是:MongoDB.Driver.2.2.3
mongodb 添加用户及权限设置详解
详解mongodb 主从配置
mongodb 数据库操作--备份 还原 导出 导入
mongodb 命令行下及php中insert数据详解
MongoDB 使用Skip和limit分页
将MongoDB加入到Windows的本地服务项的方法
Node.js中使用mongoskin操作mongoDB实例
Windows下把MongoDB安装为系统服务的方法
MongoDB错误32-bit servers don''t have journaling enabled by default解决方法
可以通过一个或多个关键词搜索到文章。
可以通过文章的关键词列表查询到其相关文章。
查询到的结果依据相关程度降序排列。
查询速度要够快。(理论上关键词检索比全文检索要快很多的)
在网上找了一大圈,就没有一个靠谱的方法,基本都是只能传入单词来检索,而且基本都没有提供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
您可能感兴趣的文章:
PHP中MongoDB数据库的连接、添加、修改、查询、删除等操作实例mongodb 添加用户及权限设置详解
详解mongodb 主从配置
mongodb 数据库操作--备份 还原 导出 导入
mongodb 命令行下及php中insert数据详解
MongoDB 使用Skip和limit分页
将MongoDB加入到Windows的本地服务项的方法
Node.js中使用mongoskin操作mongoDB实例
Windows下把MongoDB安装为系统服务的方法
MongoDB错误32-bit servers don''t have journaling enabled by default解决方法
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 如何在 Fedora 上安装 MongoDB 服务器
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- 如何在 Ubuntu 上安装 MongoDB
- 信息安全聚合 Sec-News 的重构之路
- perl操作MongoDB报错undefined symbol: HeUTF8解决方法
- C#中使用1.7版本驱动操作MongoDB简单例子
- 使用zabbix监控mongodb的方法
- Node.js的MongoDB驱动Mongoose基本使用教程
- MongoDB系列教程(四):设置用户访问权限
- php检索或者复制远程文件的方法
- node.js连接mongoDB数据库 快速搭建自己的web服务
- php实现的mongodb操作类实例
- 解决mongodb在ubuntu下启动失败,提示couldn‘t remove fs lock errno:9 Bad file descriptor的错误
- 在PostgreSQL的基础上创建一个MongoDB的副本的教程
- 关于mongoose连接mongodb重复访问报错的解决办法
- java操作mongodb示例分享
- php对mongodb的扩展(初出茅庐)
- 作为PHP程序员应该了解MongoDB的五件事