swarm intelligence, right now i try to implement a database fulltext-search in a Django-project with haystack and whoosh in the backend.
Installation, configuration and indexing ist done. Search works as intended. So NOW I'm talking about displaying search results:
"side" problem: Results seem to be not sorted. I would like to know, WHERE in the different code-tables from Django (views/forms/serach-index/urls.py) i can set a configuration for the result-ordering?
Reason for Question is furthermore: When I am trying to set up the template for displaying the results, it is no problem to use a {{ result.object.last_name }} tag when result is from model, where "last_name" is included.... But if i get results from a child table, what do i have to do to display "last_name" from parent table, too?
My search-indexes.py:
from haystack import indexes
from employees.models import Employees, Employments, Professions, ForeignMissions, \
LanguageAbilities, SecondDegrees, MilCourseDetails, CivCourseDetails
class EmployeesIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
titel_rank = indexes.CharField(model_attr='title_rank', null=True)
rank_short = indexes.CharField(model_attr='rank_short', null=True)
last_name = indexes.EdgeNgramField(model_attr='last_name')
first_name = indexes.CharField(model_attr='first_name')
prefix_title = indexes.CharField(model_attr='prefix_title', null=True)
suffix_title = indexes.CharField(model_attr='suffix_title', null=True)
street = indexes.CharField(model_attr='street')
building_number = indexes.CharField(model_attr='building_number')
postal_code = indexes.CharField(model_attr='postal_code')
city = indexes.CharField(model_attr='city')
country = indexes.CharField(model_attr='country')
employee_number = indexes.CharField(model_attr='employee_number')
key_number = indexes.CharField(model_attr='key_number', null=True)
chip_number = indexes.CharField(model_attr='chip_number', null=True)
locker_room = indexes.CharField(model_attr='locker_room', null=True)
locker_number = indexes.CharField(model_attr='locker_number', null=True)
office = indexes.CharField(model_attr='office', null=True)
computer = indexes.CharField(model_attr='computer', null=True)
# Auto-Completion-Felder:
auto_last_name = indexes.EdgeNgramField(model_attr='last_name')
class Meta:
model = Employees
fields = ['text', 'id', 'title_rank', 'rank_short', 'last_name', 'first_name', 'prefix_title', 'suffix_title',
'street', 'building_number', 'postal_code', 'city', 'country', 'employee_number', 'key_number',
'chip_number', 'locker_room', 'locker_number', 'office', 'computer']
def get_model(self):
return Employees
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class EmploymentsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
status = indexes.CharField(model_attr='status')
work_time_model = indexes.CharField(model_attr='work_time_model')
class Meta:
model = Employments
fields = ['text', 'id', 'status', 'work_time_model']
def get_model(self):
return Employments
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class ProfessionsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
profession = indexes.CharField(model_attr='profession')
class Meta:
model = Professions
fields = ['text', 'id', 'profession']
def get_model(self):
return Professions
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class SecondDegreesIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
second_degree = indexes.CharField(model_attr='second_degree')
institution = indexes.CharField(model_attr='institution', null=True)
class Meta:
model = SecondDegrees
fields = ['text', 'id', 'second_degree', 'institution']
def get_model(self):
return SecondDegrees
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class MilCourseDetailsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
mil_course = indexes.CharField(model_attr='mil_course')
class Meta:
model = MilCourseDetails
fields = ['text', 'id', 'mil_course']
def get_model(self):
return MilCourseDetails
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class CivCourseDetailsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
civ_course = indexes.CharField(model_attr='civ_course')
class Meta:
model = CivCourseDetails
fields = ['text', 'id', 'civ_course']
def get_model(self):
return CivCourseDetails
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class LanguageAbilitiesIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
language = indexes.CharField(model_attr='language')
native_speaker = indexes.IntegerField(model_attr='native_speaker')
slp = indexes.CharField(model_attr='slp', null=True)
class Meta:
model = LanguageAbilities
fields = ['text', 'id', 'language', 'native_speaker', 'slp']
def get_model(self):
return LanguageAbilities
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
class ForeignMissionsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(model_attr='id')
mission = indexes.CharField(model_attr='mission')
location = indexes.CharField(model_attr='location')
position = indexes.CharField(model_attr='position', null=True)
class Meta:
model = ForeignMissions
fields = ['text', 'id', 'mission', 'location', 'position']
def get_model(self):
return ForeignMissions
def index_queryset(self, using=None):
# Wenn der gesamte Index aktualisiert wird:
return self.get_model().objects.all()
I have all indexed fields represented in custom tags according to haystack documentation. For exampel: For model "employees" there is a employees_text.txt with the following content:
{{ object.title_rank }}
{{ object.rank_short }}
{{ object.last_name }}
{{ object.first_name }}
{{ object.prefix_title }}
{{ object.suffix_title }}
{{ object.street }}
{{ object.building_number }}
{{ object.postal_code }}
{{ object.city }}
{{ object.country }}
{{ object.employee_number }}
{{ object.key_number }}
{{ object.chip_number }}
{{ object.locker_room }}
{{ object.locker_number }}
{{ object.office }}
{{ object.computer }}
So the real question is like: If i get results from my defined query-fields of model "foereignmissions", how can i adress in template the {{object.last_name}} from model "employees" while displaying results ?