【django】京东等大型网站的混合搜索是怎么实现的?

news/2024/5/8 15:48:58/文章来源:https://blog.csdn.net/chuange6363/article/details/100752279

混合搜索在各大网站如京东、淘宝都有应用,他们的原理都是什么呢?本博文将为你介绍它们的实现过程。

混合搜索的原理,用一句话来说就是:关键字id进行拼接。

混合搜索示例:

数据库设计:

视频方向:

class Direction(models.Model):weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)name = models.CharField(verbose_name='名称', max_length=32)classification = models.ManyToManyField('Classification')class Meta:db_table = 'Direction'verbose_name_plural = u'方向(视频方向)'def __str__(self):return self.name

 视频分类:

class Classification(models.Model):weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)name = models.CharField(verbose_name='名称', max_length=32)class Meta:db_table = 'Classification'verbose_name_plural = u'分类(视频分类)'def __str__(self):return self.name

  视频:

class Video(models.Model):status_choice = ((0, u'下线'),(1, u'上线'),)level_choice = ((1, u'初级'),(2, u'中级'),(3, u'高级'),)status = models.IntegerField(verbose_name='状态', choices=status_choice, default=1)#可用于管理员的审核level = models.IntegerField(verbose_name='级别', choices=level_choice, default=1)classification = models.ForeignKey('Classification', null=True, blank=True)weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)title = models.CharField(verbose_name='标题', max_length=32)summary = models.CharField(verbose_name='简介', max_length=32)img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')href = models.CharField(verbose_name='视频地址', max_length=256)create_date = models.DateTimeField(auto_now_add=True)class Meta:db_table = 'Video'verbose_name_plural = u'视频'def __str__(self):return self.title

  备注:

  • 视频方向Direction类和视频分类Classification多对多关系,即一个视频方向对应多个视频分类,一个视频分类也可以对应多个视频方向。——classification = models.ManyToManyField('Classification')
  • 视频分类Classification类和视频Video类是一对多关系,即一个视频分类对应多个视频
  • 视频Video类中level_choice 与视频也是一对多关系,这里为了简化表关系,直接使用choices=level_choice来代替

混合搜索url设计:

默认url:

 

http://127.0.0.1:8000/video-0-0-0.html,其中第一个数字代表视频方向,默认0代表全部方向;第二个数字代表视频分类,默认0代表全部分类;第三个数字代表视频等级,默认0代表全部等级。

每一个a标签默认的url:

  例如运维自动化:<a href="/video-1-0-0.html">运维自动化</a>,即视频方向的对应数字为1,视频分类和视频等级都为0,这样做的目的是为了将此url和用户当前url进行拼接,并跳转到新的url。

  选择运维自动化后的url:

  多选情况下的url:

前端html:

加载自定义simple_tag:

{% load xx %}

  注:

  • xx:名为xx的py文件,里面包含自定义函数,方便html中进行调用
  • 在app中创建templatetags文件夹,将xx.py文件放在templatetags文件夹下

关于自定义simple_tag的更多信息,详见下文。

css:

<style>a{display: inline-block;padding: 8px;}.active{background-color: coral;color: white;}.item{display: inline-block;width: 300px;height: 400px;}.item img{border: 0;width: 300px;height: 280px;overflow: hidden;}</style>
css代码

设置css目的,当用户选择视频方向、视频分类、视频等级时,加深对应a标签。

选择区域html:

<h3>选择:</h3><div>{% action_all current_url 1 %} :{% for item in direction_list %}{% action current_url item 1 %}{% endfor %}</div><div>{% action_all current_url 2 %} :{% for item in class_list %}{% action current_url item 2 %}{% endfor %}</div><div>{% action_all current_url 3 %} :{% for item in level_list %}{% action current_url item 3 %}{% endfor %}</div><hr />

  该区域全部基于自定义simple_tag实现,详见下文。

视频显示区域html:

<h3>视频:</h3><hr />{% for item in video_list %}<a class="item" href="{{ item.href }}"><img src="/{{ item.img }}"><p>{{ item.title }}</p><p>{{ item.summary }}</p></a>{% endfor %}

  循环显示符合条件的全部视频。

自定义simple_tag:

全部标签的生成:

我们希望,当用户选择全部标签时,url对应位置为0,即当用户三个选择都是全部时,url为:/video-0-0-0.html

以视频方向为例介绍:

对应位置html:

