Haystack 和 Elasticsearch:限制结果数量
Haystack and Elasticsearch: Limit number of results
我有 2 个带有 Haystack 的服务器:
- Server1: 安装了elasticsearch
- Server2:没有elasticsearch,查询到Server1
当我从 Server2 查询到 Server1:
时,我的问题是关于分页的
- Server2 查询 Server1
- Server1 将所有结果发送回 Server2
- Server2分页
但这不是最优的,如果查询return10.000个对象,查询会很慢。
我知道您可以向 elasticsearch 发送查询中的一些值(size、from 和 to) 但我不知道使用 Haystack 是否可行,我检查了文档并用谷歌搜索,但一无所获。
- 如何在 Haystack 中配置查询以接收 10 乘 10 的结果?
编辑
- 有没有可能如果我制作
SearchQuerySet()[10000:10010]
它只会要求这 10 件物品?
- 或者它会询问所有项目然后过滤它们?
编辑2
我在 Haystack 文档上找到了这个:
它似乎是一个可以做我想做的事情的函数:
Restricts the query by altering either the start, end or both offsets.
然后我尝试这样做:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content='anything')
结果是完整列表,就像我从来没有添加 set_limit 行一样
- 为什么不起作用?
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.
希望对您有所帮助。
添加到 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 的服务器:
- Server1: 安装了elasticsearch
- Server2:没有elasticsearch,查询到Server1
当我从 Server2 查询到 Server1:
时,我的问题是关于分页的- Server2 查询 Server1
- Server1 将所有结果发送回 Server2
- Server2分页
但这不是最优的,如果查询return10.000个对象,查询会很慢。
我知道您可以向 elasticsearch 发送查询中的一些值(size、from 和 to) 但我不知道使用 Haystack 是否可行,我检查了文档并用谷歌搜索,但一无所获。
- 如何在 Haystack 中配置查询以接收 10 乘 10 的结果?
编辑
- 有没有可能如果我制作
SearchQuerySet()[10000:10010]
它只会要求这 10 件物品? - 或者它会询问所有项目然后过滤它们?
编辑2
我在 Haystack 文档上找到了这个:
它似乎是一个可以做我想做的事情的函数:
Restricts the query by altering either the start, end or both offsets.
然后我尝试这样做:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content='anything')
结果是完整列表,就像我从来没有添加 set_limit 行一样
- 为什么不起作用?
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.
希望对您有所帮助。
添加到 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()