我正在处理 haystack 和 elasticsearch 。是否有可能提取匹配此类mysql查询的结果:
SELECT name, count(*) FROM article WHERE (here goes some where clause) GROUP BY name;
文章是某种视图,它汇总了用于搜索的所有信息。基于此我制作了干草堆指数。现在,在进行一些搜索之后,我想添加关于该搜索的其他摘要。
我找到了某种解决方案:
articles = SearchQuerySet().filter(some_custom_filter_options)
summary = articles.facet('name').facet_counts()['fields']['name']
不幸的是,facet
'fields'
的长度限制为100?因为上层查询给了我超过100行...
有没有办法实现这一目标?我知道我可以用简单的for循环解析它,但有时候我得到的结果超过50k。
答案 0 :(得分:1)
Django haystack支持多个后端,但没有支持所有功能。 django haystack不支持Elasticsearch Aggregations。请参阅此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'))