Hướng Dẫn Sử Dụng Elasticsearch APIs Hiệu Quả

Ashley Innocent

Ashley Innocent

24 tháng 3 2026

Hướng Dẫn Sử Dụng Elasticsearch APIs Hiệu Quả

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Tóm tắt

Các API của Elasticsearch cung cấp khả năng tìm kiếm và phân tích ở quy mô lớn. Bạn lập chỉ mục tài liệu dưới dạng JSON, truy vấn bằng một DSL mạnh mẽ và tổng hợp kết quả để phân tích. Xác thực sử dụng khóa API hoặc xác thực cơ bản. Để kiểm thử, hãy sử dụng Apidog để xác thực ánh xạ chỉ mục, kiểm thử các truy vấn tìm kiếm và gỡ lỗi tổng hợp trước khi triển khai lên các cụm sản xuất.

Giới thiệu

Elasticsearch là một công cụ tìm kiếm và phân tích phân tán. Nó xử lý văn bản có cấu trúc, nhật ký, số liệu và nhiều hơn nữa. Các công ty sử dụng nó để tìm kiếm toàn văn trong ứng dụng, phân tích nhật ký để gỡ lỗi và bảng điều khiển phân tích thời gian thực.

Elasticsearch nằm ở trung tâm của bộ ELK (Elasticsearch, Logstash, Kibana). Nhưng bạn có thể sử dụng nó trực tiếp qua API mà không cần Logstash.

💡
Nếu bạn đang xây dựng các tính năng tìm kiếm hoặc phân tích nhật ký, Apidog giúp bạn kiểm thử các truy vấn, xác thực ánh xạ và gỡ lỗi tổng hợp. Bạn có thể lưu các mẫu tìm kiếm và chia sẻ chúng với nhóm của mình.
button

Kiểm thử API Elasticsearch với Apidog - miễn phí

Đến cuối hướng dẫn này, bạn sẽ có thể:

Bắt đầu

Chạy Elasticsearch cục bộ

# Docker
docker run -p 9200:9200 \
  -e "discovery.type=single-node" \
  elasticsearch:8.11.0

# Or download from elastic.co

Xác minh cài đặt

curl -X GET "http://localhost:9200"

Phản hồi:

{
  "name": "elasticsearch-1",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "abc123",
  "version": {
    "number": "8.11.0",
    "build_flavor": "default"
  },
  "tagline": "You know, for search"
}

Xác thực

Elasticsearch 8.x yêu cầu xác thực theo mặc định:

curl -X GET "http://localhost:9200/_cluster/health" \
  -u elastic:your_password

Hoặc sử dụng khóa API (được tạo trong Kibana hoặc qua API).

Chỉ mục và tài liệu

Tạo một chỉ mục

curl -X PUT "http://localhost:9200/products" \
  -u elastic:your_password \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    },
    "mappings": {
      "properties": {
        "name": { "type": "text" },
        "price": { "type": "float" },
        "category": { "type": "keyword" },
        "in_stock": { "type": "boolean" },
        "created_at": { "type": "date" }
      }
    }
  }'

Lập chỉ mục một tài liệu

curl -X POST "http://localhost:9200/products/_doc" \
  -u elastic:your_password \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Wireless Headphones",
    "price": 79.99,
    "category": "electronics",
    "in_stock": true,
    "created_at": "2026-03-24T10:00:00Z"
  }'

Phản hồi:

{
  "_index": "products",
  "_id": "abc123",
  "_version": 1,
  "result": "created",
  "_seq_no": 0,
  "_primary_term": 1
}

Lấy một tài liệu

curl -X GET "http://localhost:9200/products/_doc/abc123" \
  -u elastic:your_password

Cập nhật một tài liệu

curl -X PUT "http://localhost:9200/products/_doc/abc123" \
  -u elastic:your_password \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Wireless Headphones Pro",
    "price": 99.99,
    "category": "electronics",
    "in_stock": true,
    "created_at": "2026-03-24T10:00:00Z"
  }'

Xóa một tài liệu

curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
  -u elastic:your_password

Các thao tác hàng loạt

Lập chỉ mục nhiều tài liệu một cách hiệu quả:

curl -X POST "http://localhost:9200/products/_bulk" \
  -u elastic:your_password \
  -H "Content-Type: application/x-ndjson" \
  -d '{"index":{"_id":"1"}}
{"name":"Product A","price":10.99,"category":"books","in_stock":true}
{"index":{"_id":"2"}}
{"name":"Product B","price":20.99,"category":"electronics","in_stock":false}
'

Truy vấn tìm kiếm

Tìm kiếm cơ bản

curl -X GET "http://localhost:9200/products/_search" \
  -u elastic:your_password \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "match": {
        "name": "headphones"
      }
    }
  }'

Truy vấn Bool

