has_child
Query trong Elasticsearch và OpenSearchBài viết này sẽ hướng dẫn bạn cách sử dụng has_child query
trong Elasticsearch và OpenSearch để quản lý dữ liệu cha-con một cách hiệu quả. Chúng ta sẽ khám phá các use case thực tế, cách thiết lập mối quan hệ cha-con, và các phương pháp truy vấn dữ liệu liên quan. Nếu bạn đang làm việc với dữ liệu có cấu trúc phức tạp và cần truy vấn dựa trên mối quan hệ giữa các document, bài viết này sẽ cung cấp cho bạn những kiến thức và kỹ năng cần thiết.
Trong Elasticsearch và OpenSearch, quan hệ cha-con cho phép bạn liên kết các documents theo cấu trúc phân cấp. Điều này rất hữu ích khi bạn có các thực thể liên quan đến nhau, ví dụ: một bài viết blog (cha) và các bình luận (con), hoặc một đơn hàng (cha) và các sản phẩm trong đơn hàng (con). Khác với nested objects, các child documents trong mô hình cha-con là những document độc lập, có thể được cập nhật và truy vấn riêng rẽ, nhưng vẫn duy trì mối liên kết với parent document.
Mô hình cha-con đặc biệt hữu ích trong các tình huống sau:
join field
Để thiết lập quan hệ cha-con, bạn cần sử dụng join field
trong mapping của index. join field
sẽ định nghĩa mối quan hệ giữa parent và child types.
Hãy xem xét ví dụ về một diễn đàn hỏi đáp, nơi mỗi câu hỏi có thể có nhiều câu trả lời. Chúng ta sẽ định nghĩa một index có hai types: question
(cha) và answer
(con).
**Bước 1: Tạo Index và Mapping:**
PUT /my_index
{
"mappings": {
"properties": {
"content": {
"type": "text"
},
"join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
Trong đoạn code trên, chúng ta định nghĩa join_field
với relations
chỉ ra rằng type question
là parent của type answer
.
**Bước 2: Index Parent Document (Câu Hỏi):**
PUT /my_index/_doc/1
{
"content": "Đây là một câu hỏi",
"join_field": {
"name": "question"
}
}
Chúng ta index một document thuộc type question
. Lưu ý, thuộc tính name
trong join_field
phải là "question" để chỉ định đây là parent document.
**Bước 3: Index Child Document (Câu Trả Lời):**
PUT /my_index/_doc/2?routing=1
{
"content": "Đây là một câu trả lời",
"join_field": {
"name": "answer",
"parent": 1
}
}
Chúng ta index một document thuộc type answer
. Thuộc tính name
trong join_field
là "answer", và thuộc tính parent
chứa ID của parent document (trong trường hợp này là 1). Quan trọng nhất là phải sử dụng tham số routing
với giá trị là ID của parent document. Điều này đảm bảo rằng child document được lưu trữ trên cùng shard với parent document, tối ưu hóa hiệu suất truy vấn.
has_child
và has_parent
QueriesElasticsearch và OpenSearch cung cấp hai loại query chính để truy vấn dữ liệu cha-con: has_child
và has_parent
.
has_child
Query: Tìm Parent Documents dựa trên Child Documentshas_child
query trả về các parent documents có ít nhất một child document thỏa mãn điều kiện truy vấn. Điều này rất hữu ích khi bạn muốn tìm các câu hỏi có câu trả lời chứa một từ khóa cụ thể.
GET /my_index/_search
{
"query": {
"has_child": {
"type": "answer",
"query": {
"match": {
"content": "một câu trả lời"
}
}
}
}
}
Query này sẽ trả về tất cả các câu hỏi có ít nhất một câu trả lời chứa cụm từ "một câu trả lời".
has_parent
Query: Tìm Child Documents dựa trên Parent Documentshas_parent
query trả về các child documents có parent document thỏa mãn điều kiện truy vấn. Điều này hữu ích khi bạn muốn tìm tất cả các câu trả lời cho một câu hỏi có chứa một từ khóa cụ thể.
GET /my_index/_search
{
"query": {
"has_parent": {
"parent_type": "question",
"query": {
"match": {
"content": "câu hỏi"
}
}
}
}
}
Query này sẽ trả về tất cả các câu trả lời cho các câu hỏi có chứa từ "câu hỏi".
Mặc dù quan hệ cha-con mang lại nhiều lợi ích, bạn cần lưu ý một số điểm quan trọng sau:
routing
khi index.has_child
và has_parent
có thể chậm hơn các query khác do phải thực hiện join. Hãy cân nhắc denormalize dữ liệu nếu hiệu suất là yếu tố quan trọng.has_child query
trong Elasticsearch và OpenSearch là một công cụ mạnh mẽ để quản lý và truy vấn dữ liệu có cấu trúc phân cấp. Bằng cách hiểu rõ cách thiết lập quan hệ cha-con và sử dụng các query phù hợp, bạn có thể tận dụng tối đa sức mạnh của mô hình dữ liệu này để giải quyết các bài toán phức tạp.
Bài viết liên quan