我正在处理干草堆和elasticsearch。是否有可能拉出与此类mysql查询匹配的结果:SELECT name, count(*) FROM article WHERE (here goes some where clause) GROUP BY name;
文章是一种汇总了用于搜索的所有信息的 View 。基于此,我对干草堆进行了索引。现在,在进行一些搜索之后,我想添加有关该搜索的其他摘要。
我找到了某种解决方案:
articles = SearchQuerySet().filter(some_custom_filter_options)
summary = articles.facet('name').facet_counts()['fields']['name']
不幸的是,
facet
'fields'
的最大长度限制为100?因为上层查询给了我100多行...有什么办法可以实现?我知道我可以使用简单的for循环来解析它,但是有时我会得到超过50k的结果。
最佳答案
Django干草堆支持多个后端,但不支持其所有功能。 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'))
关于python - Django Haystack自定义查询,分组依据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30280206/