【问题标题】:Haystack and Elasticsearch: Limit number of resultsHaystack 和 Elasticsearch:限制结果数量
【发布时间】:2015-03-02 21:16:54
【问题描述】:

我有 2 台带有 Haystack 的服务器:

  • Server1:这已经安装了 elasticsearch
  • Server2:这没有elasticsearch,查询到Server1

当我从 Server2Server1 进行查询时,我的问题是分页:

  • Server2Server1 进行查询
  • Server1 将所有结果发送回 Server2
  • Server2 进行分页

但这不是最优的,如果查询返回 10.000 个对象,查询会很慢。

我知道您可以将查询中的一些值(sizefromto)发送到 elasticsearch,但我不知道如果使用 Haystack 可以做到这一点,我已经检查了文档并用谷歌搜索了它,但一无所获。

  • 如何配置 Haystack 中的查询以接收 10 x 10 的结果?

编辑

  • 是否有可能如果我让SearchQuerySet()[10000:10010] 它只会要求这 10 项?
  • 或者它会要求所有项目然后过滤它们?

编辑2

我在 Haystack Docs 上找到了这个:

这似乎是我想做的事情的一个功能:

通过更改开始、结束或两个偏移量来限制查询。

然后我尝试这样做:

from haystack.query import SearchQuerySet

sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content='anything')

结果是完整列表,就像我从未添加 set_limit 行一样

  • 为什么不工作?

【问题讨论】:

    标签: django elasticsearch pagination django-haystack


    【解决方案1】:

    添加到 Yigit 答案中,如果您想在过滤记录上添加这些偏移量,只需在形成 SearchQuerySet 时添加过滤条件。

    还请记住,一旦设置了限制,您就无法通过再次设置来更改它们。您需要再次形成SearchQuerySet(),或者有一种方法可以清除限制。

    results = SearchQuerySet().filter(content="keyword")
    #we have a filtered resultSet now let's find specific records
    results.query.set_limits(0,4)
    return results.query.get_results()
    

    【讨论】:

      【解决方案2】:

      Haystack 的工作方式与 Django ORM 有点不同。限制查询集后,您应该调用 get_results() 以获得有限的结果。这实际上很聪明,因为它避免了来自 Elastic 的多个请求。

      例子:

      # Assume you have 800 records.
      sqs = SearchQuerySet()
      sqs.query.set_limits(low=0, high=4)
      len(sqs)  # Will return 800 records
      len(sqs.get_results())  # Will return first 4 records.
      

      希望对您有所帮助。

      【讨论】:

      • 我必须尝试一下,我当时与代码斗争了很多,但没有找到实现它的信息。谢谢!!
      • 我收到此错误 - AttributeError: 'SearchQuerySet' object has no attribute 'get_results'
      • 最后一行应该是len(sqs.query.get_results())
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2015-04-28
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多