Professional Documents
Culture Documents
Search in Depth
Search in Depth
Combining
Structured Search
Filter
Finding Multiple
Exact Values
Inverse document
frequency
I – Structured Search
1. Finding exact values
Khi muốn tìm kiếm chính xác theo keywork thì ta nên dùng các filter
trong ES, và hãy dùng các filter nhiều nhất có thể bởi các filter sẽ không
phải tính relevance, tính score giữa input đầu vào và kết quả trả về. Các
kết quả filter trả về được cache dễ dàng trên server do đó performance
tìm kiếm sẽ tốt hơn nếu dùng full-text search.
Filter quan trọng vì chúng rất nhanh. Filter không tính toán mức độ liên
quan (tránh toàn bộ giai đoạn tính điểm) và dễ dàng lưu vào bộ nhớ
cache.
Các kết quả filter trả về được cache dễ dàng trên server do đó
performance tìm kiếm sẽ tốt hơn nếu dùng full-text search.
I – Structured Search
Term Filter (bộ lọc thuật ngữ): là filter được sử dụng thường xuyên, nó có khả năng
xử lý numbers, Booleans, dates và text.
Term Filter with Numbers (Bộ lọc thuật ngữ với số):
Ví dụ: giả sử có một loạt các products được index trong ES:
POST /my_store/products/_bulk
{"index": {"_id": 1}}
{"price": 10, "productID": "XHDK-A-1293-#fJ3"}
{"index": {"_id": 2}}
{"price": 20, "productID": "KDKE-B-9947-#kL5"}
{"index": {"_id": 3}}
{"price": 30, "productID": "JODL-X-1937-#pV7"}
{"index": {"_id": 4}}
{"price": 30, "productID": "QQPX-R-3956-#aD8"}
I – Structured Search
Tìm kiếm chính xác các products có giá price = 20 sử dụng SQL:
Khi thực hiện một truy vấn được lọc, bộ lọc được thực thi trước truy vấn. Tập hợp bit kết quả
được đưa cho truy vấn, sử dụng nó để đơn giản bỏ qua bất kỳ tài liệu nào đã bị bộ lọc loại trừ.
Đây là 1 trong những cách mà bộ lọc có thể cải thiện hiệu suất. Ít tài liệu hơn được đánh giá bởi
truy vấn có nghĩa là thời gian phản hồi nhanh hơn.
I – Structured Search
2. Combining Filters
Để tìm kiếm nhiều field trên một query, có thể kết hợp nhiều filter với nhau.
Hai ví dụ trước cho thấy một bộ lọc duy nhất đang được sử dụng. Trong thực tế,
ta có thể sẽ cần phải lọc trên nhiều giá trị hoặc trường. Ví dụ, trong SQL:
Trong những tình huống này, ta sẽ cần bộ lọc bool. Đây là bộ lọc phức hợp chấp
nhận các bộ lọc khác làm đối số, kết hợp chúng theo nhiều kiểu kết hợp Boolean
khác nhau. Để viết câu truy vấn trên bằng DSL, cần dùng Boolean filter.
I – Structured Search
Bool Filter: gồm 3 phần:
{
"bool": {
"must": [],
"should": [],
"must_not": [],
}
}
must: tất cả các mệnh đề này phải phù hợp. Tương đương của AND.
must_not: tất cả các mệnh đề này không được phù hợp. Tương đương của NOT.
should: Ít nhất một trong các mệnh đề này phải khớp. Tương đương của OR.
I – Structured Search
Để sao chép ví dụ SQL trước, chúng ta sẽ lấy hai bộ lọc thuật ngữ mà chúng ta đã sử dụng
trước đó và đặt chúng bên trong mệnh đề should của bộ lọc bool và thêm một mệnh đề
khác để xử lý điều kiện NOT:
I – Structured Search
Nesting boolean filter: Mặc dù bool là một bộ lọc phức hợp và chấp nhận các bộ lọc con,
nhưng điều quan trọng là phải hiểu rằng bool chỉ là một bộ lọc. Điều này có nghĩa là ta có
thể lồng các bộ lọc bool vào bên trong các bộ lọc bool khác, cho phép bạn tạo logic
Boolean phức tạp tùy ý.
Sử dụng truy vấn SQL:
I – Structured Search
Có thể dịch nó thành một cặp bộ lọc tool lồng nhau:
I – Structured Search
3. Finding Multiple Exact Values
Contain but does not equal (chứa nhưng không bằng)
Ví dụ nếu có bộ lọc cụm từ cho {“temp”: {“tags”: “search”}}, nó sẽ khớp với cả hai tài
liệu sau:
{“tags”: [“search”]}
{“tags”: [“search”, “open_source”]}
Cách hoạt động của bộ lọc thuật ngữ: Nó kiểm tra inverted index cho tất cả các tài liệu có
chứa một thuật ngữ và sau đó xây dựng một tập hợp các bit. Trong ví dụ dưới đây, ta có
inverted index sau:
Token DocIDs
open_source 2
search 1,2
I – Structured Search
Khi một bộ lọc cụm từ được thực thi để tìm kiếm token, nó sẽ chuyển thẳng
đến mục nhập tương ứng trong inverted index và trích xuất các ID tài liệu
được liên kết. Như vậy, cả tài liệu 1 và 2 đều chứa token trong inverted
index. Vì thế, cả hai kết quả đều được trả về.
Để xác định một tài liệu cụ thể chỉ chứa yêu cầu của mình, ta sẽ phải tìm
thuật ngữ trong inverted index, trích xuất các ID tài liệu, sau đó quét mọi
hàng trong inverted index, sau đó tìm kiếm các ID đó để xem một tài liệu có
bất kỳ thuật ngữ nào khác hay không. Làm như vậy sẽ cực kỳ kém hiệu quả.
Do đó thuật ngữ phải chứa chứ không bằng.
I – Structured Search
Equals Exactly (bằng chính xác)
Sử dụng hai tài liệu bên trên, bây giờ ta bao gồm một trường duy trì
số lượng thẻ:
{ "tags" : ["search"], "tag_count" : 1 }
{ "tags" : ["search", "open_source"], "tag_count" : 2 }
I – Structured Search
Khi đã lập index thông tin về số lượng, ta có thể tạo bộ lọc bool thực thi số
lượng điều khoản thích hợp:
GET /my_index/my_type/_search
{
"query": {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "term" : { "tags" : "search" } },
{ "term" : { "tag_count" : 1 } }
]}}}}}
I – Structured Search
4. Ranges
Trong SQL, một phạm vi được biểu thị như sau:
SELECT document
FROM products
WHERE price BETWEEN 20 AND 40
Ta không thể lưu trữ một trường không tồn tại trong cấu trúc dữ liệu. Inverted
index chỉ đơn giản là một danh sách các token và các tài liệu chứa chúng. Nếu một
trường không tồn tại thì trường đó không chứa bất kỳ mã thông báo nào, điều đó
có nghĩa là nó sẽ không được thể hiện trong cấu trúc dữ liệu inverted index.
Để xử lý vấn đề này, Elasticsearch có một số công cụ để làm việc với các giá trị
rỗng hoặc bị thiếu.
I – Structured Search
Exists filter (bộ lọc tồn tại)
Bộ lọc này sẽ trả về các tài liệu có bất kỳ giá trị nào trong trường được chỉ định. Hãy sử dụng ví dụ gắn
thẻ và lập index một số tài liệu mẫu:
POST /my_index/posts/_bulk
{"index": {"_id": "1"}}
{"tags": ["search"]}1
{"index": {"_id": "2"}}
{"tags": ["search", "open_source"]}2
{"index": {"_id": "3"}}
{"other_field": "some data"}3
{"index": {"_id": "4"}}
{"tags": null}4
{"index": {"_id": "5"}}
{"tags": ["search", null]}5
I – Structured Search
Kết quả của inverted index cho trường thẻ sẽ giống như sau:
Token DocIDs
open_source 2
search 1,2,5
Một Inverted index chứa danh sách từng từ đơn duy nhất (unique work)
xuất hiện trong bất kỳ một document nào được bao phủ bởi index, ứng với
mỗi từ đó sẽ là một danh sách các document mà từ này xuất hiện (mapping)
được lưu trữ. Vì vậy, về cơ bản, một inverted index là một ánh xạ giữa các
điều khoản và tài liệu nào chứa các điều khoản đó. Vì một inverted index
hoạt động ở cấp trường tài liệu và lưu trữ các thuật ngữ cho một trường nhất
định, nên nó không cần phải xử lý các trường khác nhau.
II – Inverted Index
Ví dụ: Giả sử rằng chúng ta có hai công thức nấu ăn với các tiêu đề sau: “The
Best Pasta Recipe with Pesto” và “Delicious Pasta Carbonara Recipe”. Bảng
sau đây cho thấy inverted index sẽ như thế nào.
II – Inverted Index
Bước đầu tiên của truy vấn tìm kiếm là tìm tài liệu khớp với truy vấn ở vị trí
đầu tiên. Vì vậy, nếu chúng ta tìm kiếm "pasta recipe", thì ta sẽ thấy rằng cả
hai tài liệu đều chứa cả hai thuật ngữ.
II – Inverted Index
Nếu chúng ta tìm kiếm theo thuật ngữ “delicious recipe” thì kết quả sẽ như
sau:
II – Inverted Index
Tóm lại: Một bộ phân tích được áp dụng cho các trường toàn văn bản và kết
quả của quá trình phân tích này được lưu trữ trong một inverted index.
Một inverted index bao gồm tất cả các điều khoản cho một trường nhất định
trên tất cả các tài liệu trong một index.
Vì vậy, khi thực hiện một truy vấn tìm kiếm, ta không thực sự tự tìm kiếm
các tài liệu, mà là một inverted index. Điều này rất quan trọng để hiểu bởi vì
nếu không, có thể bị bối rối về lý do tại sao một số truy vấn không phù hợp
với những gì mong đợi.
III – Relevance
Là thuật toán toán mà chúng ta sử dụng để tính toán mức độ tương tự nội
dung của một trường văn bản với một chuỗi truy vấn toàn văn bản (full –
text) .
The relevance score của mỗi tài liệu được biểu diễn bởi một số thực dấu
phẩy động dương được gọi là the_score. The_score càng cao thì tại liệu
càng liên quan.
The_score càng cao thì tại liệu càng liên quan (relevance).
Một mệnh đề truy vấn tạo ra một the_score cho mỗi tài liệu. Do đó cách
tính score phụ thuộc vào loại mệnh đề truy vấn.
III – Relevance
term frequency (tf) của t trong document d được tính bằng căn bậc hai của
số lần t xuất hiện trong d.
III – Relevance
_score cuối cùng sẽ là tích của TF, IDF và Field-length norm giá trị trên:
IDF score * TF score * fieldNorms
hay
log(numDocs / (docFreq + 1)) * √frequency * (1 / √numTerms)
Cảm ơn thầy và các bạn đã chú ý lắng nghe!!!
Thành viên:
Vũ Thị Thùy Dung – MSV 19000403
Công Anh Dũng – MSV 19000405
Trần Tuấn Huy – MSV 19000436
Hoàng Đức Trung – MSV 19000497
Trần Minh Vũ – MSV 19000501