""" Haystack Search Indexes für Elasticsearch """ # from haystack import indexes # from haystack import site from products.models import Product from auction.models import Auction class ProductIndex(indexes.SearchIndex, indexes.Indexable): """Product Search Index""" text = indexes.CharField(document=True, use_template=True) title = indexes.CharField(model_attr='name', boost=2.0) description = indexes.CharField(model_attr='description', boost=1.5) category = indexes.CharField(model_attr='category', faceted=True) fursuit_type = indexes.CharField(model_attr='fursuit_type', faceted=True) price = indexes.DecimalField(model_attr='price') featured = indexes.BooleanField(model_attr='featured') created_at = indexes.DateTimeField(model_attr='created_at') # Autocomplete fields title_auto = indexes.EdgeNgramField(model_attr='name') description_auto = indexes.EdgeNgramField(model_attr='description') category_auto = indexes.EdgeNgramField(model_attr='category') # Suggest field title_suggest = indexes.CharField(model_attr='name') def get_model(self): return Product def index_queryset(self, using=None): """Used when the entire index for model is updated.""" return self.get_model().objects.filter(is_active=True) def prepare_text(self, obj): """Prepare text field for search""" return f"{obj.name} {obj.description} {obj.category} {obj.fursuit_type}" def prepare_title_suggest(self, obj): """Prepare suggestion field""" return obj.name class AuctionIndex(indexes.SearchIndex, indexes.Indexable): """Auction Search Index""" text = indexes.CharField(document=True, use_template=True) title = indexes.CharField(model_attr='title', boost=2.0) description = indexes.CharField(model_attr='description', boost=1.5) character_description = indexes.CharField(model_attr='character_description', boost=1.2) fursuit_type = indexes.CharField(model_attr='fursuit_type', faceted=True) status = indexes.CharField(model_attr='status', faceted=True) starting_bid = indexes.DecimalField(model_attr='starting_bid') current_bid = indexes.DecimalField(model_attr='current_bid') created_at = indexes.DateTimeField(model_attr='created_at') end_time = indexes.DateTimeField(model_attr='end_time') # Autocomplete fields title_auto = indexes.EdgeNgramField(model_attr='title') description_auto = indexes.EdgeNgramField(model_attr='description') character_description_auto = indexes.EdgeNgramField(model_attr='character_description') # Suggest field title_suggest = indexes.CharField(model_attr='title') def get_model(self): return Auction def index_queryset(self, using=None): """Used when the entire index for model is updated.""" return self.get_model().objects.filter(status__in=['active', 'draft']) def prepare_text(self, obj): """Prepare text field for search""" return f"{obj.title} {obj.description} {obj.character_description} {obj.fursuit_type}" def prepare_title_suggest(self, obj): """Prepare suggestion field""" return obj.title # Register indexes # site.register(Product, ProductIndex) # site.register(Auction, AuctionIndex)