Kết hợp nhiều điều kiện:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "headphones" } }
      ],
      "filter": [
        { "term": { "category": "electronics" } },
        { "range": { "price": { "lte": 100 } } },
        { "term": { "in_stock": true } }
      ]
    }
  }
}

Tìm kiếm toàn văn với tính điểm

{
  "query": {
    "multi_match": {
      "query": "wireless audio headphones",
      "fields": ["name^2", "description"],
      "type": "best_fields",
      "fuzziness": "AUTO"
    }
  }
}

Tên trường với ^2 sẽ có trọng số gấp đôi khi tính điểm.

Tìm kiếm cụm từ

Tìm các cụm từ chính xác:

{
  "query": {
    "match_phrase": {
      "description": "noise canceling"
    }
  }
}

Ký tự đại diện và biểu thức chính quy

{
  "query": {
    "wildcard": {
      "name": "*headphone*"
    }
  }
}

Sắp xếp

{
  "query": { "match_all": {} },
  "sort": [
    { "price": "asc" },
    { "_score": "desc" }
  ]
}

Phân trang

{
  "from": 20,
  "size": 10,
  "query": { "match_all": {} }
}

Tổng hợp

Tổng hợp tính toán các thống kê tóm tắt trên dữ liệu của bạn.

Giá trung bình theo danh mục

curl -X GET "http://localhost:9200/products/_search" \
  -u elastic:your_password \
  -H "Content-Type: application/json" \
  -d '{
    "size": 0,
    "aggs": {
      "by_category": {
        "terms": { "field": "category" },
        "aggs": {
          "avg_price": { "avg": { "field": "price" } },
          "min_price": { "min": { "field": "price" } },
          "max_price": { "max": { "field": "price" } }
        }
      }
    }
  }'

Biểu đồ tần suất giá

{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 25
      }
    }
  }
}

Biểu đồ tần suất ngày

{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "created_at",
        "calendar_interval": "month"
      }
    }
  }
}

Lực lượng (số lượng duy nhất)

{
  "size": 0,
  "aggs": {
    "unique_categories": {
      "cardinality": { "field": "category" }
    }
  }
}

Ánh xạ và bộ phân tích

Loại trường

Loại Dùng cho
text Tìm kiếm toàn văn, được phân tích
keyword Giá trị chính xác, lọc, sắp xếp
integer, float Số
boolean Đúng/sai
date Ngày và giờ
object Đối tượng JSON lồng nhau
nested Mảng các đối tượng (duy trì mối quan hệ)
geo_point Tọa độ vĩ độ/kinh độ

Bộ phân tích tùy chỉnh

Để xử lý văn bản chuyên biệt:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "autocomplete_filter"]
        }
      },
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 20
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "standard"
      }
    }
  }
}

Quản lý cụm

Tình trạng cụm

curl -X GET "http://localhost:9200/_cluster/health"

Phản hồi:

{
  "cluster_name": "elasticsearch",
  "status": "green",
  "number_of_nodes": 3,
  "active_primary_shards": 25
}

Trạng thái:

Thống kê chỉ mục

curl -X GET "http://localhost:9200/_cat/indices?v"

Thống kê node

curl -X GET "http://localhost:9200/_nodes/stats"

Xóa bộ nhớ đệm

curl -X POST "http://localhost:9200/_cache/clear"

Kiểm thử với Apidog

Các truy vấn Elasticsearch có thể phức tạp. Hãy kiểm thử kỹ lưỡng.

1. Lưu các truy vấn phổ biến

Lưu trữ các mẫu tìm kiếm trong Apidog:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "{{search_field}}": "{{search_term}}" } }
      ],
      "filter": [
        { "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
      ]
    }
  }
}

2. Xác thực phản hồi

pm.test('Search returns results', () => {
  const response = pm.response.json()
  pm.expect(response.hits.total.value).to.be.above(0)
})

pm.test('Aggregations present', () => {
  const response = pm.response.json()
  pm.expect(response.aggregations).to.exist
})

3. Phân tách môi trường

# Local
ES_HOST: http://localhost:9200
ES_USER: elastic
ES_PASSWORD: your_password

# Production
ES_HOST: https://search.yourcompany.com
ES_API_KEY: prod_api_key

Kiểm thử API Elasticsearch với Apidog - miễn phí

Các lỗi và cách khắc phục phổ biến

403 Bị cấm

Nguyên nhân: Xác thực thất bại hoặc quyền không đủ.

Cách khắc phục: Xác minh thông tin đăng nhập. Kiểm tra xem khóa API có quyền truy cập chỉ mục chính xác hay không.

404 index_not_found_exception

Nguyên nhân: Chỉ mục không tồn tại.

Cách khắc phục: Tạo chỉ mục trước, hoặc sử dụng tính năng tự động tạo (được bật theo mặc định nhưng không khuyến nghị cho môi trường sản xuất).

circuit_breaking_exception

