Fulltext Search in Django with Haystack/Whoosh - Displaying Search results with tags from models not in results

67 views Asked by At

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 ?

0

There are 0 answers