0

Elasticsearch Bài học 28: Giải mã thuật toán Scoring (Relevance Score) - TF/IDF và BM25 hoạt động ra sao?

Trong hệ thống E-commerce, sự chênh lệch giữa Top 1 và Top 10 kết quả tìm kiếm có thể định đoạt doanh thu hàng tỷ đồng. Khi một khách hàng tìm "sữa rửa mặt Cetaphil", tại sao Elasticsearch lại cho sản phẩm A điểm _score là 4.52, trong khi sản phẩm B chỉ được 1.12?

Để giải đáp các thắc mắc từ team Business ("Tại sao sản phẩm này lại đứng dưới sản phẩm kia?"), Backend Engineer bắt buộc phải hiểu cơ chế chấm điểm ngầm của Elasticsearch.

Dưới đây là dàn ý chi tiết và nội dung cho Bài 28.

Dàn ý chi tiết Bài học 28

  1. TF/IDF là gì? (Nền tảng cổ điển)

    • Term Frequency (TF) - Tần suất xuất hiện của từ khóa.

    • Inverse Document Frequency (IDF) - Độ hiếm của từ khóa.

    • Field-length Norm - Trọng số chiều dài trường dữ liệu.

  2. Lỗ hổng của TF/IDF và Vấn nạn Keyword Spamming

    • Bão hòa TF: Vấn đề xảy ra khi lặp lại từ khóa vô tội vạ.
  3. Thuật toán BM25: Kẻ kế thừa hoàn hảo (Mặc định từ ES 5.x)

    • Giải quyết bão hòa bằng đường cong tiệm cận.

    • Khám phá 2 siêu tham số: k1k_1 và bb.

  4. Thực chiến: Dùng Explain API để "soi" điểm

    • Cách đọc luồng phân tích điểm số của Elasticsearch bằng explain: true.

Nội dung Bài học 28: Giải mã thuật toán Scoring - TF/IDF và BM25

Trong suốt nhiều năm, lõi Apache Lucene bên dưới Elasticsearch sử dụng thuật toán cổ điển mang tên TF/IDF. Dù từ bản 5.x, hệ thống đã chuyển sang thuật toán Okapi BM25 ưu việt hơn, nhưng BM25 thực chất vẫn được xây dựng trên bộ khung triết lý của TF/IDF.

Để hiểu cách tính _score, chúng ta phải nắm được 3 nhân tố cốt lõi sau.

1. Nền tảng cổ điển: TF, IDF và Norms

Khi bạn tìm từ khóa "Cetaphil", Elasticsearch sẽ đo lường 3 chỉ số cho từng Document:

A. Term Frequency (TF - Tần suất từ)

Câu hỏi: Từ khóa "Cetaphil" xuất hiện bao nhiêu lần trong Document hiện tại?

Logic: Xuất hiện càng nhiều lần, điểm càng cao. Một sản phẩm nhắc đến chữ "Cetaphil" 5 lần trong mô tả chắc chắn liên quan hơn sản phẩm chỉ nhắc 1 lần.

B. Inverse Document Frequency (IDF - Nghịch đảo tần suất tài liệu)

Câu hỏi: Từ khóa "Cetaphil" xuất hiện trong bao nhiêu Document trên TỔNG SỐ toàn bộ Index?

Logic: Từ càng hiếm, điểm càng cao.

Nếu khách tìm cụm "sữa rửa mặt Cetaphil", các từ "sữa", "rửa", "mặt" có thể xuất hiện trong 100.000 sản phẩm (tần suất rất cao →\rightarrow IDF rất thấp, điểm thấp). Nhưng chữ "Cetaphil" chỉ xuất hiện trong 50 sản phẩm (tần suất rất thấp →\rightarrow IDF cực cao).

Nhờ IDF, Elasticsearch biết rằng việc khớp chữ "Cetaphil" có giá trị gấp hàng chục lần so với việc khớp chữ "sữa".

C. Field-length Norm (Độ dài trường)

Câu hỏi: Trường dữ liệu chứa từ khóa đó dài hay ngắn?

Logic: Trường càng ngắn, điểm càng cao.

Nếu chữ "Cetaphil" xuất hiện trong trường name (chỉ dài 10 chữ), nó sẽ nhận được lượng điểm lớn hơn rất nhiều so với việc nó xuất hiện lọt thỏm trong trường description (dài 1000 chữ).

