Professional Documents
Culture Documents
báo cáo cơ sở dữ liệu
báo cáo cơ sở dữ liệu
Hà Nội, 2022
------
A. Giới thiệu về elastic search
1. Định nghĩa
- Elasticsearch được xem là một search engine, hoạt động thực chất như 1
web server với khả năng tìm kiếm nhanh chóng thông qua giao thức
RESTful, sở hữu khả năng phân tích và thống kê dữ liệu vô cùng hiệu quả.
2. Cách thức hoạt động
- Elasticsearch hoạt động như một Cloud Server theo cơ chế RESTful, tức là
từ Client tạo ra các HTTP Request (GET, PUT …) kèm dữ liệu dạng JSON
để tương tác với Elasticsearch (POST, PUT, DELETE, GET,…).
- Để tạo ra Http Request gửi đến Elasticsearch thì bạn có thể dùng các loại
ngôn ngữ khác nhau để xây dựng hệ thống: Java, PHP, Ruby, .Net, Python,
…
- Tất cả dữ liệu được lưu vào Elasticsearch đều được đánh Index(chỉ mục), vì
thế hiệu năng tìm kiếm của Elasticsearch rất cao.
3. Ứng dụng của elastic search
- Elasticsearch đã trở thành công cụ tìm kiếm (search engine) thông dụng nhất
và được sử dụng rộng rãi cho các công việc liên quan đến chỉ mục và tìm
kiếm tài liệu, phân tích dữ liệu …
4. Ưu, nhược điểm của elastic search
• Ưu điểm :
- Cho phép tìm kiếm dữ liệu một cách nhanh chóng với hiệu năng cao gần
như là real-time
- Hỗ trợ hầu hết mọi loại dữ liệu, trừ những kiểu dữ liệu không hỗ trợ hiển thị
dưới dạng văn bản (text).
- Lưu trữ dữ liệu full-text và quản lý vòng đời chỉ mục, cho phép người dùng
truy xuất và phân tích, tổng hợp lượng dữ liệu rất lớn với tốc độ cao, hiệu
quả hơn.
- Có thể hoạt động được trên nhiều nền tảng khác nhau, đồng thời tương tác,
hỗ trợ nhiều ngôn ngữ lập trình
• Nhược điểm:
- ElasticSearch kém bảo mật hơn so với các hệ quản trị cơ sở dữ liệu hiện nay.
- Không phù hợp với những hệ thống thường xuyên cập nhật dữ liệu do sẽ rất
tốn kém trong việc lập chỉ mục dữ liệu.
- Elasticsearch được thiết kế cho mục đích tìm kiếm nên thường không dùng
làm DB chính.
B: Nội dung
1. Nhiều chuỗi truy vấn
- Nhiều chỗi truy vấn nhầm để tìm kiếm trên nhiều trường với các điều kiện
cụ thể được viết ra với mệnh đề match và kết hợp chúng lại bằng truy vấn
bool.
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "War and Peace" }},
{ "match": { "author": "Leo Tolstoy" }}
]
}
}
}
- Truy vấn bool chạy từng mệnh đề match cộng dồn điểm số đưa ra điểm số
cho mỗi tài liệu các tài liệu khớp với càng nhiều mệnh đề điểm càng cao.
2. Ưu tiên của các mệnh đề
- Ưu tiên của các mệnh đề là việc tăng trọng số cho mệnh đề ta quan tâm
trong truy vấn bool bằng cách dùng tham số boost, mệnh đề được ưu tiên sẽ
đặt giá trị boost lớn hơn.
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { (1)
"title": {
"query": "War and Peace",
"boost": 2
}}},
{ "match": { (1)
"author": {
"query": "Leo Tolstoy",
"boost": 2
}}},
{ "bool": { (2)
"should": [
{ "match": { "translator": "Constance Garnett" }},
{ "match": { "translator": "Louise Maude" }}
]
}}
]
}
}
}
- Giá trị boost “tốt nhất” nằm giữa 1 và 10, có khi là 15 các giá trị cao hơn
đem lại ít tác dụng hơn do số điểm được chuẩn hóa.
3. Chuỗi truy vấn đơn
- Chuỗi truy vấn đơn nhầm tìm kiếm trên nhiều trường bằng cách nhập thuật
ngữ tìm kiếm trên một trường duy nhất.
- Để thực thi truy vấn đơn đạt được kết quả tốt nhất không có một giải pháp
đơn giản, bạn cần sự hiểu biết về dữ liệu và cách sử dụng những công cụ
phù hợp.
4. Hiểu dữ liệu của bạn
- Khi thực hiện một chuỗi truy vấn đơn bạn thường xuyên gặp phải các tình
huống:
Các trường tốt nhất: các từ đi cùng nhau sẽ có ý nghĩa hơn các từ riêng lẻ,
các trường có mối liên hệ với nhau được coi như đối nghịch nhau, điểm
số nên được lấy từ trường khớp nhiều nhất.
Phần lớn các trường: chia dữ liệu ra làm nhiều trường mỗi cái có một
dãy phân tích riêng. Trường chính có thể bao gồm các từ ở dạng từ gốc,
từ đồng nghĩa, và các từ bị loại bỏ dấu thanh, hay trọng âm, trường chính
được dùng để ăn khớp với nhiều tài liệu. Nó được dùng làm phụ lục cho
các trường khác để đem lại sự ăn khớp chính xác hơn. Các trường này
như các tín hiệu để tăng điểm liên quan cho mỗi tài liệu ăn khớp.
Các trường đan xen: Một số đối tượng thông tin để nhận biết chúng nằm
rải rác ở nhiều trường khi đó ta cần xem các trường này như một trường
lớn nhầm tìm kiếm càng nhiều từ càng tốt.
a. Các trường tốt nhất
- Dựa vào cách truy vấn bool tính điểm nếu 2 từ cùng xuất hiện trên chỉ một
trường sẽ có mức ưu tiên ít hơn nếu một từ lập lại ở nhiều trường.
Truy vấn dis_max
- Truy vấn dis_max tức “Disjunction Max Query” trả về bất cứ tài liệu nào
khớp với bất cứ truy vấn nào, và trả về điểm của truy vấn khớp nhiều nhất.
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
(+last_name:peter +last_name:smith)
Một phương pháp tiếp cận tập trung vào từ thì thay vào đó sẽ sử dụng logic như
sau:
+(first_name:peter last_name:peter)
+(first_name:smith last_name:smith)
Hay nói cách khác, từ peter phải xuất hiện ở ít nhất 1 trong 2 trường, và từ smith
cũng như vậy.
- Lợi thế của khả năng ưu tiên các trường cụ thể nên được cân đo với hao tổn
trong việc phải truy vấn nhiều trường thay vì chỉ truy vấn một trường _all.
Hãy dùng bất cứ cách nào trong 2 cách trên tùy theo cách nào có lợi nhất
cho tình huống của bạn.
9. Các trường có giá trị cụ thể
Các trường not_analyzed có giá trị cụ thể nên việc trộn lẫn các trường
not_analyzed với các trường analyzed trong truy vấn multi_match là điều không hề
hữu ích.
GET /_validate/query?explain
{
"query": {
"multi_match": {
"query": "peter smith",
"type": "cross_fields",
"fields": [ "title", "first_name", "last_name" ]
}
}
}
Vì trường title chưa được phân tích, nên nó chỉ tìm các trường bao gồm một từ
khóa là toàn bộ chuỗi truy vấn!
title:peter smith
Từ khóa này rõ ràng là không tồn tại trong chỉ mục đảo ngược của trường title, và
sẽ không bao giờ có thể tìm ra được. Hãy tránh dùng các trường dạng
non_analyzed trong các truy vấn multi_match.