Django haystack自定义查询与group by

时间:2015-05-16 20:03:24

标签: python mysql django elasticsearch

我正在处理 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。

1 个答案:

答案 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 aggregationHaystack 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'))