QuerySet
Django Haystack + Elasticsearch + Django REST Framework を使用して小さな検索エンジンを構築しており、Djangoの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'sにはメソッドSearchQuerySet
がないので、なんだか迷ってしまいます。distinct
フィールドをファセットし、返された のリストを使用して Django にクエリを実行しようとしましitem_id
たが、これにより 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 がありますが、検索するときは、アイテムごとに最大で 1 つの結果のみを取得したいと考えています。したがって、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 でソートできないことです。