J'ai 2 serveurs avec Haystack:
- Server1: Cela a elasticsearch installé
- Serveur2: Cela ne "t pas elasticsearch, les requêtes sont faites à Server1
Mon problème concerne la pagination lorsque je pose des questions à partir de Serveur2 à Server1:
- Serveur2 fait une requête à Server1
- Server1 renvoyer tous les résultats à Serveur2
- Serveur2 fait la pagination
Mais ce n'est pas optimal, si la requête renvoie 10 000 objets, la requête sera lente.
Je sais que vous pouvez envoyer à elasticsearch des valeurs dans la requête (Taille, de et à) mais je ne sais pas si cela est possible en utilisant Meule de foinJ'ai vérifié la documentation, l 'ai googé et rien trouvé.
- Comment pourrais-je configurer la requête dans Meule de foin recevoir les résultats 10 par 10?
- Est-ce possible que si je fais
SearchQuerySet()[10000:10010]
il ne demandera que ces 10 articles? - Ou il va demander tous les éléments et ensuite les filtrer?
Edit2
J'ai trouvé ceci sur Haystack Docs:
cela semble être une fonction de faire ce que je suis en train de faire:
Restreint la requête en modifiant le décalage de début, de fin ou les deux.
Et puis j'ai essayé de faire:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content="anything")
Le résultat est la liste complète, comme je n'ai jamais ajouté la ligne set_limit
- Pourquoi ne fonctionne pas?
Réponses:
3 pour la réponse № 1Haystack fonctionne un peu différemment de Django ORM. Après avoir limité le nombre de requêtes, appelez get_results () afin d’obtenir des résultats limités. C'est en fait intelligent, car cela évite les demandes multiples d'Elastic.
Exemple:
# 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.
J'espère que ça aide.
-1 pour la réponse № 2
En ajoutant à la réponse Yigit, si vous voulez avoir ces décalages sur les enregistrements filtrés, ajoutez simplement une condition de filtre lorsque vous créez le filtre. SearchQuerySet
.
Rappelez-vous également que lorsque les limites sont définies, vous ne pouvez pas les modifier en les définissant à nouveau. Vous devez créer le SearchQuerySet()
encore, ou il existe une méthode pour effacer les 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()