{% action_all current_url 1 %} :

  从上述html可看出,action_all为对应的函数,它接收两个参数:当前url(current_url)、当前位置(视频方向、视频分类、视频等级)。其中current_url是后台传入html的,详见下文后台views函数介绍。

action_all函数:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django import template  
from django.utils.safestring import mark_safe@register.simple_tag  #注册simple_tag
def action_all(current_url,index):   #接收当前url和对应的位置参数"""获取当前url,video-1-1-2.html:param current_url::param item::return:"""url_part_list = current_url.split('-')   #根据“-”进行分割if index == 3:  #如果是视频等级if url_part_list[index] == "0.html":  #如果选择的是全部temp = "<a href='%s' class='active'>全部</a>"   #添加 “active”属性else:temp = "<a href='%s'>全部</a>"url_part_list[index] = "0.html"else:if url_part_list[index] == "0":  temp = "<a href='%s' class='active'>全部</a>"else:temp = "<a href='%s'>全部</a>"url_part_list[index] = "0"href = '-'.join(url_part_list)  #处理后的列表再拼接成url字符串temp = temp % (href,)  #生成对应的a标签return mark_safe(temp)  #返回原生html

 其它a标签:

  以视频方向为例介绍:

 对应位置html:

{% action current_url item 1 %}

从上述html可看出:action函数接收三个参数 当前url、当前标签对象、当前位置。

  action函数:

@register.simple_tag
def action(current_url, item,index):# videos-0-0-1.html# item: id name# video-   2   -0-0.htmlurl_part_list = current_url.split('-')if index == 3:if str(item['id']) == url_part_list[3].split('.')[0]:  #如果当前标签被选中temp = "<a href='%s' class='active'>%s</a>"else:temp = "<a href='%s'>%s</a>"url_part_list[index] = str(item['id']) + '.html' #拼接对应位置的部分urlelse:if str(item['id']) == url_part_list[index]:temp = "<a href='%s' class='active'>%s</a>"else:temp = "<a href='%s'>%s</a>"url_part_list[index] = str(item['id'])ur_str = '-'.join(url_part_list)  #拼接整体urltemp = temp %(ur_str, item['name']) #生成对应的a标签return mark_safe(temp)  #返回安全的html

  至此,所有选择标签生成完毕,能够根据用户选择动态生成url。

视频显示区域的前后端处理:

前端html:

{% for item in video_list %}<a class="item" href="{{ item.href }}"><img src="/{{ item.img }}"><p>{{ item.title }}</p><p>{{ item.summary }}</p></a>{% endfor %}

  循环显示所有符合条件的视频。

后端views函数:

def video(request,*args,**kwargs):print(kwargs)print(request.path)request_path = request.path  #当前请求的路径q = {}  #从数据库获取视频时的filter条件字典q['status'] = 1 #状态为审核通过的class_id = int(kwargs.get('classification_id')) #获取url中的视频分类iddirection_list = models.Direction.objects.all().values('id','name') #从数据库中获取所有的视频方向(包括视频方向的id和name)if kwargs.get('direction_id') == '0': # 方向选择全部print('方向等于0')class_list = models.Classification.objects.all().values('id', 'name') #方向id=0,即获取所有的视频分类(包括视频分类的id和name)if kwargs.get('classification_id') == '0': #如果视频分类id也为0,即全部分类passelse:# 如果视频分类不是全部,过滤条件为视频分类id in [url中的视频分类id]q['classification_id__in'] = [class_id,] else:print('方向不为0')# 方向选择某一个方向,# 如果分类是0if kwargs.get('classification_id') == '0':print('分类为0')obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))  #获取已选择的视频方向class_list = obj.classification.all().values('id', 'name')  #获取该方向的所有视频分类id_list = list(map(lambda x: x['id'], class_list)) #获取所有视频分类对应的视频分类idq['classification_id__in'] = id_list #过滤条件为视频分类id in [该方向下的所有视频分类id]else:
#方向不为0,分类也不为0obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))class_list = obj.classification.all().values('id', 'name')id_list = list(map(lambda x:x['id'], class_list))q['classification_id__in'] = [class_id,] #过滤条件为视频分类id in [已经选择的视频分类id]print('分类不为0')# 当前分类如果在获取的所有分类中,则方向下的所有相关分类显示# 当前分类如果不在获取的所有分类中,if int(kwargs.get('classification_id')) in id_list:passelse:print('不再,获取指定方向下的所有分类:选中的回到全部')url_part_list = request_path.split('-')url_part_list[2] = '0'request_path = '-'.join(url_part_list)level_id = int(kwargs.get('level_id')) #视频等级idif level_id == 0:passelse:q['level'] = level_id #过滤条件增加视频等级# models.Video.objects.filter(status=1)video_list = models.Video.objects.filter(**q).values('title','summary', 'img', 'href')# level_list = models.Video.level_choiceret = map(lambda x:{"id": x[0], 'name': x[1]}, models.Video.level_choice)#把视频等级转化为单个标签是字典格式,整体是列表格式level_list = list(ret)return render(request, 'video.html', {'direction_list': direction_list,'class_list': class_list,'level_list': level_list,'current_url': request_path,"video_list": video_list})

  总结:以上就是混合搜索的前后端全过程,欢迎读者来与楼主进行交流。如果本文对您有参考价值,欢迎帮博主点下文章下方的推荐,谢谢!

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3579120/blog/1507594

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_752452.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【django】京东等大型网站的混合搜索是怎么实现的?

