单搜索框Web2py,联合使用

Posted

技术标签:

【中文标题】单搜索框Web2py,联合使用【英文标题】:Single search box Web2py, union usage 【发布时间】:2017-01-04 17:47:28 【问题描述】:

我正在尝试在我的网站上创建一个搜索框。 首先,我使用split() 将搜索输入拆分为多个字符串。 然后我循环使用split() 创建的多个字符串,每个字符串都创建一个查询。这些查询将存储在一个列表中。

在下一步中,我将尝试执行所有这些查询并将结果(行)存储在另一个列表中。

接下来我要做的是合并所有这些结果(行)。在这种情况下,最终结果将是包含在搜索框中使用的所有不同关键字的查询的输出。

这是我的代码:

def ajaxlivesearch():
    str = request.vars.values()[0]
    a=str.split()
    items = []
    q = []
    r =[]
    for partialstr in a:
        q.append((db.profiel.sport.like('%'+partialstr+'%'))|(db.profiel.speelsterkte.like('%'+partialstr+'%'))|(db.profiel.plaats.like('%'+partialstr+'%')))

   for query in q:
       r.append(db(query).select(groupby=db.profiel.id))

   for results in r:
       for (i,row) in enumerate(results):
           items.append(DIV(A(B(row.id_user.first_name) ,NBSP(1), B(row.id_user.last_name),BR(), I(row.sport),I(','), NBSP(1), I(row.speelsterkte),I(','), NBSP(1),I(row.plaats),HR(), _id="res%s"%i, _href=row.id_user, _onclick="copyToBox($('#res%s').html())"%i), _id="resultLiveSearch"))

    return TAG[''](*items)

我的问题是:如何合并多个结果(行)?

【问题讨论】:

【参考方案1】:

您可以通过以下方式获取union of two Rows objects(删除重复项):

rows_union = rows1 | rows2

但是,在单个查询中获取所有记录会更有效。为简化起见,您还可以使用.contains 方法,而不是使用.like 并用%s 包装每个术语。

fields = ['sport', 'speelsterkte', 'plaats']
query_terms = [db.profiel[f].contains(term) for f in fields for term in a]
query = reduce(lambda a, b: a | b, query_terms)
results = db(query).select()

另外,您没有使用任何聚合函数,因此不清楚为什么您指定了groupby 参数(并且在任何情况下,每条记录都有一个唯一的id,因此分组没有效果)。也许您的意思是orderby=db.profiel.id

最后,request.vars.values()[0] 可能不是一个好主意,因为request.vars 是一个类似字典的对象,并且不保证感兴趣的特定值是.values() 中的第一项。相反,只需引用特定变量的名称(例如,request.vars.keyword),这也更有效,因为您提取的是单个项目,而不是将所有值转换为列表。

【讨论】:

以上是关于单搜索框Web2py,联合使用的主要内容,如果未能解决你的问题,请参考以下文章

函数stripslashes去除转义 shopnc 搜索框过滤特殊字符 输入单斜杆会自动转义

从文本框中删除自动搜索并在搜索按钮上搜索

获取从单选按钮到组合框的数据搜索

如何在VBA中的用户窗体上使用组合框和文本框来搜索和查找活动Excel电子表格中的数据?

html这种怎么写?放大镜,还有搜索按钮都在文本框内。

html如何添加搜索框