Haystack和Elasticsearch:限制结果数量

时间:2015-01-05 10:37:46

标签: django elasticsearch pagination django-haystack

我有两台Haystack服务器:

  • Server1 :已安装elasticsearch
  • Server2 :这没有弹性搜索,查询是 Server1

当我从 Server2 Server1 发出查询时,我的问题是关于分页:

  • Server2 查询 Server1
  • Server1 将所有结果发送回 Server2
  • Server2 制作分页

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

我知道您可以向查询中发送一些值(大小)但我不知道如果使用 Haystack 可以做到这一点,我已经检查过文档并用Google搜索并找不到任何内容。

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

修改

  • 如果我制作SearchQuerySet()[10000:10010],它可能只会要求这10件物品吗?
  • 或者它会询问所有项目然后过滤它们?

EDIT2

我在Haystack Docs上找到了这个:

这似乎是我要做的事情的功能:

  

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

然后我试着这样做:

from haystack.query import SearchQuerySet

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

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

  • 为什么不工作?

2 个答案:

答案 0 :(得分:4)

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.

希望它有所帮助。

答案 1 :(得分:-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()