Hướng dẫn sử dụng Elasticsearch cơ bản

Elasticsearch cung cấp một giao diện HTTP RESTful để tương tác với các thao tác. Hiểu về tính chất bất biến (idempotent) và không bất biến của các yêu cầu là rất quan trọng. Một thao tác được coi là bất biến nếu việc lặp lại nó nhiều lần cho kết quả giống như thực hiện một lần. Trong các yêu cầu REST, GET, PUT, DELETE thường là bất biến, còn POST thì không.

1. Thao tác với Index

1.1. Tạo Index

Tạo một index trong Elasticsearch tương tự như việc tạo một cơ sở dữ liệu trong hệ quản trị cơ sở dữ liệu quan hệ. Sử dụng phương thức PUT với tên index mong muốn.


PUT http://localhost:9200/products

Phản hồi thành công sẽ có dạng:


{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "products"
}

1.2. Xem tất cả Indices

Sử dụng phương thức GET để liệt kê tất cả các index hiện có.


GET http://localhost:9200/_cat/indices?v

Kết quả sẽ hiển thị thông tin chi tiết về các index, bao gồm trạng thái, tên, số lượng tài liệu, v.v.

1.3. Xem một Index cụ thể

Để xem thông tin về một index cụ thể, sử dụng phương thức GET với tên index.


GET http://localhost:9200/products

1.4. Xóa Index

Sử dụng phương thức DELETE để xóa một index.


DELETE http://localhost:9200/products

2. Thao tác với Document

Document trong Elasticsearch tương đương với một bản ghi dữ liệu trong cơ sở dữ liệu quan hệ, và thường có định dạng JSON.

2.1. Thêm Document

Sử dụng phương thức POST để thêm một document mới. Elasticsearch sẽ tự động tạo một ID duy nhất nếu bạn không chỉ định.


POST http://localhost:9200/products/_doc

Nội dung yêu cầu dạng JSON:


{
 "product_name": "Smartphone X",
 "brand": "BrandA",
 "image_url": "http://example.com/img/smartphone_x.jpg",
 "price": 1500.00
}

Bạn cũng có thể chỉ định ID cho document bằng phương thức PUT hoặc POST.


PUT http://localhost:9200/products/_doc/sku12345

2.2. Lấy Document

Để lấy một document, bạn cần chỉ định ID của nó.


GET http://localhost:9200/products/_doc/sku12345

2.3. Cập nhật Document

Sử dụng phương thức POST để cập nhật một document hiện có. Nội dung yêu cầu sẽ chứa các trường cần thay đổi.


POST http://localhost:9200/products/_doc/sku12345

Nội dung yêu cầu dạng JSON:


{
 "product_name": "Smartphone X Pro",
 "brand": "BrandA",
 "image_url": "http://example.com/img/smartphone_x_pro.jpg",
 "price": 1700.00
}

2.4. Cập nhật một phần Document

Để cập nhật chỉ một số trường của document, sử dụng endpoint _update.


POST http://localhost:9200/products/_update/sku12345

Nội dung yêu cầu dạng JSON, sử dụng khóa doc:


{
 "doc": {
  "price": 1650.00
 }
}

2.5. Xóa Document

Sử dụng phương thức DELETE với ID của document để xóa nó.


DELETE http://localhost:9200/products/_doc/sku12345

2.6. Xóa Document theo điều kiện

Sử dụng endpoint _delete_by_query với phương thức POST và một truy vấn để xóa nhiều document cùng lúc.


POST http://localhost:9200/products/_delete_by_query

Nội dung yêu cầu dạng JSON, định nghĩa truy vấn:


{
    "query": {
        "match": {
            "price": 1500.00
        }
    }
}

3. Thao tác với Mapping

Mapping trong Elasticsearch định nghĩa cấu trúc của các document trong một index, tương tự như schema của một bảng trong cơ sở dữ liệu quan hệ.

3.1. Tạo Mapping

Sử dụng phương thức PUT để định nghĩa mapping cho một index. Nếu index chưa tồn tại, việc tạo mapping có thể kèm theo việc tạo index.


PUT http://localhost:9200/users/_mapping

