2013-10-22 14 views
7

Cách tốt nhất để làm tương đương với việc tham gia SQL trong Elasticsearch là gì?Làm cách nào để tham gia vào Elasticsearch - hoặc ở cấp Lucene

Tôi có một thiết lập SQL với hai bảng lớn: Persons and Items. Một người có thể sở hữu nhiều mục. Cả hàng của Người và Mục có thể thay đổi (tức là được cập nhật). Tôi phải chạy các tìm kiếm lọc theo các khía cạnh của cả người và mục.

Trong Elasticsearch, có vẻ như bạn có thể biến Person thành tài liệu lồng nhau của Item, sau đó sử dụng has_child.

Nhưng: nếu bạn cập nhật một người, tôi nghĩ bạn cần phải cập nhật mọi mục mà họ sở hữu (có thể rất nhiều).

Điều đó có đúng không? Có cách nào tốt đẹp để giải quyết truy vấn này trong Elasticsearch không?

+3

Chỉ một vấn đề thuật ngữ nhỏ: nếu bạn sử dụng 'has_child', người đó sẽ là tài liệu con, không phải tài liệu lồng nhau (cha/con so với tài liệu lồng nhau). – javanna

+0

chúng ta có thể sử dụng đầu nối ElasticSearch Hive để thực hiện thao tác JOIN từ Hive trên kho dữ liệu ElasticSearch không? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

Trả lời

13

Như đã đề cập, cách để đi là cha/con. Vấn đề là các tài liệu lồng nhau là cực kỳ hiệu quả nhưng để chúng được cập nhật, bạn cần gửi lại toàn bộ cấu trúc (parent + lồng nhau tài liệu). Mặc dù việc triển khai thực hiện nội bộ các tài liệu lồng nhau bao gồm các tài liệu lucene riêng biệt, các tài liệu lồng nhau đó không hiển thị hoặc không thể truy cập trực tiếp. Trong thực tế, khi sử dụng các tài liệu lồng nhau, bạn cần sử dụng các truy vấn thích hợp để truy cập chúng (truy vấn lồng nhau, bộ lọc lồng nhau, phần tử lồng nhau, v.v.).

Mặt khác, cha/mẹ cho phép bạn có các tài liệu riêng biệt tham chiếu với nhau, có thể được cập nhật độc lập. Nó có một chi phí về hiệu suất và bộ nhớ được sử dụng nhưng nó là cách linh hoạt hơn so với các tài liệu lồng nhau.

Như đã đề cập trong this article, thực tế là elasticsearch giúp bạn quản lý quan hệ không có nghĩa là bạn phải sử dụng các tính năng đó. Trong rất nhiều giai đoạn phức tạp, tốt hơn là nên có một số logic tùy chỉnh trên lớp ứng dụng xử lý các quan hệ. Trong khía cạnh cũng có những hạn chế với cha/con: ví dụ bạn không bao giờ có thể lấy lại cả cha và con cùng một lúc, trái ngược với các tài liệu lồng nhau không cho phép chỉ lấy lại các con phù hợp (hiện tại).

+1

+1 cho bài viết bạn đã tham chiếu. Tôi đã không nhìn thấy điều đó trước đây và nó làm cho một bản tóm tắt tuyệt vời của các điểm. – Phil

+0

chúng ta có thể sử dụng trình kết nối ElasticSearch Hive để thực hiện thao tác JOIN từ Hive trên kho dữ liệu ElasticSearch không? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

2

Hãy nhìn vào câu trả lời của tôi cho: In Elasticsearch, can multiple top-level documents share a single nested document?

này thảo luận về việc sử dụng các _parent lập bản đồ như là một cách để tránh vấn đề với cần phải cập nhật mỗi mục khi một người được cập nhật.

+0

chúng ta có thể sử dụng trình kết nối ElasticSearch Hive để thực hiện thao tác JOIN từ Hive trên kho dữ liệu ElasticSearch không? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

+0

@ krishna222 có thể đáng để đặt câu hỏi mới để nhận câu trả lời liên quan đến trình kết nối Hive – Phil

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