我正在处理干草堆和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 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'))

关于python - Django Haystack自定义查询,分组依据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30280206/

10-14 18:00