我正在处理haystack 和elasticsearch。是否有可能提取与此类 mysql 查询匹配的结果:
SELECT name, count(*) FROM article WHERE(这里有一些 where 子句)GROUP BY name;
article 是一种聚合所有用于搜索的信息的 View 。基于此,我制作了 haystack 索引。现在,在进行了一些搜索之后,我想添加关于该搜索的额外摘要。
我找到了某种解决方案:
articles = SearchQuerySet().filter(some_custom_filter_options)
summary = articles.facet('name').facet_counts()['fields']['name']
不幸的是,facet
'fields'
的长度限制在 100 以内?因为上层查询给了我 100 多行...
有什么办法可以实现吗?我知道我可以用简单的 for 循环解析它,但有时我会得到超过 50k 的结果。
最佳答案
Django haystack 支持多个后端,但不支持它们的所有功能。 Django haystack 不支持 Elasticsearch 聚合。看这个feature request .
这就是为什么我个人停止使用 Haystack 以使用 elasticsearch-py 充分利用 elasticSearch 的原因.
无论如何,使用 Haystack,您可以通过两种方式进行聚合:
使用低级 API
from haystack import connections
query = {
"size": 0,
"aggs": {
"group_by_name": {
"terms": {
"field": "name"
}
}
}
}
backend = connections.all()[0].get_backend()
raw_results = backend.conn.search(query, index=backend.index_name, doc_type='modelresult')
results = backend._process_results(raw_results)
有关 ElasticSearch aggregation 的更多信息和 Haystack ElasticSearch JSON Queries .
使用 Hastack + Django ORM 多查询一次。
from django.db.models import Count
articles_id = SearchQuerySet().filter(some_custom_filter_options).values_list('id', flat=True)
articles = Article.objects.filter(id__in=articles_id).annotate(nb_article=Count('name'))
关于python - 带分组依据的 Django haystack 自定义查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280206/