0

Các thuật toán phía sau Algolia

📘 Chủ đề: Các Thuật Toán Phía Sau Algolia – Toán Học và Tối Ưu Hóa

🧠 Mục tiêu

  • Hiểu cách Algolia hoạt động dưới góc nhìn toán học.
  • Phân tích các thuật toán tìm kiếm gần đúng (Approximate Nearest Neighbor).
  • Khái quát cơ chế tối ưu thời gian truy vấn và độ chính xác trong tìm kiếm.
  • Viết code mô phỏng đơn giản bằng Python để minh hoạ.

1. Giới thiệu về Algolia

  • Là công cụ tìm kiếm theo thời gian thực (real-time search engine).
  • Ưu tiên hiệu năng cao, thời gian phản hồi cực thấp (dưới 20ms).
  • Dựa vào mô hình inverted index kết hợp với tối ưu tìm kiếm gần đúng.

2. Indexing: Inverted Index & Trie Optimization

🔹 Inverted Index

  • Dạng cấu trúc: {term: [doc_ids]}
  • Mô hình set intersection để tìm tài liệu chứa tất cả từ khóa.

🔹 Trie (Prefix Tree)

  • Được dùng để tối ưu prefix search, ví dụ: "alg" sẽ tìm "algolia", "algorithm"...
  • Toán học: Cây tìm kiếm tiền tố có chi phí tối ưu O(m) với m là độ dài từ khóa.

🔹 Tối ưu không gian

  • Dùng Radix Tree để nén các nhánh đơn (Space optimization).
  • Dùng Path Compression.

3. Tìm kiếm gần đúng: Approximate Nearest Neighbor (ANN)

Algolia dùng các kỹ thuật để tìm kiếm gần đúng nhanh hơn thay vì tìm chính xác (vì quá chậm cho real-time).

🔹 Edit Distance & Typo Tolerance

  • Dùng Levenshtein Distance (LD): Số bước để chuyển từ từ A → B.
  • Giới hạn LD ≤ 2 để có khả năng sửa lỗi gõ từ người dùng.

Toán học:

  • Dynamic Programming O(m × n)
  • Cải tiến: dùng BK-Tree hoặc Automata để giới hạn không gian tìm kiếm.

🔹 Ranking Formula: TF-IDF + Custom Weights

Công thức tổng thể:

Score(q, d) = w_1 * ExactMatch + w_2 * TypoTolerance + w_3 * Proximity + w_4 * AttributePriority + w_5 * CustomRanking

Thành phần:

  • Proximity Score: khoảng cách giữa các từ khóa → tối ưu bằng heuristic rules.
  • Typo Penalty: dựa vào Levenshtein Distance.
  • Attribute Priority: ví dụ title > description.
  • Custom Ranking: theo popularity, date, price,...

4. Fast Filtering và Faceted Search

  • Dùng Bitmasking / BitSet để nhanh chóng lọc qua các filter dạng AND/OR.

Toán học:

  • Mỗi facet là 1 bit vector, filter = AND operation giữa các vector.
  • Nhanh hơn so với lọc tuần tự toàn bộ documents.

5. Compression & Memory Optimization

  • Delta EncodingFront Coding để giảm dung lượng index.
  • Numeric Bucketing cho các range query.
  • Cache-aware Search: tối ưu locality → giảm cache miss.

6. Code minh họa: BK-Tree cho typo-tolerant search

from collections import defaultdict

def levenshtein(a, b):
    dp = [[i + j if i * j == 0 else 0 for j in range(len(b)+1)] for i in range(len(a)+1)]
    for i in range(1, len(a)+1):
        for j in range(1, len(b)+1):
            cost = 0 if a[i-1] == b[j-1] else 1
            dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+cost)
    return dp[-1][-1]

class BKTree:
    def __init__(self, word):
        self.word = word
        self.children = {}

    def insert(self, other):
        dist = levenshtein(self.word, other)
        if dist in self.children:
            self.children[dist].insert(other)
        else:
            self.children[dist] = BKTree(other)

    def search(self, target, max_dist):
        results = []
        dist = levenshtein(self.word, target)
        if dist <= max_dist:
            results.append(self.word)
        for d in range(dist - max_dist, dist + max_dist + 1):
            child = self.children.get(d)
            if child:
                results += child.search(target, max_dist)
        return results

tree = BKTree("algolia")
for word in ["algorithm", "algae", "algol", "align", "log"]:
    tree.insert(word)

print(tree.search("algila", 2))  # gần đúng với "algolia"

7. Kết luận & Hướng mở rộng

  • Algolia dùng kết hợp nhiều kỹ thuật: trie + ANN + ranking + filter optimization.
  • Có thể kết hợp thêm Embedding Search (BERT, SentenceTransformers) nếu muốn semantic search.
  • Gợi ý các paper:

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í