2014-11-18 12 views
7

Tôi gặp sự cố yêu cầu tìm nạp tài liệu dựa trên id từ elasticsearch và sử dụng nó để thực hiện một truy vấn khác. Điều này làm việc nhưng tôi buộc phải thực hiện hai chuyến đi vòng đến cụm elasticsearch. Tôi có thể bằng cách nào đó làm điều này trong một truy vấn giống như truy vấn elasticsearch và sử dụng đầu ra của nó làm đầu vào cho truy vấn khác để tránh chuyến đi khứ hồi?ElasticSearch: Sử dụng đầu ra của một truy vấn làm đầu vào cho một truy vấn khác như một đầu vào khác

Vui lòng cho tôi biết nếu bạn không hiểu vấn đề.

+0

Bạn đã hỏi thêm một lần nữa: http://stackoverflow.com/questions/26977932/elasticsearch-find-documents-by-another-document. Và tôi không nghĩ rằng có bất kỳ tùy chọn nào khác ngoài truy vấn đó hoặc [truy vấn mlt] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html). –

+0

Bạn đã thử điều đó chưa? Giả sử không, nếu bạn chưa trả lời những câu trả lời đó. Nếu bạn đã làm và vẫn đặt câu hỏi về nó, bạn đã thử làm gì và tại sao bạn không hài lòng với mlt? –

+0

@AndreiStefan Có thể nhiều hơn thế này, hãy sử dụng bộ lọc trên các giá trị nhất định? Theo như tôi biết nó chọn các thuật ngữ và tìm kiếm có liên quan trên trường được đề cập nhưng làm cách nào tôi có thể buộc bộ lọc trên một số trường? –

Trả lời

1

Tôi muốn sử dụng cơ hội này để quảng cáo cách tiếp cận khác nhau cho vấn đề đã cho. Trong thực tế, ElasticSearch: The Definitive Guide làm việc khá tốt trên riêng của mình, tôi chỉ phải trích dẫn nó:

Bốn kỹ thuật phổ biến được sử dụng để quản lý dữ liệu quan hệ trong Elasticsearch:

  • Application-side tham gia
  • liệu denormalization
  • Nested đối tượng
  • Phụ Huynh/con mối quan hệ

Thường thì giải pháp cuối cùng sẽ yêu cầu một hỗn hợp của một vài trong số các kỹ thuật này.

Không chuẩn hóa dữ liệu trong thực tế có nghĩa là dữ liệu được lưu trữ theo cách mà một truy vấn thực hiện mẹo bạn sẽ thực hiện trước với 2 truy vấn liên tiếp.

Ở đây tôi sẽ mở ra the example từ sách nói trên. Giả sử bạn có hai chỉ số sau đây, và bạn muốn tìm tất cả các bài đăng trên blog được viết bởi bất kỳ người có tên John:

PUT /my_index/user/1 
{ 
    "name":  "John Smith", 
    "email": "[email protected]", 
    "dob":  "1970/10/24" 
} 

PUT /my_index/blogpost/2 
{ 
    "title": "Relationships", 
    "body":  "It's complicated...", 
    "userID":  1 
} 

Không có tùy chọn nào khác ngoài việc đầu tiên lấy ID của tất cả Johns trong cơ sở dữ liệu. Những gì bạn có thể làm thay vì là để di chuyển một số thông tin người dùng trên các đối tượng blogpost:

PUT /my_index/user/1 
{ 
    "name":  "John Smith", 
    "email": "[email protected]", 
    "dob":  "1970/10/24" 
} 

PUT /my_index/blogpost/2 
{ 
    "title": "Relationships", 
    "body":  "It's complicated...", 
    "user":  { 
    "id":  1, 
    "name":  "John Smith" 
    } 
} 

Do đó cho phép tìm kiếm trên user.name của chỉ số blogpost.

Ngoài các phương pháp truyền thống ElasticSearch bạn cũng có thể xem xét sử dụng các plugin của bên thứ ba như Siren Join:

này tham gia được sử dụng để lọc một bộ tài liệu dựa trên một tập hợp tài liệu thứ hai, do đó tên của nó. Nó tương đương với toán tử EXISTS() trong SQL.

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