Eu tenho 2 servidores com o Haystack:
- Servidor1: Possui elasticsearch instalado
- Server2: Isso não possui pesquisa elástica, as consultas são feitas para Servidor1
Meu problema é sobre paginação quando faço consultas de Server2 para Servidor1:
- Server2 faz consulta para Servidor1
- Servidor1 envie todos os resultados de volta para Server2
- Server2 faz a paginação
Mas isso não é o ideal, se a consulta retornar 10.000 objetos, a consulta será lenta.
Eu sei que você pode enviar para elasticsearch alguns valores na consulta (Tamanho, a partir de e para), mas não sei se isso é possível usando Palheiro, Verifiquei a documentação, pesquisei no Google e não encontrei nada.
- Como eu poderia configurar a consulta em Palheiro para receber os resultados 10 por 10?
- É possível que se eu fizer
SearchQuerySet()[10000:10010]
só vai pedir esses 10 itens? - Ou irá pedir todos os itens e depois filtrá-los?
Edit2
Encontrei isso no Haystack Docs:
parece uma função fazer o que estou tentando fazer:
Restringe a consulta alterando o início, o fim ou os dois deslocamentos.
E então eu tentei fazer:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content="anything")
O resultado é a lista completa, como se eu nunca adicionasse a linha set_limit
- Por que não está funcionando?
Respostas:
3 para resposta № 1O Haystack funciona meio diferente do Django ORM. Depois de limitar o conjunto de consultas, você deve chamar get_results () para obter resultados limitados. Isso é realmente inteligente, pois evita várias solicitações do Elastic.
Exemplo:
# 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.
Espero que ajude.
-1 para resposta № 2
Adicionando à resposta Yigit, se você quiser ter essas compensações nos registros filtrados, adicione a condição de filtro ao formar o SearchQuerySet
.
Lembre-se também de que, uma vez definidos os limites, você não poderá alterá-los, definindo-os novamente. Você precisaria formar o SearchQuerySet()
novamente, ou existe um método para limpar os limites.
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()