2015-03-04 14 views
5

Tôi có một ứng dụng còn lại có thể xuất một số dữ liệu báo cáo từ Elasticsearch. Dễ dàng thực hiện với API Java:Elasticsearch có thể truyền trực tuyến SearchResponse không?

SearchResponse response = getClient() 
      .prepareSearch("my_index_name") 
      .setQuery(QueryBuilders.someQuery()) 
      .addAggregation(AggregationBuilders.someAggregation()) 
      .get(); 

Sự cố bắt đầu với phản hồi lớn. Sử dụng đoạn mã này, phản hồi được đọc để xây dựng đối tượng SearchResponse trong bộ nhớ. Trong trường hợp của tôi, phản hồi không phù hợp với bộ nhớ.

Phân trang không thể trợ giúp vì chúng tôi thường cần trả lại toàn bộ dữ liệu và Tổng hợp do not support paging yet.

Tôi biết rằng tôi có thể sử dụng API REST của Elasticsearch để đọc phản hồi dưới dạng luồng nhưng tự xây dựng yêu cầu đó là cồng kềnh. Tôi thực sự muốn một cái gì đó như thế này:

// my dream API 
InputStream response = getClient() 
      .prepareSearch("my_index_name") 
      .setQuery(QueryBuilders.someQuery()) 
      .addAggregation(AggregationBuilders.someAggregation()) 
      .getStream(); 

Vì vậy, API Elasticsearch Java có thể truyền các SearchResponse?

Trả lời

0

Tôi tin rằng không có cách nào để có được một InputStream từ API Java (nhưng tôi có thể sai). Tôi cũng nghĩ rằng không có cách nào để trực tiếp có được một InputStream trong Jest (một API Java Elasticsearch dựa trên REST).

Bạn đề cập đến việc tự tạo yêu cầu tìm kiếm cho chính mình: nếu bạn đang đề cập đến việc tạo truy vấn json thực, tôi chỉ muốn chỉ ra rằng khi bạn có số SearchSourceBuilder, bạn có thể gọi toString() trên đó để có được biểu diễn json đầy đủ về truy vấn của bạn.

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
    sourceBuilder.query(this.getQuery()) 
      .from(this.getFrom()) 
      .size(this.getSize()) 
      .fetchSource(this.getSource(), null); 
    this.getSort().forEach(sourceBuilder::sort); 
    sourceBuilder.toString() // the json representation 
1

A proposal for streaming results không tồn tại nhưng dường như không có hơi nước cho đến nay và đã bị đóng (hiện tại).

Có cách để làm điều đó với XContentBuilder nhưng vẫn yêu cầu toàn bộ phản hồi nằm trong bộ nhớ trước khi được gửi.

Nó có thể không phải là những gì bạn muốn, nhưng đó là điều gần nhất mà tôi biết có thể đáp ứng nhu cầu của bạn. Đáng cho nó một thử.

Các vấn đề liên quan