Nguyên nhân: Truy vấn sử dụng quá nhiều bộ nhớ.

Cách khắc phục: Giảm tham số size, đơn giản hóa truy vấn, thêm bộ lọc để giảm tập kết quả.

search_phase_execution_exception

Nguyên nhân: Lỗi cú pháp truy vấn.

Cách khắc phục: Kiểm tra JSON của bạn. Các vấn đề thường gặp: thiếu dấu ngoặc kép, đường dẫn trường không chính xác.

Các lựa chọn thay thế và so sánh

Tính năng Elasticsearch OpenSearch Meilisearch Typesense
Cài đặt Tự lưu trữ Tự lưu trữ Một tệp nhị phân duy nhất Một tệp nhị phân duy nhất
Chất lượng tìm kiếm Xuất sắc Tốt Xuất sắc Tốt
Đường cong học tập Dốc Dốc Dễ dàng Dễ dàng
Khả năng mở rộng Xuất sắc Xuất sắc Tốt Tốt
Dịch vụ đám mây Elastic Cloud OpenSearch Serverless Meilisearch Cloud Typesense Cloud

Elasticsearch có nhiều tính năng và cộng đồng lớn nhất. Meilisearch và Typesense đơn giản hơn cho các tìm kiếm cơ bản.

Các trường hợp sử dụng thực tế

Tìm kiếm thương mại điện tử. Một trang web bán lẻ lập chỉ mục 100.000 sản phẩm. Người dùng tìm kiếm theo tên, mô tả, danh mục và khoảng giá. Tự động hoàn thành gợi ý sản phẩm khi họ nhập. Bộ lọc thu hẹp kết quả theo danh mục và tình trạng có sẵn.

Nhật ký ứng dụng. Một nhóm DevOps gửi nhật ký đến Elasticsearch qua Filebeat. Các kỹ sư tìm kiếm nhật ký theo dịch vụ, mức độ nghiêm trọng và khoảng thời gian. Bảng điều khiển hiển thị tỷ lệ lỗi và thời gian phản hồi.

Phân tích bảo mật. Một nhóm bảo mật lập chỉ mục nhật ký mạng. Họ tìm kiếm các địa chỉ IP đáng ngờ, trực quan hóa các mẫu lưu lượng và cảnh báo về các bất thường được phát hiện thông qua tổng hợp.

Tóm tắt lại

Đây là những gì bạn đã học:

Các bước tiếp theo của bạn:

  1. Chạy Elasticsearch cục bộ
  2. Tạo một chỉ mục với ánh xạ
  3. Lập chỉ mục một số tài liệu kiểm thử
  4. Viết các truy vấn tìm kiếm
  5. Thử các tổng hợp

Kiểm thử API Elasticsearch với Apidog - miễn phí

button

Câu hỏi thường gặp

Sự khác biệt giữa Elasticsearch và Solr là gì?Cả hai đều là công cụ tìm kiếm dựa trên Lucene. Elasticsearch có thiết kế phân tán và API tốt hơn. Solr có nhiều tính năng dành cho doanh nghiệp hơn. Hầu hết các dự án mới đều chọn Elasticsearch.

Làm thế nào để tôi xử lý các ký tự đặc biệt trong tìm kiếm?Thoát các ký tự đặc biệt: ()[]{}:^\"\\+-!~*?| bằng dấu gạch chéo ngược. Hoặc sử dụng simple_query_string dễ tính hơn.

Shard là gì?Shard là các phần của một chỉ mục. Mỗi shard là một chỉ mục Lucene. Các shard chính dùng để ghi, các shard bản sao là bản sao để mở rộng quy mô đọc và chịu lỗi.

Tôi nên tạo bao nhiêu shard?Quy tắc chung: 20-50GB cho mỗi shard. Bắt đầu với 1 shard chính, sau đó thêm các bản sao. Chỉ tăng số lượng shard chính khi cần (không thể giảm).

Tôi có thể thay đổi ánh xạ sau khi lập chỉ mục không?Một phần. Có thể thêm trường mới tự do. Để thay đổi loại trường hiện có, phải lập chỉ mục lại dữ liệu. Sử dụng mẫu chỉ mục để quản lý ánh xạ một cách nhất quán.

Tham số _routing là gì?Định tuyến tài liệu đến các shard cụ thể dựa trên giá trị trường. Mặc định là _id. Sử dụng định tuyến khi các truy vấn luôn lọc theo một trường cụ thể (như user_id) để có hiệu suất tốt hơn.

Làm thế nào để tôi xử lý dữ liệu dựa trên thời gian?Sử dụng các chỉ mục dựa trên ngày: logs-2026.03.24. Điều này cho phép bạn xóa dữ liệu cũ bằng cách loại bỏ các chỉ mục và cải thiện hiệu suất truy vấn bằng cách tìm kiếm ít chỉ mục hơn.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API