/ / Haystack e Elasticsearch: número limite de resultados - django, elasticsearch, paginação, django-haystack

Palheiro e Elasticsearch: Limite do número de resultados - django, elasticsearch, paginação, django-palheiro

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 № 1

O 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()