2011-08-18 3 views
2

사용자가 다른 사람을 이름으로 찾을 수있는 텍스트 필드가 웹 앱에 있습니다. 상자에 입력을 시작하면 입력 할 때 서버가 가능한 일치 항목을 보냅니다. 나는 간단한 검색 인덱스와 건초 더미/SOLR 백엔드를 설정 : django-haystack의 단어 경계를 넘나들며 자동 완성

class UserIndex(SearchIndex): 
    text = NgramField(document=True, model_attr='get_full_name') 

site.register(BerlinrUser, UserIndex) 

가 그럼 난 manage.py build_solr_schema을 실행 한 후 마지막으로 manage.py update_index을 실행, 내 solf/conf 디렉토리에 스키마를 복사 SOLR 다시 시작합니다.

q = request.GET.get("q") 
search_result = SearchQuerySet().models(User).autocomplete(content=q) 
for result in search_result: 
    # Collect user IDs, pull from database, and send back a JSON result 

문제는 자동 완성 내가 원하는 반환하지 않는다는 것입니다 : 내 장고보기에서

, 나는 다음 검색 코드가 있습니다. 사용자의 컬렉션을 감안할 때 :

Query:  Expected result: 
"John"  "John Smith",      
       "John Jingleheimer-Schmidt" 
"Smith"  "John Smith", 
       "Jenny Smith" 
"Smi"   "John Smith", 
       "Jenny Smith" 
"J"   <Anybody with a first or last name that begins with "J"> 
"John Sm"  "John Smith" 

참고 "일치와 반대로, 아무것도 반환하지"들은 SMI OHN "쿼리에 대한 허용 : 여기

John Smith 
John Jingleheimer-Schmidt 
Jenny Smith 

내가 원하는 행동입니다 존 스미스".

그러나 Haystack/Solr을 사용하면 "Smi", "J"및 "John Sm"이 결과를 전혀 반환하지 않습니다. Haystack/Solr이 어떤 것을 반환하도록하려면 전체 단어를 사용해야합니다. Haystack 문서에 따르면 NgramField를 사용하여 단어 경계를 일치시켜야하지만 그렇게하는 것은 아닙니다. 어떤 아이디어?

답변

2

쿼리가 예상대로 작동하지 않는 이유를 확인했습니다.

첫 번째 문제는 색인 정의에있었습니다. 그것은 다음과 같아야합니다.

class UserIndex(SearchIndex): 
    text = CharField(document=True) 
    name_auto = NgramField(model_attr='get_full_name') 

또 다른 문제점은 내 Solr schema.xml 파일에 있습니다. minGramSize가 "3"으로 설정되어 3 자 이하의 쿼리가 작동하지 않습니다. 이 값을 "1"로 설정하고 Solr을 다시 시작한 다음 인덱스를 다시 작성하면 문제가 해결됩니다.

관련 문제