Các Truy Vấn Phức Tạp trong ElasticSearch

  • Truy vấn theo điều kiện

Truy vấn tất cả dữ liệu có tên là "Nguyễn Ba":

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 72

{
   "query": {
       "match": {
           "name": "Nguyễn Ba"
       }
   } 
}
  • Truy vấn tất cả dữ liệu
GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 53

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

Nếu lượng dữ liệu lớn, bạn có thể sử dụng truy vấn phân trang.

  • Truy vấn phân trang

Ví dụ: bắt đầu từ trang 0, mỗi trang hiển thị 3 kết quả.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 81

{
   "query": {
       "match_all": {}
   },
    "from": 0,
    "size": 3
}

Để chỉ định các trường cụ thể cần trả về, bạn có thể thêm "source": [xxx, xxx] vào yêu cầu. Ví dụ, chỉ muốn lấy trường name.

  • Truy vấn với các trường được chỉ định
GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 105

{
   "query": {
       "match_all": {}
   },
    "from": 0,
    "size": 3,
    "_source": ["name"]
}
  • Sắp xếp kết quả

Để sắp xếp, bạn chỉ cần thêm "sort" vào yêu cầu.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 184

{
   "query": {
       "match_all": {}
   },
    "from": 0,
    "size": 10,
    "_source": ["name", "age"],
    "sort": {
        "age": {
            "order": "asc"
        }
    }
}
  • Truy vấn với điều kiện AND (tương tự như AND trong SQL)

Truy vấn dữ liệu có tên là "Lê Năm" và tuổi là 30.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 260

{
   "query": {
       "bool": {
           "must": [
               {
                   "match": {
                       "age": 30
                   }
               },
               {
                   "match": {
                       "name": "Lê Năm"
                   }
               }
           ]
       }
   }
}
  • Truy vấn với điều kiện OR (tương tự như OR trong SQL)

Truy vấn dữ liệu có tên là "Lê Năm" hoặc tuổi là 30.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 260

{
   "query": {
       "bool": {
           "should": [
               {
                   "match": {
                       "age": 30
                   }
               },
               {
                   "match": {
                       "name": "Lê Năm"
                   }
               }
           ]
       }
   }
}
  • Truy vấn theo phạm vi

Truy vấn dữ liệu có tên là "Lê Bảy" hoặc "Lê Năm" và tuổi nằm trong khoảng từ 20 đến 35.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 454

{
   "query": {
       "bool": {
           "should": [
               {
                   "match": {
                       "name": "Lê Bảy"
                   }
               },
               {
                   "match": {
                       "name": "Lê Năm"
                   }
               }
           ],
           "filter": {
               "range": {
                   "age": {
                       "gt": 20,
                       "lt": 35
                   }
               }
           }
       }
   }
}
  • Truy vấn tổng hợp

Tổng hợp theo nhóm tuổi.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 180

{
    "aggs": {
        "age_group": {
            "terms": {
                "field": "age"
            }
        }
    },
    "size": 0
}

Kết quả trả về:

{
    "took": 29,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 5,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "age_group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 30,
                    "doc_count": 3
                },
                {
                    "key": 20,
                    "doc_count": 2
                }
            ]
        }
    }
}
  • Tính giá trị trung bình

Tính giá trị trung bình của trường age.

GET /_search HTTP/1.1
Host: http://127.0.0.1:9200/shopping
Content-Type: application/json
Content-Length: 180

{
    "aggs": {
        "age_avg": {
            "avg": {
                "field": "age"
            }
        }
    },
    "size": 0
}

Thẻ: Elasticsearch JSON REST API Query DSL Aggregation

Đăng vào ngày 6 tháng 8 lúc 21:08