стог сена поиск по нескольким полям

Привет, я использую стог сена с 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 И лицо:СМИТ

В стоге сена он ищет все сразу, я не могу выполнять поиск по конкретному полю. Я подозревал, что мой индекс поврежден, но:

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

но он работает и возвращает правильное значение. Я использую стандартный стог сена SearchView, search.html из учебника.

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

person locojay    schedule 12.08.2010    source источник


Ответы (1)


В вашем индексе вы должны определить одно поле с document=True, которое является документом, в котором будет выполняться поиск в стоге сена. По соглашению это поле называется 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)

И у вас будет шаблон search/indexes/tdoc_text.txt, например:

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

См. этот ответ.

person Facundo Olano    schedule 30.04.2013