2010-08-12 2 views
3
검색 엔진으로 woosh로 건초 더미를 사용

안녕 메신저 :건초 더미 여러 필드 검색

class Person(models.Model): 
    personid = models.IntegerField(primary_key = True, db_column = 'PID') 
    firstname = models.CharField(max_length = 50, db_column = 'FIRSTNAME') 
    lastname = models.CharField(max_length = 50, db_column = 'LASTNAME') 
    class Meta: 
     db_table = '"TEST"."PERSON"' 
     managed = False 


class TDoc(models.Model): 
    tdocid = models.IntegerField(primary_key = True, db_column = 'TDOCID') 
    person = models.ForeignKey(Person, db_column = 'PID') 
    content = models.TextField(db_column = 'CONTENT', blank = True) 
    filepath = models.TextField(db_column = 'FILEPATH', blank = True) 
    class Meta: 
     db_table = '"TEST"."TDOC"' 
     managed = False 

search_index.py은 다음과 같다 다음과 같이

내 모델 같습니다

class TDocIndex(SearchIndex): 

    content = CharField(model_attr = 'content', document = True) 
    filepaht = CharField(model_attr = 'filepath') 
    person = CharField(model_attr = 'person') 

    def get_queryset(self): 
     return TDoc.objects.all() 

    def prepare_person(self, obj): 
     # Store a list of id's for filtering 
     return obj.person.lastname 

site.register(TDoc, TDocIndex) 

내 문제가 있습니다. 복수 신청 검색을하고 싶습니다.

내용 : xxx 및 사람 : SMITH

haystack에서는 특정 필드 검색을 한 번에 모두 검색 할 수 있습니다.

ix = open_dir("/testindex") 

searcher = ix.searcher() 

mparser = MultifieldParser(["content", "filepath", "person"], schema = ix.schema) 
myquery = mparser.parse(content:xxx AND person:SMITH') 
results = searcher.search(myquery) 
for result in results: 
    print result 

하지만, 작동 및 반환 올바른 값입니다 : 내 인덱스가 있지만 손상 의심. 난 당신이 문서 건초 더미가 검색 것이다 document=True, 하나 개의 필드를 정의한다 색인에서 튜토리얼

(r'^search/', include('haystack.urls')), 

답변

4

에서 표준 건초 더미 SearchView, search.html에를 사용하고 있습니다. 관례 상이 필드의 이름은 text입니다. 필터링이나 값에 대한 정렬을 수행하려는 경우 추가 필드를 추가합니다.

검색을 수행 할 때 여러 필드를 사용하는 방법은 문서를 템플릿으로 정의하고 문서 필드에 use_template을 설정하는 것입니다. 귀하의 색인과 같습니다

class TDocIndex(SearchIndex): 

    text = CharField(document=True, use_template=True) 

    #if you plan to filter by person 
    personid = IntegerField(model_attr='person__id') 

site.register(TDoc, TDocIndex) 

그리고 당신은 같은 검색/색인/tdoc_text.txt 템플릿 거라고 :

{{ object.content }} 
{{ object.filepath }} 
{{ object.person.lastname }} 

this 답변을 참조하십시오.

관련 문제