Trong các bài viết trước đây về Elasticsearch, chúng ta đã cùng nhau tìm hiểu về các cách thức tìm kiếm có thể áp dụng được với search engine này, đó là tìm kiếm cơ bản với các thuộc tính có sẵn hoặc các truy vấn phức tạp hơn với DSL. Tuy nhiên, ngoài các hình thức tìm kiếm này, bạn có biết rằng SQL cũng có thể được sử dụng để tìm kiếm dữ liệu. Dưới đây sẽ là một vài phân tích mà Stringee mang đến cho các bạn về cách sử dụng SQL trong việc thao tác với dữ liệu Elasticsearch.

>>> Xem thêm bài viết trong chuỗi bài hướng dẫn tìm hiểu ngôn ngữ lập trình Elasticsearch:

1. API tìm kiếm sử dụng SQL

1.1. Sử dụng SQL để tìm kiếm

Elasticsearch bao gồm một tính năng cho phép nó có thể thực thi các câu lệnh SQL với các index và trả về kết quả dưới dạng bảng.

Cú pháp cơ bản để thực thi câu lệnh này sẽ là:

POST _sql?format=txt
{
  "query": "<sql_query>"
}

Tại đây, chúng ta có thể thực hiện hai loại request là GET và POST. Nên nhớ rằng, nếu các tính năng bảo mật của Elasticsearch được bật, bạn phải có quyền read đối với index hay alias mà chúng ta sẽ thực hiện tìm kiếm.

1.2. Tùy chỉnh câu truy vấn

Chúng ta còn có thể thay đổi một số biến dưới đây vào sau câu truy vấn để định dạng cho truy vấn của mình:

delimiter: ký tự tách biệt cho các cột kết quả trả về nếu định dạng trả về là csv, mặc định là dấu “,”. API này chỉ hỗ trợ biến này cho kết quả trả về có dạng CSV.

format: format response trả về, các định dạng hỗ trợ hiện nay là csv, json, tsv, txt, yaml, cbor, smile. 

Ngoài ra, chúng ta hoàn toàn có thể format kết quả trả về bằng cách sử dụng header Accept trong request http. Nếu cả hai cách này được sử dụng, biến format sẽ được ưu tiên.

Cũng giống như câu lệnh tìm kiếm chúng ta đã tìm hiểu ở bài viết trước, search API SQL của Elasticsearch cũng cho phép chúng ta truyền nhiều tùy chọn vào body của câu truy vấn, dưới đây là một vài tùy chọn phổ biến mà chúng ta có thể sử dụng:

fetch_size: số lượng tối đa dòng có thể được trả về trong một response, mặc định là 1000

filter: truy vấn DSL được sử dụng để filter các document trả về bởi câu truy vấn DSL

params: giá trị cho các biến được truyền trong câu truy vấn

query: câu truy vấn SQL để chạy

request_timeout: thời gian request sẽ bị tính là timeout nếu không thực hiện xong, mặc định là 90 giây

1.3. Kết quả trả về

Như chúng ta đã thấy ở trên, API này hỗ trợ rất nhiều loại format dữ liệu trả về. Đa số format được sử dụng là các kiểu dữ liệu có dạng bảng. 

Dưới đây, chúng ta có thể tham khảo truy vấn sau. Truy vấn này được thực hiện trên index chúng ta đã cùng nhau tìm hiểu và xây dựng từ những ngày đầu. Việc sử dụng SQL trong Elasticsearch yêu cầu việc mappings của index phải có các trường chúng ta tìm kiếm. Nếu bạn đọc lần đầu đến với bài viết này của Stringee, đừng ngần ngại xem lại các bài viết trước để chúng ta có thể áp dụng được những kiến thức mới này một cách thuận lợi nhất nhé.

GET _sql?format=txt
{
  "query": """
  SELECT * FROM "index-01"
  """
}

Và chúng ta sẽ thu lại được kết quả như sau:

>>> Xem thêm bài viết:

Bài 1: Giới thiệu về Elastic Search

Bài 2: Hướng dẫn cài đặt ElasticSearch + Kibana

Bài 3: Tạo index, tạo mapping, CRUD trong Elasticsearch

2. Sử dụng API biên dịch từ SQL thành DSL

Ngoài cách sử dụng truy vấn SQL trực tiếp trong truy vấn tìm kiếm dữ liệu, chúng ta hoàn toàn có thể sử dụng nó theo một cách khác. Đó là biên dịch câu truy vấn SQL thành một câu truy vấn DSL được hỗ trợ bởi Elasticsearch và sau đó sử dụng lại chính truy vấn được sinh ra này để tìm kiếm dữ liệu.

Nghe có vẻ thì dễ, để tóm gọn lại ý tưởng cho cách thực hiện này, chúng ta sẽ thực hiện theo trình tự như sau:

Bước 1: Gọi API translate SQL của Elasticsearch để biên dịch ra câu DSL

Bước 2: Sử dụng câu DSL để tìm kiếm

Tất nhiên là tìm kiếm bằng DSL là việc rất đơn giản, nhưng làm sao để có thể sinh ra được câu truy vấn này từ SQL. Chính vì thế, chúng ta sẽ cần sử dụng đế API SQL translate của Elasticsearch. Cú pháp cơ bản của nó sẽ như sau:

POST /_sql/translate
{
  "query": "<sql_query>",
  "fetch_size": <num_document>
}

Chúng ta sẽ thử biên dịch lại câu truy vấn đã sử dụng ở phần trước sang DSL xem kết quả sẽ như thế nào nhé. Yêu cầu biên dịch sẽ là:

POST /_sql/translate
{
  "query": """
  SELECT * FROM "index-01"
  """
}

API sẽ trả về kết quả như sau:

{
  "size": 1000,
  "_source": false,
  "fields": [
    {
      "field": "age"
    },
    {
      "field": "email"
    },
    {
      "field": "id"
    },
    {
      "field": "name"
    }
  ],
  "sort": [
    {
      "_doc": {
        "order": "asc"
      }
    }
  ],
  "track_total_hits": -1
}

Đây sẽ là câu truy vấn DSL chúng ta có thể sử dụng để tìm kiếm dữ liệu, nếu dùng nó để tìm kiếm:

GET index-01/_search
{
  "size": 1000,
  "_source": false,
  "fields": [
    {
      "field": "age"
    },
    {
      "field": "email"
    },
    {
      "field": "id"
    },
    {
      "field": "name"
    }
  ],
  "sort": [
    {
      "_doc": {
        "order": "asc"
      }
    }
  ],
  "track_total_hits": -1
}

Ta sẽ thu được kết quả như sau:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "max_score": null,
    "hits": [<hits>]
  }
}

Kết bài

Trên đây là các chia sẻ của Stringee về cách hoạt động cũng như làm sao để chúng ta có thể sử dụng một loại truy vấn rất thông dụng trong ngành IT hiện nay đó là SQL trong việc tìm kiếm dữ liệu với Elasticsearch. Mong rằng đây sẽ là những thông tin có ích cho bạn trong quá trình tìm hiểu và sử dụng công cụ này.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: