2015-01-05 27 views
5

Mam 2 serwery z stogu siana:siana i Elasticsearch: Ogranicz liczbę wyników

  • Server1: Ma elasticsearch zainstalowany
  • Serwer2: To nie są elasticsearch, zapytania są wykonywane do Serwer1

Mój problem jest o paginacji kiedy robię zapytań od S erver2 do Server1:

  • Serwer2 sprawia zapytanie do Serwer1
  • Server1 wysłać wszystkie wyniki z powrotem do Serwer2
  • Serwer2 sprawia paginacji

Ale to nie jest optymalne, jeśli zapytanie zwróci 10.000 obiektów, zapytanie będzie wolne.

wiem, że można wysłać do elasticsearch pewne wartości w zapytaniu (wielkości, od i do), ale nie wiem, czy jest to możliwe przy użyciu Stóg, Sprawdziłem dokumentację i googled to i nic nie znalazłem.

  • Jak mogę skonfigurować zapytanie w stogu siana aby otrzymać wyniki 10 od 10?

Edit

  • Czy to możliwe, że jeśli zrobię SearchQuerySet()[10000:10010] poprosi tylko dla tych 10 pozycji?
  • Czy poprosi o wszystkie elementy, a następnie je odfiltruje?

Edit2

Znalazłem to na Haystack Docs:

wydaje funkcję zrobić whatt Próbuję zrobić:

Restricts the query by altering either the start, end or both offsets.

A potem próbowałem zrobić:

from haystack.query import SearchQuerySet 

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

Wynikiem jest pełna lista, podobnie jak nigdy nie dodaję linię set_limit

  • Dlaczego nie działa?

Odpowiedz

3

Haystack działa inaczej niż Django ORM. Po ograniczeniu zestawu zapytań należy wywołać metodę get_results() w celu uzyskania ograniczonych wyników. To jest naprawdę sprytne, ponieważ pozwala uniknąć wielu żądań od Elastic.

Przykład:

# 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. 

Nadzieję, że to pomaga.

+0

Muszę to wypróbować, walczyłem z kodem dużo wtedy i nie znalazłem informacji, aby to osiągnąć. Dzięki !! – AlvaroAV

+0

Otrzymuję ten błąd - obiekt 'AttributeError: 'Obiekt SearchQuerySet nie ma atrybutu' get_results'' – garg10may

+0

Ostatni wiersz powinien mieć postać' len (sqs.query.get_results()) ' – garg10may

-1

Dodając do odpowiedzi Yigit, jeśli chcesz mieć te przesunięcia w filtrowanych rekordach, po prostu dodaj warunki filtru, gdy utworzysz SearchQuerySet.

Pamiętaj również, że po ustawieniu limitów nie można ich zmienić, ustawiając je ponownie. Będziesz musiał ponownie utworzyć SearchQuerySet() lub istnieje metoda, aby usunąć ograniczenia.