flask的使用:先搜索,再点击按钮,使搜索结果按时间或相关度排序

前段时间做搭建网站的大作业时,我们需要实现对返回的结果按时间或相关度排序的功能。当然,如果是在搜索前就已经知道要按什么排序,实现起来是简单的;但我们想实现的是在输入关键词搜索并返回了搜索结果后,再点击“按xx排序”这样一个按钮,对该关键词搜索返回的结果进行排序。

首先交代一下背景,我们使用的是flask框架搭建的网站,并使用了lucene进行索引,jieba分词库+WhitespaceAnalyzer分词器进行分词。下面是我们导入的所有库(torch那部分是用来实现图搜图功能的,和这部分功能没有关系,可以忽视)

import torch
import torchvision.transforms as transforms
from torchvision.datasets.folder import default_loader
import json
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from flask import Flask, redirect, render_template, request, url_for
import sys, os, lucene,re
import numpy as np
from java.io import File
from java.nio.file import Path
from org.apache.lucene.analysis.core import WhitespaceAnalyzer
from org.apache.lucene.index import DirectoryReader
from org.apache.lucene.queryparser.classic import QueryParser
from org.apache.lucene.store import SimpleFSDirectory
from org.apache.lucene.search import IndexSearcher
from org.apache.lucene.util import Version
from org.apache.lucene.search import BooleanQuery
from org.apache.lucene.search import BooleanClause
import jieba

索引中,每一个doc的所有Field和Field的名字如下表所示,其中只有content和src用了分词,然后除了src,其他都用了储存(src只分词不储存是出于图片搜图的需要设定的,和这个功能没有什么关系,仅作交代)。可以输出看一眼返回的格式(content里的所有分词内容我只取了搜索的关键词的前五个和后五个,即其前后文;然后time_form是time经过格式处理后的内容)。

想要实现显式化地进行排序,我们先实现从搜索框输入关键词和排序信息实现的排序。即我们输入 “关键词 time:d” 实现时间降序排序;输入 “关键词 time:i” 实现时间升序排序。

我们在后端提取用户输入内容的代码如下:

command=request.args.get('keyword')

我们对keyword进行处理的代码如下:

def parseCommand(command): # command 是一个字符串,形式为“(content:)关键词( time:d)”  ()指可有可无
    allowed_opt = ['time'] # 允许的key值
    command_dict = {'content':'','time':''} 
    opt = 'content' # 默认的key值
    for i in command.split(' '):
        if ':' in i:
            opt, value = i.split(':')[:2]
            opt = opt.lower()
            if opt in allowed_opt and value != '':
                command_dict[opt] = command_dict.get(opt, '') + ' ' + value
                command_dict[opt]=command_dict[opt].strip()
        else:
            command_dict[opt] = command_dict.get(opt, '') + ' ' + i
            command_dict[opt]=command_dict[opt].strip()
    content=command_dict['content']
    seg_list = jieba.cut(content, cut_all=False) # jieba分词
    command_dict['content']=' '.join(seg_list)
    print(command_dict)
    return command_dict

下面看几个输入和该函数输出的结果:(南极、南极 time:d、南极企鹅)

 我们在索引中用键值content的内容进行搜索,得到返回的每一个结果term组成的一个列表term_all,每个term的组成如下图所示:

接着我们使用list的sort函数对term的time属性进行排序,代码如下:

def sort_time(date):
    return date['time']

# 对返回的搜索结果按时间降序排列
if time=='d': # 这里之前还有一步处理,就是time的值取的是{'content':'xx','time':''}中键值time的内容。
    term_all.sort(key=sort_time,reverse=True)
# 对返回的搜索结果按时间降序排列
if time=='i':
    term_all.sort(key=sort_time)

 这样处理后的time_all就是把返回的网页排序好的结果。接着我们将处理好的搜索结果传入搜索结果页的代码如下:

keyword=parsecommand(command)['content']
# term_all是排序后的搜索结果;em是关键词列表(不重要)
return render_template("result.html",term_all=term_all,keyword=keyword,em=em)

总结来讲,如果输入“关键词”,那就是按相关度降序;如果输入“关键词 time:d”,那就是按时间降序;如果输入“关键词 time:i”,那就是按时间升序(这个总结比较重要)。

接下来,我们利用输入的不同形式这个特点,从html书写上实现显式化的排序。以下是能实现点击后进行重新排序的按钮button写法。

<form action="result" method="get">
    <button class="button button-primary button-block button-shadow" style="font-size: 12px;width: 100px;height: 30px;line-height: 5px;" name="keyword" type="submit" value="{{keyword}} time:d">时间降序</button>
</form>
<form action="result" method="get">
    <button class="button button-primary button-block button-shadow" style="font-size: 12px;width: 100px;height: 30px;line-height: 5px;" name="keyword" type="submit" value="{{keyword}} time:i">时间升序</button>
</form>
<form action="result" method="get">
    <button class="button button-primary button-block button-shadow" style="font-size: 12px;width: 100px;height: 30px;line-height: 5px;" name="keyword" type="submit" value="{{keyword}}">相关度降序</button>
</form>

可以看到实际上这里是用一个name="keyword",type="submit",value="{{keyword}} time:d"的button进行再传值,即点击该button后,我们相当于再进行了一次搜索,本质上还是先得知排序方式,再进行搜索,但在用户端看来,便是可视化的一种排序:他可以先输入关键词,然后点击按钮进行排序。其中这种排序是双向的,即你可以先点击按钮按时间降序、再点击按钮回到相关度降序。(注意加粗部分是实现这种再传值的关键)

下面是效果展示:

用户输入“英国”点击搜索:

点击 时间降序 按钮:

再点击 相关度降序排列 按钮,回到第一个图片所示的排序。 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值