def parse_and_search(conn, query, ttl=30):
    # 对查询语句进行分析。
    all, unwanted = parse(query)                                   
    # 如果查询语句只包含停止词，那么这次搜索没有任何结果。
    if not all:                                                    
        return None                                                

    to_intersect = []
    # 遍历各个同义词列表。
    for syn in all:                                                
        # 如果同义词列表包含的单词不止一个，那么执行并集计算。
        if len(syn) > 1:                                           
            to_intersect.append(union(conn, syn, ttl=ttl))         
        # 如果同义词列表只包含一个单词，那么直接使用这个单词。
        else:                                                       
            to_intersect.append(syn[0])                            

    # 如果单词（或者并集计算的结果）有不止一个，那么执行交集计算。
    if len(to_intersect) > 1:                                       
        intersect_result = intersect(conn, to_intersect, ttl=ttl)   
    # 如果单词（或者并集计算的结果）只有一个，那么将它用作交集计算的结果。
    else:                                                          
        intersect_result = to_intersect[0]                         

    # 如果用户给定了不需要的单词，
    # 那么从交集计算结果里面移除包含这些单词的文章，然后返回搜索结果。
    if unwanted:                                                   
        unwanted.insert(0, intersect_result)                       
        return difference(conn, unwanted, ttl=ttl)                 

    # 如果用户没有给定不需要的单词，那么直接返回交集计算的结果作为搜索的结果。
    return intersect_result                                        
# <end id="search-query"/>


# 代码清单 7-5
# <start id="sorted-searches"/>
# 用户可以通过可选的参数来传入已有的搜索结果、指定搜索结果的排序方式，并对结果进行分页。
dataset/ETHPy150Open huangz1990/riacn-code/ch07_listing_source.py/parse_and_search/original