混合搜索在各大网站如京东、淘宝都有应用&#xff0c;他们的原理都是什么呢?本博文将为你介绍它们的实现过程。 混合搜索的原理&#xff0c;用一句话来说就是&#xff1a;关键字id进行拼接。 混合搜索示例&#xff1a; 数据库设计&#xff1a; 视频方向&#xff1a; class Dir…

c++builder 运行网站的api_.NET Core 微服务:Ocelot的API网关实现

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;另一个老李cnblogs.com/SteveLee/p/Ocelot_Api_http_and_https.html微服务架构什么是网关&#xff1f;通过DotNetty构建的远程RPC框架《.NET跨平台RPC框架DotNettyRPC》&#xff0c;已经实现了远程客户端的调用&#…

国内图片网站Yupoo的架构

之前向大家介绍过全球最大在线图片服务网站Flickr网站架构&#xff0c;Yupoo&#xff08;又拍网&#xff09;作为国内最大的图片服务提供商&#xff0c;我们也一起来看看它的架构&#xff0c;同样是提供图片服务&#xff0c;看看他与Flickr的差别在哪里&#xff0c;大家看完本文…

LOL钓鱼网站实战渗透

点击上方蓝字关注我们相信很多人都有遇到过这样的经历&#xff0c;无意中点到一些钓鱼网站&#xff0c;然后就泄露了自身信息&#xff0c;造成了一定的损失&#xff0c;对于这样的网站各位需警惕&#xff0c;千万不要乱点击来历不明的网站。今天我就来说说钓鱼网站的事&#xf…

查看网站所有会话_PHP-会话控制

会话控制因为 HTTP 是无状态的协议&#xff0c;没有办法记录多个事务请求间的状态。即访问一个页面请求后再请求另一个页面时无法判断两次请求来自同一下用户。会话原理在PHP中实现会话的原理是为用户分配一个唯一的加密ID&#xff0c;并保存在用户客户端&#xff0c;并在整个会…

网站URL网址末尾是否应该使用反斜杠

2019独角兽企业重金招聘Python工程师标准>>> 当对网站进行SEO优化时&#xff0c;难免会遇到因为URL导致的重复页面问题&#xff0c;其中一个比较常见的现象就是因页面地址后是否有添加反斜杠造成的&#xff0c;举例如下&#xff1a; 链接A&#xff1a; www.example.…

Redis网站热搜关键词加载实践,建议收藏

侠梦的开发笔记回复【面试题】获取2021年最新java面试题合集&#xff5e;来源&#xff1a;Catcher8www.cnblogs.com/catcher1994/p/5877262.html对于一个网站来说&#xff0c;无论是商城网站还是门户网站&#xff0c;搜索框都是有一个比较重要的地位&#xff0c;它的存在可以说…

一例千万级pv高性能高并发网站架构

2019独角兽企业重金招聘Python工程师标准>>> 受CU管理员的邀请参考“千万级pv高性能高并发网站架构与设计交流探讨帖”主题的交流&#xff0c;发表了一案例与大家分享。 一个支撑千万级PV的网站是非常考验一个架构是否成熟、健壮(本文不涉及软件架构的层面&am…

黑科技Python轻松爬取网站信息,看完我是佩服得五体投地!

1. 引言 本文主要介绍如何使用Scrapy结合PhantomJS采集天猫商品内容&#xff0c;文中自定义了一个DOWNLOADER_MIDDLEWARES&#xff0c;用来采集需要加载js的动态网页内容。看了很多介绍DOWNLOADER_MIDDLEWARES资料&#xff0c;总结来说就是使用简单&#xff0c;但会阻塞框架&a…

