2015-01-05 20 views
5

Tôi có 2 máy chủ với Haystack:Haystack và Elasticsearch: số Giới hạn kết quả

  • Server1: Đây có elasticsearch cài đặt
  • server2: Điều này không có elasticsearch, các truy vấn được thực hiện đến Máy chủ1

Vấn đề của tôi là về phân trang khi tôi thực hiện truy vấn từ S erver2 để Server1:

  • server2 làm cho truy vấn để Server1
  • Server1 gửi tất cả các kết quả lại cho server2
  • server2 làm cho pagination

Nhưng điều này không phải là tối ưu, nếu truy vấn trả về 10.000 đối tượng, truy vấn sẽ chậm.

Tôi biết rằng bạn có thể gửi đến elasticsearch một số giá trị trong truy vấn (kích thước, từđể) nhưng tôi không biết nếu điều này là có thể sử dụng Haystack, tôi đã kiểm tra hồ sơ và googled nó và thấy không có gì.

  • Làm cách nào để định cấu hình truy vấn trong Haystack để nhận kết quả 10 đến 10?

Sửa

  • phải là có thể rằng nếu tôi làm SearchQuerySet()[10000:10010] nó sẽ chỉ yêu cầu này 10 mặt hàng?
  • Hoặc nó sẽ yêu cầu tất cả các mục và sau đó lọc chúng?

Edit2

Tôi thấy điều này trên Haystack Documents:

có vẻ như một chức năng để làm whatt Tôi đang cố gắng để làm:

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

Và sau đó tôi đã cố gắng làm:

from haystack.query import SearchQuerySet 

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

Kết quả là danh sách đầy đủ, giống như tôi không bao giờ thêm dòng set_limit

  • Tại sao không làm việc?

Trả lời

3

Haystack hoạt động khác với Django ORM. Sau khi giới hạn queryset, bạn nên gọi get_results() để có được kết quả hạn chế. Điều này thực sự thông minh, bởi vì nó tránh được nhiều yêu cầu từ Elastic.

Ví dụ:

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

Hy vọng rằng nó sẽ giúp.

+0

Tôi phải thử điều này, tôi đã chiến đấu với mã rất nhiều vào lúc đó và không tìm thấy thông tin để đạt được nó. Cảm ơn !! – AlvaroAV

+0

Tôi nhận được lỗi này - đối tượng 'AttributeError: 'SearchQuerySet' không có thuộc tính 'get_results'' – garg10may

+0

dòng cuối cùng phải là' len (sqs.query.get_results()) ' – garg10may

-1

Thêm vào câu trả lời Yigit, nếu bạn muốn có các khoảng bù trên bản ghi được lọc chỉ cần thêm điều kiện bộ lọc khi bạn tạo SearchQuerySet.

Cũng nhớ khi đã đặt giới hạn, bạn không thể thay đổi chúng bằng cách đặt lại chúng. Bạn sẽ cần phải tạo lại số SearchQuerySet() hoặc có phương pháp xóa các giới hạn.

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() 
Các vấn đề liên quan