Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make an abstract Haystack SearchIndex class

How do you make an abstract SearchIndex class, similar to how Django lets you make abstract base models?

I have several SearchIndexes that I'd like to give the same basic fields (object_id, timestamp, importance, etc). Currently, I'm duplicating all this code, so I'm trying to create a "BaseIndex" and simply have all the real index classes inherit from this.

I'm tried:

class BaseIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    object_id = indexes.IntegerField()
    timestamp = indexes.DateTimeField()

    class Meta:
        abstract = True

class PersonIndex(BaseIndex):
    ...other fields...

but this gives me the error:

NotImplementedError: You must provide a 'model' method for the '<myapp.search_indexes.BaseIndex object at 0x18a7328>' index.

so I then tried:

class BaseIndex(object):
    text = indexes.CharField(document=True, use_template=True)
    object_id = indexes.IntegerField()
    timestamp = indexes.DateTimeField()

class PersonIndex(BaseIndex, indexes.SearchIndex, indexes.Indexable):
    first_name = indexes.CharField()
    middle_name = indexes.CharField()
    last_name = indexes.CharField()

but these gives me error:

SearchFieldError: The index 'PersonIndex' must have one (and only one) SearchField with document=True.

How do I inherit from a custom SearchIndex subclass?

like image 560
Cerin Avatar asked Jun 03 '13 15:06

Cerin


1 Answers

Just don't include indexes.Indexable as a parent on anything you don't want indexing.

So modifying your first example.

class BaseIndex(indexes.SearchIndex):
    text = indexes.CharField(document=True, use_template=True)
    object_id = indexes.IntegerField()
    timestamp = indexes.DateTimeField()

    class Meta:
        abstract = True

class PersonIndex(BaseIndex, indexes.Indexable):
    ...other fields...
like image 135
Stephen Paulger Avatar answered Sep 19 '22 14:09

Stephen Paulger