2013-01-11 2 views
1

내 프로젝트 중 하나에서 django-haystack v2.0.0pyelasticsearch v0.3을 실행 중입니다. 나는 SearchView이 목록 템플릿을 렌더링하고 결과 필터링을 통합하려고합니다. 검색은 정상적으로 실행되지만 사용중인 필터가 전혀 작동하지 않습니다. 나는 다음과 같은 필터 __contains, __lte, __gte하지만 그들 중 누구도 결과 목록에 차이를 만들 것 같다을 사용합니다.은 (는) 검색 쿼리 집합의 __contains 필터입니다.

이렇게 말하면 검색 용어를 기준으로 SearchView에서 렌더링 한 10 개의 결과가 있습니다. 동일한 템플릿에서 나는 필터 양식 (GET 메서드를 사용)을 가지고 있으며 같은 SearchView을 호출합니다. 이제 SearchView 아래에 다음과 같이 정의 된 사용자 지정 개인 _filter_results 메서드가 있습니다.

context {'results' : _filter_results(self.results, self.result_filters)} 

self.result_filters 내가 SearchView__call__ 방법에 설정된 필터의 사전이며이 같은 모양 다음과 같이

def _filter_results(results, filters): 
     """ 
     This method would return the filtered search results, based on 
     the filters applied by a user. 
     """ 

     for item in filters: 
      if item == 'location': 
       results = results.filter(locations__contains=filters[item]) 
       print results 
      if item == 'age_min': 
       results = results.filter(workex_min__gte=filters[item]) 
      if item == 'age_max': 
       results = results.filter(workex_max__lte=filters[item]) 
     return results 

지금, 나는 템플릿에 결과를 전달합니다.

{ 
    'location' : request.GET.get('location'), 
    'age_min' : request.GET.get('age_min'), 
    'age_max' : request.GET.get('age_max'), 
} 

나는 오류를 얻을하지 않습니다, 나는 이중 각 필터 값이 _filter_results 메서드에 전달되고 있음을 확인했다. 그러나 결과는 여전히 동일하게 유지됩니다.

10 개 항목의 결과 목록에 위치가 포함되지 않은 위치로 필터링하려고하면 동일한 10 개 항목의 결과가 계속 표시됩니다. 그 이유는 무엇일까요?

답변

1

나는 ElasticSearch와 함께 Haystack을 사용했지만 Solr과 광범위하게 사용했지만 ElasticSearch와 동일하게 작동해야합니다.

필터 대신 results.narrow() 메서드를 사용해야합니다. 필터 메소드는 본질적으로 기본 쿼리 용어와 함께 필터를 추가하고 haystack에서 기본 연산자가 'OR'로 설정되어 있으므로 'OR'쿼리를 실행합니다.

좁은() 메서드는 특히 결과의 초기 집합을 필터링하고 더 구체화하며 SearchEngine에서 생성 된 쿼리가 좁아서 inbuilt 캐싱을보다 잘 사용하도록 필터 쿼리를 실행하는 것이 유리합니다. 이 SOLR와 함께 작동하지만 건초 더미 방법의 개념에서 동일하고 유일한 차이는 각 SEARCHENGINE에 대한 백엔드 파일에있다 방법

def _filter_results(results, filters): 
    """ 
    This method would return the filtered search results, based on 
    the filters applied by a user. 
    """ 

    for item in filters: 
     if item == 'location': 
      results = results.narrow('locations:%s' % filters[item]) 
      print results 
     if item == 'age_min': 
      results = results.narrow('workex_min:[%s TO *]' % filters[item]) 
     if item == 'age_max': 
      results = results.narrow('workex_max:[* TO %s]' % filters[item]) 
    return results 

는 다시이입니다. 더 나은 이해를 위해서 haystack/backends/elasticsearch_backend.py를 봐야합니다.

FacetedSearchView 및 FacetedSearchForm도 참조하십시오

관련 문제