Nội dung yêu cầu dạng JSON:


{
 "properties": {
    "user_name":{
    "type": "text",
    "index": true
    },
     "gender":{
     "type": "keyword",
     "index": false
     },
     "age":{
     "type": "integer",
     "index": false
     }
 }
}

3.2. Xem Mapping

Sử dụng phương thức GET để xem mapping của một index.


GET http://localhost:9200/users/_mapping

3.3. Tạo Index với Mapping và Settings

Bạn có thể tạo một index mới kèm theo cấu hình settings và mappings trong một yêu cầu.


PUT http://localhost:9200/user_profiles

Nội dung yêu cầu dạng JSON, bao gồm cả settingsmappings:


{
 "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
 },
 "mappings": {
     "properties": {
        "full_name":{
         "type": "text"
        },
        "user_id":{
         "type": "keyword"
        },
        "join_date":{
         "type": "date"
        }
    }
 }
}

4. Truy vấn nâng cao

4.1. Truy vấn tất cả Documents

Sử dụng truy vấn match_all để lấy tất cả các documents.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query":{
        "match_all":{}
    }
}

4.2. Truy vấn theo từ khóa (Match Query)

Truy vấn match tìm kiếm các document chứa từ khóa được chỉ định trong một hoặc nhiều trường. Elasticsearch sẽ phân tích (analyze) từ khóa trước khi tìm kiếm.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query":{
        "match": {
            "user_name":"Alice Smith"
        }
    }
}

4.3. Truy vấn đa trường (Multi Match Query)

Truy vấn multi_match cho phép tìm kiếm một từ khóa trên nhiều trường khác nhau.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query": {
        "multi_match": {
            "query": "Bob",
            "fields":["user_name", "nickname"]
        }
    }
}

4.4. Truy vấn chính xác (Term Query)

Truy vấn term thực hiện tìm kiếm chính xác một giá trị mà không phân tích nó. Thường dùng cho các trường dạng keyword.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query": {
        "term": {
            "user_id": "user101"
        }
    }
}

4.5. Truy vấn nhiều giá trị chính xác (Terms Query)

Truy vấn terms tương tự term nhưng cho phép chỉ định nhiều giá trị để khớp.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query": {
        "terms": {
            "user_id":["user101", "user102"]
        }
    }
}

4.6. Lọc và Trả về các trường chỉ định (_source Filtering)

Bạn có thể chỉ định những trường nào muốn lấy về trong kết quả tìm kiếm bằng cách sử dụng _source.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "_source": ["user_name", "email"],
    "query": {
        "terms": {
            "user_id": ["user101"]
        }
    }
}

4.7. Lọc các trường không mong muốn (_source Filtering Exclude)

Tương tự như trên, bạn có thể loại trừ các trường không muốn hiển thị.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "_source": {
        "includes": ["user_name", "join_date"],
        "excludes": ["gender", "age"]
    },
    "query": {
        "terms":{
            "user_id": ["user101"]
        }
    }
}

4.8. Truy vấn kết hợp (Boolean Query)

Truy vấn bool cho phép kết hợp nhiều loại truy vấn khác nhau bằng các mệnh đề must, must_not, và should.


GET http://localhost:9200/users/_search

Nội dung yêu cầu dạng JSON:


{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "user_name": "Charlie"
                    }
                }
            ],
            "must_not":[
                {
                    "match":{
                        "age": 30
                    }
                }
            ],
            "should":[
                {
                    "term":{
                        "gender": "male"
                    }
                }
            ]
        }
    }
}

4.9. Truy vấn theo phạm vi (Range Query)

Truy vấn range dùng để tìm kiếm các document có giá trị nằm trong một khoảng xác định, áp dụng cho trường số hoặc ngày tháng.


GET http://localhost:9200/products/_search

Nội dung yêu cầu dạng JSON:


{
    "query": {
        "range": {
            "price": {
                "gte": 1000,
                "lte": 2000,
                "format": "strict_date_optional_time||epoch_millis"
            }
        }
    }
}

Thẻ: Elasticsearch REST API indexing document mapping

Đăng vào ngày 27 tháng 8 lúc 06:55