【发布时间】:2013-11-17 18:49:46
【问题描述】:
我正在使用 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')
但是,Haystack 的 SearchQuerySet 没有 distinct 方法,所以我有点迷路了。我尝试对字段进行分面,然后使用返回的 item_id 列表查询 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 进行排序。
【问题讨论】:
-
不确定方法是否正确。你想完成什么,数据是什么样的
-
@JamesR 我在编辑中添加了一些信息,您介意看一下吗?
标签: python django elasticsearch django-haystack searchqueryset