Haystack Несколько полевых Поиск
-
28-09-2019 - |
Вопрос
Привет, я использую 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 }}
Видеть это отвечать.