def search_and_zsort(conn, query, id=None, ttl=300, update=1, vote=0,   
                    start=0, num=20, desc=True):                       

    # 尝试更新已有搜索结果的生存时间。
    if id and not conn.expire(id, ttl):    
        id = None                         

    # 如果传入的结果已经过期，
    # 或者这是函数第一次进行搜索，
    # 那么执行标准的集合搜索操作。
    if not id:                                      
        id = parse_and_search(conn, query, ttl=ttl) 

        scored_search = {
            # 函数在计算并集的时候也会用到传入的 ID 键，
            # 但这个键不会被用作排序权重（weight）。
            id: 0,                                  
            # 对文章评分进行调整以平衡更新时间和投票数量。
            # 根据待排序数据的需要，投票数量可以被调整为 1 、10 、100 ，甚至更高。
            'sort:update': update,                 
            'sort:votes': vote                      
        }
        # 使用代码清单 7-7 定义的辅助函数执行交集计算。
        id = zintersect(conn, scored_search, ttl)   

    pipeline = conn.pipeline(True)
    # 获取结果有序集合的大小。
    pipeline.zcard('idx:' + id)                                    
    #  从搜索结果里面取出一页（page）。
    if desc:                                                     
        pipeline.zrevrange('idx:' + id, start, start + num - 1)    
    else:                                                         
        pipeline.zrange('idx:' + id, start, start + 1 - num)      
    results = pipeline.execute()

    # 返回搜索结果，以及分页用的 ID 值。
    return results[0], results[1], id                             
# <end id="zset_scored_composite"/>


# 代码清单 7-7
# <start id="zset_helpers"/>
dataset/ETHPy150Open huangz1990/riacn-code/ch07_listing_source.py/search_and_zsort/swapped operands of `-`