Elasticsearch là gì? các câu truy vấn cơ bản như thế nào?
Elasticsearch là gì?
Elasticsearch là một hệ thống tìm kiếm và phân tích dữ liệu mã nguồn mở, được xây dựng trên nền tảng Apache Lucene. Nó được thiết kế để lưu trữ, tìm kiếm và phân tích lượng lớn dữ liệu một cách hiệu quả và linh hoạt, thường được sử dụng trong các ứng dụng tìm kiếm, phân tích log, và quản lý dữ liệu phân tán. Elasticsearch được phát triển và duy trì bởi Elastic.
Các câu truy vấn cơ bản trong Elasticsearch
Elasticsearch cung cấp một ngôn ngữ truy vấn mạnh mẽ gọi là Elasticsearch Query DSL để thực hiện các truy vấn. Vậy Elasticsearch Query DSL là gì?
Elasticsearch Query DSL là viết tắt của Elasticsearch Query Domain-Specific Language sử dụng cấu trúc JSON để định nghĩa các truy vấn và các phần khác của tác vụ tìm kiếm.
Dưới đây là một số câu truy vấn cơ bản trong Elasticsearch:
1. Match All Query
Match All Query dùng để lấy tất cả các tài liệu trong index
{
"query": {
"match_all": {}
}
}
2. Match Query
Match Query dùng để tìm kiếm các tài liệu có trường nào đó chứa một giá trị cụ thể
{
"query": {
"match": {
"field_name": "search_term"
}
}
}
Trong đó:
"field_name": là tên của trường bạn muốn tìm kiếm, "search_term": là nội dung bạn muốn tìm kiếm ở trong trường trên.
Như ví dụ trên thì sẽ trả về tất cả các tài liệu có trường "filed_name" chứa giá trị giống với "search_term".
Bạn cũng có thể thực hiện nhiều truy vấn match hoặc kết hợp chúng với các loại truy vấn khác để mở rộng chức năng tìm kiếm.
3. Term Query
Term Query dùng để tìm kiếm các tài liệu có trường cụ thể chứa một giá trị cụ thể
{
"query": {
"term": {
"field_name": "exact_value"
}
}
}
Trong đó: "exact_value": cần là giá trị chính xác, cụ thể như price, product_id, username. Tránh sử dụng Term Query cho text fields.
Term query không thực hiện quá trình phân tích (analysis) trên giá trị tìm kiếm, nó tìm kiếm dựa trên giá trị gốc mà không chấp nhận sự chia nhỏ thành các từ (tokenization) hoặc các biến đổi khác.
4. Bool Query
Trong Elasticsearch, bool query là một loại truy vấn cho phép bạn kết hợp nhiều điều kiện tìm kiếm để tạo ra các truy vấn phức tạp hơn. Các điều kiện này thường được xác định bởi các điều kiện con như must, must_not, should, và filter. Dưới đây là giải thích về chúng:
must
được sử dụng để chỉ định rằng tài liệu phải khớp với tất cả các điều kiện trong khối must.
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
]
}
}
}
Trong ví dụ này, tài liệu phải có giá trị "value1" trong trường "field1" và giá trị "value2" trong trường "field2".
must not
được sử dụng để chỉ định rằng tài liệu không được khớp với bất kỳ điều kiện nào trong khối must_not.
{
"query": {
"bool": {
"must_not": [
{ "match": { "field3": "value3" } },
{ "match": { "field4": "value4" } }
]
}
}
}
Trong ví dụ này, tài liệu không được phép có giá trị "value3" trong trường "field3" và không được phép có giá trị "value4" trong trường "field4"
should
should được sử dụng để xác định các điều kiện không bắt buộc. Nếu tài liệu khớp với bất kỳ điều kiện should nào, nó sẽ được xem xét và có thể được tăng điểm => khi search sẽ ưu tiên cho ra tài liệu này hơn. Tài liệu không nhất thiết phải khớp với bất kỳ điều kiện nào trong should.
{
"query": {
"bool": {
"should": [
{ "match": { "field5": "value5" } },
{ "range": { "field6": { "gte": 20 } } }
]
}
}
}
Trong ví dụ này, tài liệu có thể có giá trị "value5" trong trường "field5" hoặc giá trị trường "field6" có thể lớn hơn hoặc bằng 20.
filter
filter được sử dụng để xác định các điều kiện không ảnh hưởng đến điểm số, nhưng nó sẽ lọc ra tài liệu không khớp với các điều kiện. Các điều kiện filter được sử dụng để giới hạn tập hợp kết quả, nhưng chúng không ảnh hưởng đến xếp hạng của các tài liệu.
{
"query": {
"bool": {
"filter": [
{ "term": { "field7": "value7" } },
{ "range": { "field8": { "lte": 30 } } }
]
}
}
}
Trong ví dụ này, tài liệu phải có giá trị "value7" trong trường "field7" và giá trị trường "field8" không được lớn hơn 30. Các điều kiện trong filter giúp giữ lại tài liệu phù hợp mà không ảnh hưởng đến điểm số.
Kết hợp các điều kiện
Chúng ta có thể kết hợp cả bốn điều kiện must, must_not, should, và filter trong một truy vấn bool để có thể xây dựng các truy vấn phức tạp và linh hoạt để đáp ứng nhu cầu tìm kiếm trong Elasticsearch.
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "range": { "field2": { "gte": 10 } } }
],
"must_not": [
{ "term": { "field3": "value3" } }
],
"should": [
{ "match": { "field4": "value4" } }
],
"filter": [
{ "range": { "field5": { "lte": 50 } } }
]
}
}
}
Trong ví dụ này:
must: Tài liệu phải khớp với cả hai điều kiện: có giá trị "value1" trong trường "field1" và giá trị trường "field2" không được nhỏ hơn 10.
must_not: Tài liệu không được có giá trị "value3" trong trường "field3".
should: Tài liệu có thể có giá trị "value4" trong trường "field4", nhưng điều này không là bắt buộc.
filter: Tài liệu phải có giá trị trường "field5" không lớn hơn 50
5. Range Query
Range Query dùng để tìm kiếm các tài liệu trong một phạm vi giá trị cụ thể. Câu lệnh range giúp bạn thực hiện tìm kiếm dựa trên điều kiện so sánh như lớn hơn (sử dụng tham số gt), nhỏ hơn (lt), lớn hơn hoặc bằng(gte), nhỏ hơn hoặc bằng(lte).
{
"query": {
"range": {
"field_name": {
"gte": "start_value",
"lte": "end_value"
}
}
}
}
Trong ví dụ này:
"gte": "start_value" chỉ định rằng giá trị của trường phải lớn hơn hoặc bằng "start_value".
"lte": "end_value" chỉ định rằng giá trị của trường cũng phải nhỏ hơn hoặc bằng "end_value".
Kết quả, Elasticsearch sẽ trả về tất cả các tài liệu trong chỉ mục có giá trị của trường "field_name" nằm trong khoảng từ "start_value đến "end_value" (bao gồm cả 2 giá trị đầu và cuối nữa).
6. Wildcard Query
Wildcard Query dùng để tìm kiếm các tài liệu dựa trên ký tự đại diện '*' hoặc '?'
{
"query": {
"wildcard": {
"field_name": "search*"
}
}
}
Trong ví dụ này: "search*" là biểu thức đại diện, trong đó dấu * đại diện cho bất kỳ chuỗi ký tự nào.
Kết quả sẽ chứa tất cả các tài liệu trong chỉ mục có giá trị của trường khớp với mẫu "search" kết hợp với bất kỳ ký tự nào ở phía sau như search, searchfield, searchname...
Trong Elasticsearch, tham số * và ? được sử dụng trong wildcard query để đại diện cho các ký tự trong chuỗi tìm kiếm. Dưới đây giải thích về cách chúng hoạt động:
'*' (Asterisk):
-
đại diện cho một chuỗi ký tự bất kỳ, bao gồm cả không có ký tự nào.
-
Ví dụ: Nếu bạn tìm kiếm "prefix" trong trường, nó sẽ khớp với bất kỳ giá trị nào bắt đầu bằng "prefix"
'?' (Question Mark):
- ? đại diện cho một ký tự duy nhất.
- Ví dụ: Nếu bạn tìm kiếm "te?t" trong trường, nó sẽ khớp với "test", "text", "tent", và bất kỳ từ nào có chính xác một ký tự ở vị trí thứ ba.
Lưu ý rằng sử dụng wildcard với * và ? có thể ảnh hưởng đến hiệu suất, đặc biệt là trên các chỉ mục lớn, do nó có thể yêu cầu quét qua nhiều tài liệu để tìm kiếm.
7. Fuzzy Query
Trong Elasticsearch, fuzzy query được sử dụng để thực hiện tìm kiếm dựa trên từ có độ giống nhau gần đúng với một từ khóa cho 1 trường cụ thể. Fuzzy query cho phép bạn tìm kiếm các từ gần giống với từ khóa bằng cách cho phép một số sự khác biệt trong chuỗi ký tự.
{
"query": {
"fuzzy": {
"field_name": {
"value": "search_text",
"fuzziness": 2
}
}
}
}
Trong ví dụ này:
- fuzziness: Là một tham số để chỉ định mức độ của độ giống nhau được phép. Giá trị của fuzziness nói lên số lượng các thay đổi (hoặc "bước nhảy") cho phép giữa từ khóa và từ được tìm kiếm. Giá trị thường là một số nguyên, ví dụ: 1, 2, 3,...
Kết quả là Elasticsearch sẽ trả về các tài liệu trong chỉ mục có giá trị của trường gần giống với từ khóa với mức độ độ giống nhau được xác định bởi fuzziness.
Chú ý
Đây chỉ là một số câu truy vấn cơ bản và Elasticsearch hỗ trợ nhiều tính năng khác nhau như sorting, aggregations, và nhiều loại truy vấn phức tạp khác. Đối với mỗi trường hợp sử dụng, cần tìm hiểu thêm về các tính năng và cú pháp của Elasticsearch Query DSL.
Bài viết liên quan và tài liệu tham khảo
Elastic Stack: Tìm hiểu về công cụ phân tích và trực quan hóa dữ liệu
All rights reserved