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

Привет я использую стог сена с 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)

Моя проблема в том, что я хотел бы сделать несколько полевых поисков, таких как

Содержание: ххх И человек: СМИТ

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

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')),

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)

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

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

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

Другие вопросы по тегам