美文网首页
检索相似帖子

检索相似帖子

作者: gznb | 来源:发表于2020-08-08 08:57 被阅读0次

检索相似帖子

现在你已经为博客 帖子 实现了标签,你可以通过标签做许多有趣的事情。标签允许你以非分层的方式分类帖子。类似主题的帖子会有几个相同的标签。你将创建一个功能,通过共享标签的数量显示帖子。使用这个方法,在用户阅读帖子的时候,你可以建议它们去读一读其他相关的帖子。

为了从一个特定的帖子检索相似的帖子,你需要完成下面步骤:

  1. 从当前的帖子中检索到所有的标签。
  2. 从这些标签中得到所有的帖子。
  3. 将当前的帖子从帖子列表中剔除,以免出现重复推荐。
  4. 通过和当前帖子共享的标签数量排序这些帖子。
  5. 如果有两个或两个以上的帖子的标签数量相同,就推荐最近的帖子。(译者注:这个“最近”,是指发布时间。也就是先按相同帖子数量排序,然后再按发布时间排序。)
  6. 将查询限制为想要推荐的数量。

这些步骤将翻译成一个复杂的查询集,它将被包含在你的 post_detail 视图中。在你的 blog 应用程序的 views.py 加新的一行,并且在顶端添加下面这行:
from django.db.models import Count

这是 Django ORM 的 Count 聚合函数,此函数允许您执行标记的聚合计数。django.db.models 包含下面这些聚合函数:

  • Avg : 平均数
  • Max :最大数
  • Min : 最小数
  • Count :对象的总数

你可以在这个链接中学习到更多有关聚合的知识.

post_detail 视图里面的 render() 函数之前添加下面这些行,具有相同的缩进水平:

    post_tags_ids = post.tags.values_list('id', flat=True)
    similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
    similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags', '-publish')[:4]

上述代码如下:

  1. 检索当前文章 标签的 的 ID 的Python列表。values_list() 查询集为给定字段返回带有值的元组。你通过 flat=True 去得到一个值例如 [1, 2, 3, ....] 而不是一个 例如 [(1, ), (2, ), (3, )...] 的单元组列表。
  2. 您将获得包含任何这些标签的所有帖子,不包括当前帖子它自己。
  3. 你使用 Count 聚合函数去生成一个 可计算字段 same_tags,包含与所有查询的标签共享的标签的数量。
  4. 你通过共享标签数量排序结果(递减序), 并且通过 publish 去显示最近的帖子,首先是根据共享的标签数量。对结果进行前片,仅仅只要前四个。

添加 similar_posts 对象到 render() 功能的上下文字典中,如下:

    return render(request,
                  'blog/post/detail.html',
                  {'post': post,
                    'comments': comments,
                    'new_comment': new_comment,
                    'comment_form': comment_form,
                    'similar_posts': similar_posts})

现在,编辑 blog/post/detail.html 模板,并且在 帖子评论列表添加下面的代码:

    <h2>Similar posts</h2>
    {% for post in similar_posts %}
        <p>
            <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
        </p>
    {% empty %}
        There are no similar posts yet.
    {% endfor %}

这个帖子详情页面看起来如下所示:

Snipaste_2020-08-03_14-13-32.jpg

您现在可以成功地向您的用户推荐类似的文章。 django-taggit 也包含了一个 similar_objects() 管理器,你可以使用它通过共享标签检索对象,你能在 django-taggit 得到更多管理器知识。

你也可以在 帖子 详情模板中添加 标签列表,就像你在 blog/post/list.html 模板中添加一样。

相关文章

  • 检索相似帖子

    检索相似帖子 现在你已经为博客 帖子 实现了标签,你可以通过标签做许多有趣的事情。标签允许你以非分层的方式分类帖子...

  • 机器学习入门(六) — 聚类和相似度模型

    1 聚类和相似度-文档检索 2 检索感兴趣的文档 文件检索 挑战 3 用于测量相似度的单词计数表示 测量相似度 单...

  • 20210403-Pubchem-figerprint

    最常见的化学相似性检索方法有二维结构相似性和三维分子相似性检索。二维结构检索主要是采用分子指纹方法生成的描述符,分...

  • es基本检索

    More_like_this 文本相似检索 属性介绍

  • Lucene学习笔记

    概要: 全文检索的原理和基本概念(铺垫) Lucene简介,索引文档和检索文档的过程(主要) Lucene 相似度...

  • 中文信息学报关于相似度计算的文献检索

    本文检索了从2010年到2016年《中文信息学报》关于相似度计算的文献,主要是词语相似度,也包括句子相似度。下面对...

  • Approximate Nearest Neighbor搜索

    典型场景:图像检索。高维检索。 本质: 很多稠密向量,要迅速找到某个点的临近点,并认为这是相似度最高的点。 原始数...

  • 图像检索(一):因缘际会与前瞻

    之前因为学习Keras的缘故,看到一个图像检索的Demo,代码实现了输入一张查询照片,检索出最相似的n张照片的效果...

  • 路径的重要性

    最近检索资料,感觉到了检索效率的重要性,如果搜索的路径不对,花大量的时间却没有相应的效果。其实很多事情也是相似的,...

  • 图像搜索和分类

    基于内容的搜索 检索在视觉上具有相似性的图像,在图像数据库中返回具相似颜色、纹理和物体以及场景的图像。 视觉单词 ...

网友评论

      本文标题:检索相似帖子

      本文链接:https://www.haomeiwen.com/subject/vmsykktx.html