Pregunta

Hola me estoy usando pajar con una Woosh como motor de búsqueda:

Mi modelo se ve de la siguiente manera

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

El search_index.py es como sigue:

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)

Mi problema es que me gustaría hacer múltiples búsquedas presentadas como

  

contenido: xxx y persona: SMITH

En pajar que buscar todos ellos a la vez que no puedo hacer la búsqueda campo específico. Yo sospechaba que mi índice es corrupto, pero:

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

pero funciona y el regreso del valor correcto. I m usando el SearchView pajar estándar, search.html del tutorial

(r'^search/', include('haystack.urls')),
¿Fue útil?

Solución

En el índice se debe definir un campo con document=True, que es el pajar documento será la búsqueda. Por convenio este campo se denomina text. Agrega campos adicionales si va a hacer el filtrado o la ordenación de sus valores.

La forma de llevar varios campos en cuenta a la hora de realizar una búsqueda, es definir el documento como una plantilla, y un conjunto use_template en su campo del documento. Su índice se vería así:

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)

Y que tendría una plantilla de búsqueda / índices / tdoc_text.txt como:

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

esta respuesta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top