Вопрос

Привет, я использую HayStack с 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 Haystack, поиск .html из учебника

(r'^search/', include('haystack.urls')),
Это было полезно?

Решение

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

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

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

Видеть это отвечать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top