furry/search/indexes.py

87 lines
3.3 KiB
Python

"""
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)