2. Vấn đề của TF/IDF: "Bão hòa từ khóa" (Spamming)

Thuật toán TF/IDF cổ điển có một điểm yếu chí mạng: Hàm tính TF của nó tăng tiến liên tục (dạng Logarit hoặc Căn bậc 2).

Nếu một người bán hàng (Seller) cố tình spam SEO bằng cách nhồi nhét chữ "Cetaphil" 100 lần vào phần mô tả sản phẩm, điểm TF của Document đó sẽ tăng vọt lên không có điểm dừng, đè bẹp các sản phẩm chính hãng có mô tả ngắn gọn, súc tích.

Đó là lý do Elasticsearch phải nâng cấp lên BM25 (Best Matching 25).

3. Sự bảo vệ của BM25: Đường cong tiệm cận

BM25 áp dụng một công thức phi tuyến tính cho Term Frequency. Thay vì cho điểm tăng vô hạn khi từ khóa xuất hiện nhiều lần, nó tạo ra một đường cong tiệm cận.

Công thức thành phần TF của BM25 được định nghĩa bằng:

TFBM25=TF⋅(k1+1)TF+k1⋅(1−b+b⋅LLavg)TF_{BM25} = \frac{TF \cdot (k_1 + 1)}{TF + k_1 \cdot (1 - b + b \cdot \frac{L}{L_{avg}})}

Nghe có vẻ hàn lâm toán học, nhưng bạn chỉ cần nắm ý nghĩa của 2 siêu tham số (Hyperparameters) kiểm soát nó:

  1. k1k_1 (Kiểm soát bão hòa - Mặc định = 1.2):

    BM25 giới hạn số điểm tối đa mà TF có thể đóng góp. Lần xuất hiện thứ 1 và thứ 2 của chữ "Cetaphil" sẽ cộng một lượng điểm cực lớn. Nhưng đến lần xuất hiện thứ 10, hay thứ 100, đường điểm số sẽ đi ngang (phẳng). Việc spam từ khóa trở nên hoàn toàn vô tác dụng.

  2. bb (Kiểm soát độ dài trường - Mặc định = 0.75):

    Quyết định việc Field-length Norm (độ dài trường) ảnh hưởng mạnh đến mức nào. Nếu bạn set b=0b = 0, Elasticsearch sẽ đánh đồng giá trị của từ khóa nằm trong một tựa đề ngắn với từ khóa nằm trong một bài viết dài. Giá trị 0.75 là điểm cân bằng hoàn hảo cho hầu hết các loại văn bản.

4. Thực chiến: Dùng Explain API để "soi" điểm

Khi team Product Manager phàn nàn: "Tại sao áo thun màu đỏ mã A lại xếp trên mã B?", bạn không thể trả lời chung chung là "Do BM25". Bạn phải chứng minh bằng số liệu thực tế.

Chỉ cần thêm "explain": true vào gốc của mọi câu Query:

JSON

GET products/_search
{
  "explain": true,
  "query": {
    "match": {
      "name": "áo thun đỏ"
    }
  }
}

Kết quả trả về sẽ bọc thêm một khối _explanation cực kỳ chi tiết cho từng Document. Nó sẽ in ra chính xác một cấu trúc cây Toán học:

  • Tổng điểm 3.14 từ đâu ra?

  • Điểm BM25 của chữ "áo" là bao nhiêu?

  • Điểm BM25 của chữ "thun" là bao nhiêu?

  • IDF của chữ "đỏ" cao cỡ nào do từ này hiếm xuất hiện?

Nhờ đọc khối explain này, bạn sẽ nhận ra các "thủ phạm" làm lệch kết quả (ví dụ: mô tả quá dài làm giảm điểm Norm, hoặc từ khóa quá phổ biến làm mất điểm IDF), từ đó có chiến thuật điều chỉnh trọng số (Boosting) phù hợp ở tầng truy vấn.

Thuật toán chấm điểm giải quyết bài toán "Lấy cái gì tốt nhất". Nhưng khi hệ thống có 100,000 kết quả thỏa mãn, khách hàng lướt đến trang thứ 500, thì hệ thống lại đối mặt với bài toán sập RAM. Bài tiếp theo sẽ giải quyết tử huyệt mang tên Deep Paging.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí