2016-08-28 4 views
0

내 웹 사이트에 단일 검색 상자를 만들려고합니다. 먼저 split()을 사용하여 검색 입력을 여러 문자열로 분리합니다. 그런 다음 쿼리를 생성하는 모든 문자열과 함께 split()으로 만든 여러 문자열을 반복합니다. 이 쿼리는 목록에 저장됩니다.단일 검색 상자 Web2py, 공용어 사용

다음 단계에서 모든 쿼리를 실행하고 결과 (행)를 다른 목록에 저장하려고합니다.

내가하고 싶은 다음 작업은 이러한 모든 결과 (행)입니다. 이 경우 최종 결과는 검색 창에 사용 된 모든 다른 키워드를 포함하는 검색어의 결과가됩니다.

이 내 코드입니다 :

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 

그러나, 단일 쿼리의 모든 레코드를 취득하는 것이 더 효율적이 될 것입니다. 단순화하기 위해 .like을 사용하지 않고 각 용어를 % 초로 묶는 대신 .contains 방법을 사용할 수도 있습니다. (그래서 아무런 효과가 없을 것 그룹화하고, 어떤 경우에, 각 레코드는 고유 id있다)

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 인수를 지정한 이유는 명확하지 않다. 아마도 orderby=db.profiel.id을 의미했을 것입니다.

request.vars은 사전 형 객체이므로 관심있는 특정 값이 .values()의 첫 번째 항목이 아니므로 마지막으로 request.vars.values()[0]을 수행하는 것은 좋지 않습니다. 그 대신 특정 변수의 이름 (예 : request.vars.keyword)을 참조하십시오. 모든 값을 목록으로 변환하는 대신 하나의 항목 만 추출하므로 더 효율적입니다.