стог сена поиск по нескольким полям - PullRequest
3 голосов
/ 12 августа 2010

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

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

content: xxx И человек: SMITH

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

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 Ответ

4 голосов
/ 01 мая 2013

В вашем индексе вы должны определить одно поле с 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 }}

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

...