使用drf-haystack searchindex和elasticsearch在多个模型上搜索(过滤)

时间:2017-03-18 08:27:56

标签: django-haystack

我一直在尝试使用rdf-haystack过滤器实现多个模型,但它不起作用。这是我的例子: 我有两个模型search_indexes.py

class PersonSkillIndex(indexes.SearchIndex, indexes.Indexable):
   text = indexes.CharField(document=True, use_template=True)
   person_name = indexes.CharField(model_attr='person_id')
   skill_name = indexes.EdgeNgramField(model_attr='skill_id')

   autocomplete = indexes.EdgeNgramField()
   @staticmethod

   def prepare_autocomplete(obj):
   return " ".join((obj.skill_id.name)) 

   def get_model(self):
   return PersonSkill

   def index_queryset(self, using=None):
   return self.get_model().objects.all()

   def prepare_person_id(self, obj):
   return obj.person_id.name

   def prepare_skill_id(self, obj):
   return obj.skill_id.name

class PersonPositionIndex(indexes.SearchIndex, indexes.Indexable):
   text = indexes.CharField(document=True, use_template=True)
   person_name = indexes.CharField(model_attr='person_id')
   position_name = indexes.EdgeNgramField(model_attr='position_id')
   autocomplete = indexes.EdgeNgramField()

   @staticmethod
   def prepare_autocomplete(obj):
   return " ".join(( obj.position_id.title)) 

   def get_model(self):
   return PersonPosition 

   def index_queryset(self, using=None):
   return self.get_model().objects.all()

   def prepare_person_id(self, obj):
   return obj.person_id.name

   def prepare_position_id(self, obj):
   return obj.position_id.name

我想使用以下searchQuerySet搜索PersonSkill和PersonPosition模型:

http://localhost:8000/en/api/profiles/search/?skill_name=python&position_name=programmer

Haytack过滤器是否支持此功能?如果有任何建议将受到欢迎! 感谢

1 个答案:

答案 0 :(得分:0)

请通过

http://drf-haystack.readthedocs.io/en/latest/09_multiple_indexes.html

这篇文章介绍了一种与您所寻找的相似的方式。

基本上,您可以在'index_classes'属性中指定索引列表。

当您的搜索引擎为多个模型建立索引并且您想要在两个或多个模型中提供汇总结果时,这将很有用。要使用默认的多索引支持,只需在index_classes列表中添加多个索引即可。