python - 带分组依据的 Django haystack 自定义查询

标签 python mysql django elasticsearch

我正在处理haystackelasticsearch。是否有可能提取与此类 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/

相关文章:

python - 如何在 Sympy 中查找表达式中的所有术语

php - 如何编辑我的查询以计算两个数字之间的差异?

python - 尝试对 python httplib 中无法访问的网络进行套接字操作

python - Django:检测未使用的模板

python - 如何从 python urllib 的 urlopen 获取 HTTP 返回码?

python - QScrollArea 是否对wheelEvent 使用react,也在 children 占据的空间中?

python - 如何从 pandas read_html 读取并平坦/规范化一系列表?

php - 无法吐出 mysqli 随机数

mysql - NodeJS Sequelize - 从刚刚在 MySQL 中创建的行中获取 ID?

python - 需要有关 Django 教程的帮助