0

[Elasticsearch - CLI] Tìm Kiếm Trong Elasticsearch

Chúng ta đã học cách tạo indices, định nghĩa mapping types, và thêm documents. Nhưng phần thực sự quan trọng và thú vị nhất của Elasticsearch chính là search! Bây giờ, chúng ta sẽ tìm hiểu về cách thực hiện tìm kiếm trong Elasticsearch.

Trước tiên, để thử nghiệm các tính năng tìm kiếm khác nhau, hãy tải thêm dữ liệu vào Elasticsearch cluster từ tệp books-and-authors-bulk.json bằng Bulk Document API:

$ http POST https://localhost:9200/_bulk < books-and-authors-bulk.json

Tìm Kiếm Đơn Giản Bằng Query String

Khi đã có dữ liệu, chúng ta có thể bắt đầu thực hiện truy vấn tìm kiếm bằng cách sử dụng Search API với tham số truy vấn được gửi qua query string trên URI.

Ví dụ, nếu chúng ta muốn tìm kiếm từ khóa "engine" (liên quan đến cụm từ search engine), chúng ta có thể thực hiện:

$ http POST https://localhost:9200/catalog/books/_search?q=engine

Kết quả trả về (rút gọn)

{
  "_shards": {
    "failed": 0,
    "successful": 5,
    "total": 5
  },
  "hits": {
    "total": 1,
    "max_score": 0.7503276,
    "hits": [
      {
        "_index": "catalog",
        "_type": "books",
        "_id": "978-1449358549",
        "_score": 0.7503276,
        "_source": {
          "title": "Elasticsearch: The Definitive Guide.",
          "categories": [
            { "name": "analytics" },
            { "name": "search" },
            { "name": "database store" }
          ],
          "publisher": "O’Reilly",
          "published_date": "2015-02-07",
          "isbn": "978-1449358549",
          "rating": 4
        }
      }
    ]
  },
  "timed_out": false,
  "took": 22
}

Đây là một khởi đầu tuyệt vời! Query String Search API rất tiện lợi khi thực hiện các tìm kiếm nhanh chóng, nhưng nó có những hạn chế đáng kể. Nếu chúng ta muốn thực hiện các truy vấn nâng cao hơn, Request Body Search API sẽ là lựa chọn mạnh mẽ hơn.

Tìm Kiếm Bằng Request Body Search API

Thay vì gửi truy vấn trong query string, chúng ta có thể sử dụng JSON-based Query DSL, giúp xây dựng các truy vấn phức tạp một cách dễ dàng hơn.

Có rất nhiều loại queryQuery DSL hỗ trợ, mỗi loại có cú pháp và tham số riêng. Tuy nhiên, có một số tham số chung mà chúng ta có thể sử dụng trong hầu hết các truy vấn, chẳng hạn như:

  • sort: Sắp xếp kết quả
  • from: Bỏ qua một số kết quả đầu tiên
  • size: Giới hạn số kết quả trả về
  • stored_fields: Chỉ định các trường cần lấy về

Dưới đây là một truy vấn đơn giản sử dụng match_all query, tìm kiếm tất cả các tài liệu trong books index:

$ curl -i https://localhost:9200/catalog/books/_search?pretty -d '
{
  "size": 10,
  "query": {
    "match_all": {}
  }
}'

Kết quả trả về (rút gọn)

{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "catalog",
        "_type": "books",
        "_id": "978-1449358549",
        "_score": 1.0,
        "_source": {
          "title": "Elasticsearch: The Definitive Guide.",
          "publisher": "O’Reilly"
        }
      }
    ]
  }
}

Tuy match_all query không lọc dữ liệu, nhưng nó hữu ích để kiểm tra số lượng tài liệu trong một index.

Vậy là chúng ta đã có cái nhìn tổng quan về cách thực hiện tìm kiếm trong Elasticsearch. Trong các phần tiếp theo, chúng ta sẽ đi sâu hơn vào Query DSL, tìm hiểu cách sử dụng các loại query nâng cao để có kết quả tìm kiếm chính xác hơn! 🚀


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí