Thực hiện query trên Elasticsearch
Bài đăng này đã không được cập nhật trong 5 năm
Trong bài viết Tìm hiểu về Elasticsearch lần trước, chúng ta đã biết được Elasticsearch là một Search Engine rất mạnh mẽ, có thể tìm kiếm trên hệ thống phân tán và đạt được performance cao khi tìm kiếm. Bài viết hôm nay, mình sẽ chia sẻ về cách cài đặt và các query trên Elasticsearch từ cơ bản đến nâng cao
1. Cài đặt môi trường cho Elasticsearch
a. Yêu cầu về môi trường
Về môi trường cài đặt, Elasticsearch có thể cài đặt vào hoạt động được trên những thiết bị hoặc hệ thống cài đặt môi trường JVM (Java Virtual Machine). Để cài môi trường Java, vui lòng tham khảo hướng dẫn này.
b. Cài đặt Elasticsearch (Ubuntu)
Cách 1: Sử dụng bản debian
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.deb
sudo dpkg -i elasticsearch-6.5.4.deb
- Để khởi động Elasticsearch:
sudo systemctl start elasticsearch
- Để dừng service của Elasticsearch:
sudo systemctl stop elasticsearch
Cách 2: Sử dụng bản nén (.tar.gz):
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz
tar -xvf elasticsearch-6.5.4.tar.gz
cd elasticsearch-6.5.4
bin/elasticsearch
Sau khi cài đặt thành công, có thể vào đường dẫn localhost:9200 để kiểm tra.
2. Query trên Elasticsearch
1.1. Index API
- Tạo
mappings
cho index:
curl -X PUT 'localhost:9200/posts' -H 'Content-Type: application/json' -d'
{
"mappings": {
"post": {
"properties": {
"id": {"type": "keyword"},
"title": {"type": "text"},
"content": {"type": "text"},
"published_at": {"type": "date"}
}
}
}
}'
- Thêm mới hoặc update 1
document
:
curl -X PUT 'localhost:9200/posts/post/1' -H 'Content-Type: application/json' -d'
{
"id": "1",
"title": "The first post",
"content": "Welcome to ES",
"published_at": "2019-05-11T10:00:00"
}'
Mỗi index
chỉ có thể tạo mappings
một lần duy nhất, vì vậy chúng ta không thể thay đổi lại tên trường cũng như kiểu của trường đó. Nhưng có thể thêm những trường khác tùy ý, chỉ cần lúc insert hoặc update dữ liệu, hãy thêm vào chuỗi JSON body là được. Ví dụ, request sau vẫn sẽ thỏa mãn:
curl -X PUT 'localhost:9200/posts/post/1' -H 'Content-Type: application/json' -d'
{
"id": "1",
"title": "The first post",
"content": "Welcome to ES",
"published_at": "2019-05-11T10:00:00",
"updated_at": "2019-05-11T12:00:00"
}'
- Thêm mới hoặc update nhiều
document
:
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "posts", "_type" : "post", "_id" : "2" } }
{"id":"2","title":"The second post","content":"Welcome to ES","published_at":"2019-05-11T11:00:00"}
{ "index" : { "_index" : "posts", "_type" : "post", "_id" : "3" } }
{"id":"3","title":"The third post","content":"Welcome to ES","published_at":"2019-05-11T12:00:00"}
'
- Xem thông tin các
index
:
curl -X GET 'localhost:9200/_cat/indices?v'
1.2. Search API
match
query:match
query thuộc kiểu full-text query, kết quả trả về là nhữngdocument
match với một trong những từ trong điều kiện query. Ví dụ:
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"title": "the post"
}
}
}'
=> Kết quả phù hợp có thể là: The first, The post, the first post
term
query: Trả vềdocument
chứa từ trong điều kiện query. Không nên dùngterm
query đối với những trường dữ liệutext
. Chỉ nên dùng cho những trường hợp cần tìm kiếm một cách chính xác, ví dụ với những trường như: price, id, username,...
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"id": "1"
}
}
}'
wildcard
query: Trả về nhữngdocument
match với chuỗi wildcard expression. Hỗ trợ với*
khớp với chuỗi kí tự bất kì (có thể rỗng),?
khớp với một kí tự đơn.
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"wildcard": {
"title": "fi*"
}
}
}'
=> Những title
match có thể là: the first, the film,...
range
query: Dùng trong trường hợp so sánh các dữ liệu kiểu numeric, datetime. Ví dụ như: thực hiện tìm kiếm những bàipost
có ngàypublished_at
trong ngày2019-05-10
:
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"published_at": {
"lte": "2019-05-10T23:59:59",
"gte": "2019-05-10T00:00:00"
}
}
}
}'
bool
query: Dùng để kết hợp nhiều câu query lại với nhau bằng những mệnh đề:should
(or),must
(and):
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [{
"match": {
"title": "first post"
}
},
{
"range": {
"published_at": {
"lte": "2019-05-10T23:59:59",
"gte": "2019-05-10T00:00:00"
}
}
}]
}
}
}'
sort
: Thực hiện sắp xếp kết quả trả về:
curl -X POST "localhost:9200/posts/_search?pretty" -H 'Content-Type: application/json' -d'
{
"sort": [
{"publish_at": "desc"},
"_score"
],
"query": {
"term": {
"title": "post"
}
}
}'
from
vàsize
: Cho phép giới hạn số lượng kết quả trả về và vị trí bắt đầu lấy kết quả:
curl -X POST "localhost:9200/posts/_search?pretty&from=10&size=10" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} }
}'
Kết quả của query trên sẽ lấy những document
từ vị trí thứ 10-20 được lưu trong index
.
1.3. Aggregation API
Được thiết kế phục vụ cho việc tính toán, phân tích dữ liệu tập hợp trên Elasticsearch. Elasticsearch hỗ trợ rất nhiều hàm liên quan đến tập hợp, thống kê điển hình như: avg
, min
, max
, sum
, count
,...
Ví dụ: Tính trung bình giá của tất cả các sản phẩm:
curl -X POST "localhost:9200/posts/_search?size=0" -H 'Content-Type: application/json' -d'
{
"aggs": {
"avg_price": { "avg": { "field": "price" } }
}
}'
Kết luận
Trên đây là những API thường hay được sử dụng trong Elasticsearch. Nếu muốn tìm hiểu thêm, xin vui lòng truy cập tài liệu tham khảo phía dưới. Cảm ơn vì đã đọc bài viết này.
Tham khảo
Elasticsearch - Query DSL Elasticsearch - Aggregation API https://viblo.asia/p/23-cau-truy-van-huu-ich-trong-elasticsearch-phan-1-Ljy5VoMbKra
All rights reserved