牛掰!10年python爬虫经验开发的案例让你搞定全球80%以上的网站

项目要求&#xff1a; 用户入口 1、商品信息存在文件里 2、已购商品&#xff0c;余额记录。 商家入口 可以添加商品&#xff0c;修改商品价格 商家入口&#xff1a; # Author:P J Jimport osps 1 >>>>>> 修改商品 2 >>>>>> 添加商…

快就完事了!10分钟用python爬取网站视频和图片

话不多说&#xff0c;直接开讲&#xff01;教你如何用Python爬虫爬取各大网站视频和图片。 网站分析&#xff1a; 我们点视频按钮 可以看到url是&#xff1a; http://www.budejie.com/video/ 接着我们点开网页源码&#xff0c;看下面之处 接着我们把那个下面画红线的链接点开…

Python监控术,看看你的男女朋友究竟在逛些什么网站!

需求&#xff1a; (1) 获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间&#xff0c;并存在一个txt文件中 (2)将这个txt文件发送给指定的邮箱地址(你的邮箱) (3)建立例行任务&#xff0c;每天定时自动完成这些操作&#xff0c;你就可以通过邮件查看你对象每天看…

转帖一下《深入理解Nginx》在线支持网站的勘误,访问太慢了

2019独角兽企业重金招聘Python工程师标准>>> 《深入理解Nginx》在线支持网站 勘误公布 示例源码 答疑解惑 作者博客 微博互动 在线支持网站更改为&#xff1a;http://nginx.taohui.org.cn请大家访问新的站点&#xff0c;谢谢。 勘误公布 由于编写匆忙&#x…

一般网站有哪些常见漏洞?

Web应用是指采用B/S架构、通过HTTP/HTTPS协议提供服务的统称。随着互联网的广泛使用&#xff0c;Web应用已经融入到日常生活中的各个方面&#xff1a;网上购物、网络银行应用、证券股票交易、政府行政审批等等。在这些Web访问中&#xff0c;大多数应用不是静态的网页浏览&#…

每次Nginx 配置都浪费在了查资料上!来看看这个(在线配置网站)

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 服务&#xff0c;其因丰富的功能集、稳定性、示例配置文件和低系统资源的消耗受到了开发者的欢迎。本文&#xff0c;我们总结了一些常用的 Nginx 配置代码&#xff0c;希望对大家有所…

tableau指标预警_如何使用Tableau分析敏捷,开发和网站指标

tableau指标预警开发人员在设计&#xff0c;开发&#xff0c;测试&#xff0c;部署和管理应用程序时使用了许多生产力&#xff0c;编码&#xff0c;测试和云管理工具。 尽管大多数工具都提供报告和分析功能&#xff0c;但技术团队可能有充分的理由开发自己的报告功能&#xff0…

有什么网站下载 消防编程软件_8个无套路下载软件的网站推荐给你

我曾经在一个朋友的电脑上看到过市面上的所有浏览器&#xff0c;我问他是做网页开发吗&#xff1f;他说他也不知道自己电脑怎么就莫名其妙安装了这么多浏览器。 效率君想了想&#xff0c;应该是这个原因。 先讲个我自己的经历吧。 前两天效率君想把Ps升级到2020&#xff0c;在百…

网站上线之前,基于SEO,该做哪些测试?

对于任何一个网站而言&#xff0c;在新站上线之初&#xff0c;每个SEO人员&#xff0c;都需要进行缜密的测试&#xff0c;用于辅助网站正式上线后&#xff0c;可以在搜索引擎中&#xff0c;有一个不错的排名。那么&#xff0c;新网站测试&#xff0c;都需要注意什么&#xff1f…

网站爬取工具

有时候需要将网站资源爬取到本地&#xff0c;文件少的情况下可以使用Chrome一个个保存。如果文件太多&#xff0c;则需要使用下面的辅助工具。 1.Teleport Ultra(不是Teleport Pro) 优点&#xff1a;爬取文件以及结构比较完整&#xff1b; 缺点&#xff1a;会修改原文件。会在j…

达内网站的标签翻页功能,模仿代码

参考网址&#xff1a;http://xm.tedu.cn/baidu/dnpp/?xmjavaqzs20170524fzct023&utm_term达内培训&ca_kid65421413813&ca_cv17282834319 【代码】 HTML&#xff1a; <div class"banner-wrap"><div class"container"><div clas…