2010-08-12 16 views
3

Salut im en utilisant botte de foin avec un Woosh comme moteur de recherche:botte de foin multiple champ de recherche

mon modèle se présente comme suit

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 

Le search_index.py est la suivante:

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) 

Mon problème est que je voudrais faire plusieurs recherches classées comme

contenu: xxx ET personne: SMITH

Sur haystack, il les recherche tous en même temps je ne peux pas effectuer de recherche de champ spécifique. Je me doutais bien que mon index est corrompu, mais:

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 

mais cela fonctionne et le retour est la valeur correcte. Je ne suis pas en utilisant la SearchView standard botte de foin, search.html du tutoriel

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

Répondre

4

Dans votre index, vous devez définir un champ avec document=True, qui est le document botte de foin va chercher sur. Par convention, ce champ est nommé text. Vous ajoutez des champs supplémentaires si vous envisagez de filtrer ou de trier leurs valeurs.

La manière de prendre en compte plusieurs champs lorsque vous effectuez une recherche consiste à définir le document en tant que modèle et à définir use_template dans votre champ de document. Votre index ressemblerait à ceci:

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) 

Et vous auriez une recherche/index/template tdoc_text.txt comme:

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

Voir this réponse.