我正在使用 Django Haystack + Elasticsearch + Django REST Framework 构建一个小型搜索引擎,并且我试图找出重现 Django 方法的QuerySet
行为distinct
。
我的索引看起来像这样:
class ItemIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
item_id = indexes.IntegerField(faceted=True)
def prepare_item_id(self, obj):
return obj.item_id
我想做的是以下几点:
sqs = SearchQuerySet().filter(content=my_search_query).distinct('item_id')
但是,HaystackSearchQuerySet
没有distinct
方法,所以我有点迷茫。我尝试对字段进行分面,然后使用返回的item_id
's 列表查询 Django,但这会失去 Elasticsearch 的性能,并且也无法使用 Elasticsearch 的排序功能。
有什么想法吗?
编辑:
示例数据:
示例数据:
Item Model
==========
id title
1 'Item 1'
2 'Item 2'
3 'Item 3'
VendorItem Model << the table in question
================
id item_id vendor_id lat lon
1 1 1 38 -122
2 2 1 38.2 -121.8
3 3 2 37.9 -121.9
4 1 2 ... ...
5 2 2 ... ...
6 2 3 ... ...
如您所见,同一个项目有多个 VendorItem,但是在搜索时我只想为每个项目检索最多一个结果。因此,我需要该item_id
列是唯一/不同的。
我尝试在item_id
列上进行分面,然后执行以下查询:
facets = SearchQuerySet().filter(content=query).facet('item_id')
counts = sqs.facet_counts()
# ids will look like: [345, 892, 123, 34,...]
ids = [i[0] for i in counts['fields']['item_id']]
items = VendorItem.objects.filter(vendor__lat__gte=latMin,
vendor__lon__gte=lonMin, vendor__lat__lte=latMax,
vendor__lon__lte=lonMax, item_id__in=ids).distinct(
'item').select_related('vendor', 'item')
这里的主要问题是结果限制为 100 个项目,并且无法使用 haystack 对它们进行排序。