• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MongoDB实现基于关键词的文章检索功能(C#版)

    我的实现目标是:

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

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

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

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

    在网上找了一大圈,就没有一个靠谱的方法,基本都是只能传入单词来检索,而且基本都没有提供C#驱动版本的代码,于是乎自己研究出了这个实现方案:

    首先要求使用标签、分词、关键词提取组件对文章对应的关键词进行提取,然后作为数组格式,存入文章的Keywords字段中。

    核心检索代码:

    /// summary>
    /// 根据关键词获取文章编号与标题映射。
    /// 注意:此方法会返回最为匹配的若干个项目,并根据匹配程度降序排列,即使是没有任何关键词匹配项,也会返回若干个结果的。
    /// 另需注意:如果是根据文章关键词来查询,一般来说其中一定包含原文章,所以应该把期望获得的数量加1,并在结果中移除原文。
    /// /summary>
    /// param name="limitNum">数量上限/param>
    /// param name="keywords">关键词集合/param>
    /// returns>文章编号与标题映射字典/returns>
    public async TaskDictionaryGuid, string>> GetArticleDicByKeywordsAsync(int limitNum, IEnumerablestring> keywords)
    {
    var list =
    await
    Database.GetCollectionDomain.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.GetCollectionDomain.Entity.Article>("Article");
    c.Indexes.DropAll();
    await c.Indexes.CreateOneAsync(
    BuildersDomain.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

    您可能感兴趣的文章:
    • C#简单操作MongoDB的步骤全纪录
    • C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结
    • Mongodb在CSharp里实现Aggregate实例
    • C#中使用1.7版本驱动操作MongoDB简单例子
    • MongoDB入门教程之C#驱动操作实例
    • C# 对MongoDB 进行增删改查的简单操作实例
    • 关于C#生成MongoDB中ObjectId的实现方法
    • C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
    上一篇:MongoDB分片测试
    下一篇:Mongodb聚合函数count、distinct、group如何实现数据聚合操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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