src/ldt/ldt/indexation/search_indexes.py
author ymh <ymh.work@gmail.com>
Tue, 15 Mar 2016 12:32:52 +0100
changeset 1477 1de00f96a047
parent 1373 c9ed2ae1a902
child 1484 5a8702a8adf0
permissions -rw-r--r--
Corrections for elasticsearch (server) >= 2.2 and elasticserach (client lib) >= 2.3 (+version)

# -*- coding: utf-8 -*-
'''
Created on Jul 23, 2012

@author: ymh
'''

from haystack import indexes

from ldt.ldt_utils.models import Segment, Content
from ldt.text.models import Annotation


class SegmentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    iri_id = indexes.CharField(model_attr='iri_id', indexed=False, stored=True)
    project_id = indexes.CharField(model_attr='project_id', indexed=False, stored=True, null=True)
    ensemble_id = indexes.CharField(model_attr='ensemble_id', indexed=False, stored=True)
    cutting_id = indexes.CharField(model_attr='cutting_id', indexed=False, stored=True)
    element_id = indexes.CharField(model_attr='element_id', indexed=False, stored=True)
    tags = indexes.CharField(model_attr='get_tags', stored=True)
    title = indexes.CharField(model_attr='title', stored=True)
    abstract = indexes.CharField(model_attr='abstract', stored=True)
    duration = indexes.IntegerField(model_attr='duration', indexed=False, stored=True)
    author = indexes.CharField(model_attr='author', stored=True, null=True)
    start_ts = indexes.IntegerField(model_attr='start_ts', indexed=False, stored=True)
    date = indexes.CharField(model_attr='date', stored=True)

    def get_model(self):
        return Segment

    def prepare_tags(self, obj):
        if hasattr(obj, 'tag_list'):
            if obj.tag_list is not None:
                obj.tags = None # To avoid a second and useless db request
                return ",".join(obj.tag_list)
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")


class AnnotationIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    tags = indexes.CharField(model_attr='tags', indexed=True, stored=False)
    title = indexes.CharField(model_attr='title', indexed=True, stored=True)
    abstract = indexes.CharField(model_attr='description', indexed=True, stored=False)
    text_field = indexes.CharField(model_attr='text', indexed=True, stored=False)
    annotation_id = indexes.CharField(model_attr='external_id', indexed=False, stored=True)

    def get_model(self):
        return Annotation

    def prepare_tags(self, obj):
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")


class ContentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    tags = indexes.CharField(model_attr='get_tags', indexed=True, stored=False, null=True)
    title = indexes.CharField(model_attr='title', indexed=True, stored=True)
    abstract = indexes.CharField(model_attr='description', indexed=True, stored=False, null=True)

    def get_model(self):
        return Content

    def prepare_tags(self, obj):
        return ",".join([tag.name for tag in obj.tags.all()])

    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.prefetch_related("tags")