<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hoàng Mạnh Khiêm</title>
    <description>The latest articles on Forem by Hoàng Mạnh Khiêm (@hoangmanhkhiem).</description>
    <link>https://forem.com/hoangmanhkhiem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F821195%2Fd84ac1cd-5b4b-45dd-ab6c-c2e4027e79a1.png</url>
      <title>Forem: Hoàng Mạnh Khiêm</title>
      <link>https://forem.com/hoangmanhkhiem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hoangmanhkhiem"/>
    <language>en</language>
    <item>
      <title>THUẬT TOÁN DỰ ĐOÁN HÀNH VI NGƯỜI DÙNG</title>
      <dc:creator>Hoàng Mạnh Khiêm</dc:creator>
      <pubDate>Fri, 22 May 2026 06:04:28 +0000</pubDate>
      <link>https://forem.com/hoangmanhkhiem/thuat-toan-du-doan-hanh-vi-nguoi-dung-2gpa</link>
      <guid>https://forem.com/hoangmanhkhiem/thuat-toan-du-doan-hanh-vi-nguoi-dung-2gpa</guid>
      <description>&lt;h1&gt;
  
  
  THUẬT TOÁN DỰ ĐOÁN HÀNH VI NGƯỜI DÙNG
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Các thuật toán giúp dự đoán hành vi, tìm similar users, và recommend pages tiếp theo&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  I) COSINE SIMILARITY (ĐO LƯỜNG ĐỘ TƯƠNG ĐỒNG)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Mục đích
&lt;/h3&gt;

&lt;p&gt;Cosine Similarity &lt;strong&gt;TRẢ LỜI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User A và User B có giống nhau không?&lt;/li&gt;
&lt;li&gt;Tìm users có hành vi tương tự&lt;/li&gt;
&lt;li&gt;Recommend dựa trên similar users&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. Nguyên lý
&lt;/h3&gt;

&lt;p&gt;Đo độ tương đồng giữa hai vectors bằng &lt;strong&gt;góc giữa chúng&lt;/strong&gt; (không phải khoảng cách):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CosineSimilarity(A, B) = cos(θ) = (A · B) / (||A|| ||B||)
                       = Σ(Ai × Bi) / (√Σ(Ai²) × √Σ(Bi²))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trong đó:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A · B&lt;/strong&gt;: Tích vô hướng (dot product)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;||A||&lt;/strong&gt;: Độ dài (magnitude) của vector A&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;θ&lt;/strong&gt;: Góc giữa hai vectors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kết quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cos(θ) = 1&lt;/strong&gt; → Hoàn toàn tương đồng (cùng hướng)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cos(θ) = 0&lt;/strong&gt; → Độc lập (vuông góc)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cos(θ) = -1&lt;/strong&gt; → Hoàn toàn đối lập (ngược hướng)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Quy trình áp dụng
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bước 1: Tạo vector hành vi cho mỗi user&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;User_i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;count_Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="err"&gt;count_DealHot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="err"&gt;count_Voucher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="err"&gt;count_Mission&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User A: [10, 50, 30, 5, 2, 15, 8]
User B: [8, 45, 28, 3, 1, 12, 6]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bước 2: Tính Cosine Similarity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tính similarity cho tất cả cặp users&lt;/li&gt;
&lt;li&gt;Tạo similarity matrix (2666 × 2666)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bước 3: Tìm similar users&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Với mỗi user, sort theo similarity score&lt;/li&gt;
&lt;li&gt;Lấy top N users có similarity cao nhất&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Đặc điểm quan trọng
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Magnitude-Invariant (không bị ảnh hưởng độ lớn):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User A: [1, 2, 3]
User B: [10, 20, 30]  (B = 10 × A)

Cosine(A, B) = 1.0  (perfect similarity)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;→ Tốt cho user behavior: User vào 5 lần vs 50 lần nhưng cùng tỷ lệ → similar&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So với Euclidean Distance:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Euclidean Distance(A, B) = 33.7 (rất lớn!)
Cosine Similarity(A, B) = 1.0 (perfect!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;→ Cosine tốt hơn khi quan tâm &lt;strong&gt;xu hướng&lt;/strong&gt; chứ không phải &lt;strong&gt;số lượng tuyệt đối&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Ứng dụng
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tìm Similar Users
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;User A vào: DealHot(50), Voucher(30), Profile(10)&lt;/li&gt;
&lt;li&gt;Tìm users có pattern tương tự&lt;/li&gt;
&lt;li&gt;Top 5 similar users: B, C, D, E, F&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Collaborative Filtering Recommendation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Logic:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tìm 20 users giống User A nhất&lt;/li&gt;
&lt;li&gt;Đếm pages mà 20 users đó hay vào&lt;/li&gt;
&lt;li&gt;Loại bỏ pages User A đã vào&lt;/li&gt;
&lt;li&gt;Recommend top 5 pages còn lại&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User A đã vào: {DealHot, Voucher}
Similar users thích: {DealHot, Voucher, FlashsaleEmbedded, Mission}
→ Recommend: {FlashsaleEmbedded, Mission}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  User-User Clustering
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Dùng similarity matrix làm input&lt;/li&gt;
&lt;li&gt;Hierarchical Clustering dựa trên (1 - similarity)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Dễ triển khai&lt;/strong&gt; - Công thức đơn giản&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Không bị ảnh hưởng magnitude&lt;/strong&gt; - Focus vào xu hướng&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Phù hợp sparse data&lt;/strong&gt; - Nhiều 0 không ảnh hưởng nhiều&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Interpretable&lt;/strong&gt; - Similarity [0, 1] dễ hiểu&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Không hiểu semantic&lt;/strong&gt; - "Mission" và "CreateMission" được coi là độc lập&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Cold start problem&lt;/strong&gt; - Users mới (ít data) → similarity không chính xác&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Memory intensive&lt;/strong&gt; - Matrix 2666 × 2666 = 7.1M cells&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Popularity bias&lt;/strong&gt; - Similar users đều thích pages phổ biến&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  II) TF-IDF (TERM FREQUENCY - INVERSE DOCUMENT FREQUENCY)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Mục đích
&lt;/h3&gt;

&lt;p&gt;TF-IDF &lt;strong&gt;TRẢ LỜI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page nào quan trọng để &lt;strong&gt;phân biệt&lt;/strong&gt; user?&lt;/li&gt;
&lt;li&gt;Page phổ biến vs page đặc trưng?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Không phải thuật toán, là kỹ thuật Feature Engineering&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Công thức
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TF-IDF(t, d) = TF(t, d) × IDF(t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TF (Term Frequency):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TF(t, d) = (số lần term t xuất hiện trong document d) / (tổng số terms trong document d)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IDF (Inverse Document Frequency):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IDF(t) = log(tổng số documents / số documents chứa term t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Áp dụng cho User Behavior
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mapping:&lt;/strong&gt;&lt;br&gt;
| NLP | User Behavior |&lt;br&gt;
|-----|---------------|&lt;br&gt;
| Term (từ) | Page (DealHot, Mission,...) |&lt;br&gt;
| Document | User (mỗi user = 1 document) |&lt;br&gt;
| Corpus | Tất cả users |&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ tính toán:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User A: [DealHot: 50, Profile: 10, Voucher: 30, Mission: 5]
Total visits: 95

TF(DealHot, UserA) = 50/95 = 0.53

IDF(DealHot) = log(2666 / 2274) = 0.16  (85% users vào → IDF thấp)
IDF(RequestPassword) = log(2666 / 1) = 7.89  (chỉ 1 user → IDF cao)

TF-IDF(DealHot, UserA) = 0.53 × 0.16 = 0.08  (THẤP - page phổ biến)
TF-IDF(RequestPassword, UserA) = 0.25 × 7.89 = 1.97  (CAO - page rare)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Ý nghĩa
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TF-IDF cao = Page quan trọng để phân biệt user&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Các trường hợp:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TF cao, IDF cao&lt;/strong&gt; → Quan trọng&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User vào page này nhiều VÀ page này rare&lt;/li&gt;
&lt;li&gt;Đặc trưng duy nhất của user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TF cao, IDF thấp&lt;/strong&gt; → Ít quan trọng&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User vào page này nhiều NHƯNG ai cũng vào&lt;/li&gt;
&lt;li&gt;Không phân biệt user này với users khác&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TF thấp, IDF cao&lt;/strong&gt; → Trung bình&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User vào page rare 1 lần&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TF thấp, IDF thấp&lt;/strong&gt; → Không quan trọng&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Noise&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  4. Ứng dụng
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Feature Weighting cho Clustering
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Raw counts: DealHot(50), Mission(5) → DealHot dominates&lt;/li&gt;
&lt;li&gt;TF-IDF: DealHot(0.08), Mission(0.35) → Mission quan trọng hơn!&lt;/li&gt;
&lt;li&gt;K-Means trên TF-IDF features → clusters tốt hơn&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Tìm Đặc trưng của User
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 664402 - Top 3 pages by TF-IDF:
1. RequestPassword: 1.97  (rare page, đặc trưng)
2. UpdateProfile: 0.89
3. Mission: 0.35
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;→ User này có behavior độc đáo (vào RequestPassword)&lt;/p&gt;

&lt;h4&gt;
  
  
  Kết hợp với Cosine Similarity
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;TF-IDF vectors thay vì raw counts&lt;/li&gt;
&lt;li&gt;Cosine similarity trên TF-IDF → better recommendations&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Giảm nhiễu&lt;/strong&gt; - Loại bỏ ảnh hưởng của pages phổ biến&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Tìm unique behaviors&lt;/strong&gt; - Highlight pages đặc trưng&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Better clustering&lt;/strong&gt; - Features tốt hơn raw counts&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Scalable&lt;/strong&gt; - Tính toán nhanh&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Không phải thuật toán&lt;/strong&gt; - Chỉ là feature engineering&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Bỏ qua thứ tự thời gian&lt;/strong&gt; - Bag-of-words approach&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Giả định independence&lt;/strong&gt; - Pages không liên quan nhau&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Sparse high-dim data&lt;/strong&gt; - 40 pages × 2666 users nhiều 0&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  III) SEQUENTIAL PATTERN MINING (KHÁM PHÁ CHUỖI HÀNH VI)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Mục đích
&lt;/h3&gt;

&lt;p&gt;Sequential Mining &lt;strong&gt;TRẢ LỜI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User đi theo đường nào? (user journey)&lt;/li&gt;
&lt;li&gt;Sau page A, user thường vào page B?&lt;/li&gt;
&lt;li&gt;Dự đoán next page?&lt;/li&gt;
&lt;li&gt;Funnel nào có drop-off cao?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Khác biệt chính:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Association Rules: {A, B, C} - không quan tâm thứ tự
Sequential Mining: &amp;lt;A → B → C&amp;gt; - giữ nguyên thứ tự thời gian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  1. Nguyên lý
&lt;/h3&gt;

&lt;p&gt;Tìm &lt;strong&gt;chuỗi patterns&lt;/strong&gt; xuất hiện thường xuyên theo thứ tự thời gian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Profile → DealHot → Voucher&amp;gt; 
≠ 
&amp;lt;DealHot → Profile → Voucher&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Subsequence:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S = &amp;lt;A, B, C, D, E&amp;gt;
S' = &amp;lt;B, D&amp;gt; là subsequence của S (bỏ qua A, C, E nhưng giữ thứ tự)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support của Sequential Pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Support(&amp;lt;Profile → Mission → CreateMission&amp;gt;) 
= số users có subsequence này / tổng users
= 450 / 2666 = 0.169 (16.9%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Các thuật toán
&lt;/h3&gt;

&lt;h4&gt;
  
  
  AprioriAll
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tìm frequent itemsets&lt;/li&gt;
&lt;li&gt;Mở rộng dần thành sequences&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhược điểm:&lt;/strong&gt; Chậm với data lớn&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  GSP (Generalized Sequential Pattern)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tương tự AprioriAll&lt;/li&gt;
&lt;li&gt;Tối ưu hơn bằng pruning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ưu điểm:&lt;/strong&gt; Nhanh hơn AprioriAll&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  PrefixSpan ⭐ (Đề xuất)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Divide and Conquer + Prefix Projection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ưu điểm:&lt;/strong&gt; Rất nhanh, không generate quá nhiều candidates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phù hợp nhất&lt;/strong&gt; cho piggi_metrics.csv&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cách hoạt động PrefixSpan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Scan database, tìm frequent 1-sequences: &amp;lt;Profile&amp;gt;, &amp;lt;DealHot&amp;gt;, &amp;lt;Mission&amp;gt;
2. Với mỗi prefix (vd: &amp;lt;Profile&amp;gt;):
   - Tạo projected database (chỉ chứa phần sau &amp;lt;Profile&amp;gt;)
   - Đệ quy tìm patterns: &amp;lt;Profile, DealHot&amp;gt;, &amp;lt;Profile, Mission&amp;gt;,...
3. Repeat cho đến khi không còn frequent patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Kết quả ví dụ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Frequent Sequential Patterns:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Profile → DealHot&amp;gt;                     : 35% users (930 users)
&amp;lt;Mission → CreateMission&amp;gt;               : 25% users (666 users)
&amp;lt;DealHot → Voucher&amp;gt;                     : 18% users (480 users)
&amp;lt;Loyalty → RankMember → LoyaltyHistory&amp;gt; : 12% users (320 users)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Long Patterns (user journeys):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Profile → Mission → CreateMission → Mission&amp;gt;         : 16.9% users
&amp;lt;DealHot → Voucher → DealHot → FlashsaleEmbedded&amp;gt;    : 14.3% users
&amp;lt;Loyalty → RankMember → LoyaltyHistory → Loyalty&amp;gt;    : 11.2% users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Phân loại User theo Pattern
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;User Type&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;DealHot → FlashsaleEmbedded&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quick Buyer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mua nhanh, không so sánh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Profile → DealHot → Voucher → DealHot → Voucher&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Browser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;So sánh nhiều trước khi quyết định&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Mission → CreateMission → MissionSwap → Mission&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Mission Player&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thích features mission, loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Loyalty → RankMember → LoyaltyHistory → LoyaltyProduct&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Loyalty Enthusiast&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quan tâm điểm thưởng, ranking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  5. Ứng dụng
&lt;/h3&gt;

&lt;h4&gt;
  
  
  a) Dự đoán Next Page
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; User vừa vào &lt;code&gt;&amp;lt;Profile → DealHot&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phân tích từ patterns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pattern &lt;code&gt;&amp;lt;Profile → DealHot → Voucher&amp;gt;&lt;/code&gt;: 35% support&lt;/li&gt;
&lt;li&gt;Pattern &lt;code&gt;&amp;lt;Profile → DealHot → FlashsaleEmbedded&amp;gt;&lt;/code&gt;: 25% support&lt;/li&gt;
&lt;li&gt;Pattern &lt;code&gt;&amp;lt;Profile → DealHot → DealHot&amp;gt;&lt;/code&gt;: 20% support (quay lại)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dự đoán tiếp theo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40% khả năng → &lt;strong&gt;Voucher&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;25% khả năng → &lt;strong&gt;FlashsaleEmbedded&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;20% khả năng → &lt;strong&gt;DealHot&lt;/strong&gt; (quay lại)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; Recommend/highlight 3 pages này&lt;/p&gt;




&lt;h4&gt;
  
  
  b) Tối ưu UX (Drop-off Detection)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Phát hiện:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nhiều users dừng tại: &amp;lt;Profile → DealHot&amp;gt; (không đi tiếp)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phân tích:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UX chưa tốt (khó tìm Voucher?)&lt;/li&gt;
&lt;li&gt;CTA (Call-to-Action) chưa rõ ràng&lt;/li&gt;
&lt;li&gt;Deal chưa hấp dẫn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; Redesign flow từ DealHot → Voucher&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thêm prominent button "Xem Voucher"&lt;/li&gt;
&lt;li&gt;A/B testing different layouts&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  c) Funnel Analysis
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Conversion Funnel:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Profile → DealHot → Voucher → FlashsaleEmbedded → Order

100%  →   70%    →   50%    →        30%         →  15%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insights:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop-off lớn nhất: Voucher → FlashsaleEmbedded (20% drop)&lt;/li&gt;
&lt;li&gt;Drop-off thứ 2: FlashsaleEmbedded → Order (15% drop)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cải thiện transition Voucher → FlashsaleEmbedded&lt;/li&gt;
&lt;li&gt;Simplify order process&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  d) Personalized Recommendation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Pattern của User A:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Mission → MissionSwap → Mission&amp;gt; (lặp lại nhiều lần)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recommendation strategy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Ưu tiên hiển thị Mission mới&lt;/li&gt;
&lt;li&gt;✅ Push notification về Mission events&lt;/li&gt;
&lt;li&gt;❌ Giảm hiển thị Deal/Voucher (user không quan tâm)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Capture thứ tự hành vi&lt;/strong&gt; - Hiểu user journey đầy đủ&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Tìm được pattern dài&lt;/strong&gt; - Multi-step behaviors&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Dự đoán next action tốt&lt;/strong&gt; - Based on historical patterns&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Phát hiện funnel bottlenecks&lt;/strong&gt; - Drop-off analysis&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Actionable insights&lt;/strong&gt; - UX improvements&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Tính toán nặng&lt;/strong&gt; - Với dữ liệu lớn, chậm&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Cần nhiều data&lt;/strong&gt; - Patterns có ý nghĩa cần support cao&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Không capture duration&lt;/strong&gt; - Thời gian giữa các bước&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Dễ sinh quá nhiều patterns&lt;/strong&gt; - Cần filter, min_support cao&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Không biết WHY&lt;/strong&gt; - Chỉ biết WHAT (patterns) không biết WHY&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  8. Session Definition (quan trọng!)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Vấn đề:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User vào Profile lúc 9h sáng&lt;/li&gt;
&lt;li&gt;User vào DealHot lúc 10h tối&lt;/li&gt;
&lt;li&gt;Có phải 1 sequence &lt;code&gt;&amp;lt;Profile → DealHot&amp;gt;&lt;/code&gt; không?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Giải pháp: Định nghĩa Session&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session gap = 30 phút

Events cách nhau &amp;gt; 30 phút → sessions khác nhau
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 664402:
- 09:00 Profile
- 09:05 Mission
- 09:10 CreateMission
  [gap &amp;gt; 30 min]
- 22:00 DealHot

→ 2 sequences:
  Session 1: &amp;lt;Profile → Mission → CreateMission&amp;gt;
  Session 2: &amp;lt;DealHot&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  IV) ASSOCIATION RULES (APRIORI / FP-GROWTH)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Mục đích
&lt;/h3&gt;

&lt;p&gt;Association Rules &lt;strong&gt;TRẢ LỜI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page A và B có xuất hiện cùng nhau không?&lt;/li&gt;
&lt;li&gt;Nếu user vào A, khả năng vào B là bao nhiêu?&lt;/li&gt;
&lt;li&gt;Pages nào nên đặt gần nhau trong UI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Khác Sequential Mining:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không quan tâm thứ tự&lt;/strong&gt; - {A, B} = {B, A}&lt;/li&gt;
&lt;li&gt;Chỉ quan tâm &lt;strong&gt;co-occurrence&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. Metrics
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Support (Độ hỗ trợ)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Support(A → B) = (số users vào cả A và B) / (tổng số users)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ý nghĩa:&lt;/strong&gt; Tỷ lệ % users có cả A và B&lt;/p&gt;




&lt;h4&gt;
  
  
  Confidence (Độ tin cậy)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Confidence(A → B) = (users vào cả A và B) / (users vào A) = P(B|A)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ý nghĩa:&lt;/strong&gt; Trong số users vào A, bao nhiêu % vào B&lt;/p&gt;




&lt;h4&gt;
  
  
  Lift (Độ nâng)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lift(A → B) = Confidence(A → B) / Support(B) = P(B|A) / P(B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ý nghĩa:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lift &amp;gt; 1:&lt;/strong&gt; Positive correlation (A và B xuất hiện cùng &lt;strong&gt;nhiều hơn&lt;/strong&gt; ngẫu nhiên)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lift = 1:&lt;/strong&gt; A và B độc lập&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lift &amp;lt; 1:&lt;/strong&gt; Negative correlation (A và B xuất hiện cùng &lt;strong&gt;ít hơn&lt;/strong&gt; ngẫu nhiên)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Ví dụ cụ thể
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rule 1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{DealHot} → {Voucher}

Support = 0.30 (30% users vào cả 2)
Confidence = 0.70 (70% users vào DealHot cũng vào Voucher)
Lift = 2.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Giải thích:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30% tất cả users vào cả DealHot và Voucher&lt;/li&gt;
&lt;li&gt;Trong số users vào DealHot, 70% vào Voucher&lt;/li&gt;
&lt;li&gt;Lift = 2.3 &amp;gt; 1 → Correlation mạnh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đặt Voucher button gần DealHot&lt;/li&gt;
&lt;li&gt;Recommend Voucher khi user xem DealHot&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Rule 2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{Mission} → {CreateMission}

Support = 0.25 (25% users)
Confidence = 0.51 (51%)
Lift = 2.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đặt CreateMission button prominent trong Mission page&lt;/li&gt;
&lt;li&gt;51% users vào Mission quan tâm CreateMission&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Thuật toán
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Apriori
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Nguyên lý Apriori:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nếu itemset I không frequent (Support &amp;lt; min_support),
thì mọi superset của I cũng không frequent.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{Mission, CreateMission} Support = 0.05 &amp;lt; 0.1 (min_support)
→ {Mission, CreateMission, Profile} cũng &amp;lt; 0.1
→ Không cần kiểm tra (pruning)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nhược điểm:&lt;/strong&gt; Sinh nhiều candidates, chậm&lt;/p&gt;




&lt;h4&gt;
  
  
  FP-Growth (Frequent Pattern Growth)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Ưu điểm:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dùng FP-Tree (compressed representation)&lt;/li&gt;
&lt;li&gt;Không cần generate candidates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nhanh hơn Apriori nhiều&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phù hợp:&lt;/strong&gt; Dữ liệu lớn, nhiều items&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Ứng dụng
&lt;/h3&gt;

&lt;h4&gt;
  
  
  UI/UX Design
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rule: {DealHot} → {Voucher} (confidence 70%, lift 2.3)

Action:
- Đặt Voucher tab ngay cạnh DealHot tab
- "Xem thêm Voucher" button trong DealHot page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cross-Selling
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rule: {Mission} → {CreateMission, MissionSwap}

Action:
- Bundle recommendation
- "Users also interested in..." section
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Page Layout Optimization
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rules với Lift cao:
- {DealHot, Voucher} → Đặt gần nhau
- {Mission, CreateMission} → Đặt gần nhau
- {Loyalty, RankMember} → Đặt gần nhau
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Tự động tìm patterns&lt;/strong&gt; - Không cần define trước&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Phát hiện correlations ẩn&lt;/strong&gt; - Unexpected patterns&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Actionable insights&lt;/strong&gt; - Trực tiếp apply vào UI/UX&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Dễ giải thích&lt;/strong&gt; - Rules IF-THEN rõ ràng&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Sinh quá nhiều rules&lt;/strong&gt; - Cần filter bằng Lift, min_confidence&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Không hiểu thứ tự&lt;/strong&gt; - {A, B} không biết A trước hay B trước&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Chỉ co-occurrence, không causation&lt;/strong&gt; - Correlation ≠ Causation&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Sparse data&lt;/strong&gt; - Users vào ít pages → ít frequent itemsets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 SO SÁNH TỔNG QUAN
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thuật toán&lt;/th&gt;
&lt;th&gt;Trả lời câu hỏi&lt;/th&gt;
&lt;th&gt;Giữ thứ tự?&lt;/th&gt;
&lt;th&gt;Dự đoán next?&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cosine Similarity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users giống nhau?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⚠️ Gián tiếp&lt;/td&gt;
&lt;td&gt;O(n² × d)&lt;/td&gt;
&lt;td&gt;Similarity matrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TF-IDF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Page nào quan trọng?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;O(n × d)&lt;/td&gt;
&lt;td&gt;Feature vectors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sequential Mining&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User journey? Next page?&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;Cao&lt;/td&gt;
&lt;td&gt;Patterns + probabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Association Rules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A và B cùng xuất hiện?&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;Trung bình&lt;/td&gt;
&lt;td&gt;IF-THEN rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 ỨNG DỤNG THỰC TẾ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recommendation System (Collaborative Filtering)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TF-IDF → Loại bỏ pages phổ biến, tập trung vào preferences độc đáo&lt;/li&gt;
&lt;li&gt;Cosine Similarity → Tìm top 20 users tương tự&lt;/li&gt;
&lt;li&gt;Recommend pages mà similar users thích nhưng user hiện tại chưa vào&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User A: Profile(10), Mission(30), CreateMission(15)&lt;/li&gt;
&lt;li&gt;Similar users: B, C, D cũng thích Mission&lt;/li&gt;
&lt;li&gt;Users B, C, D còn thích: MissionSwap&lt;/li&gt;
&lt;li&gt;→ Recommend MissionSwap cho User A&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Next Page Prediction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sequential Mining → Phát hiện patterns &lt;code&gt;&amp;lt;A → B → C&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Association Rules → Tính correlations giữa pages&lt;/li&gt;
&lt;li&gt;Kết hợp cả 2 → Dự đoán với confidence scores&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User vừa vào: Profile → DealHot&lt;/li&gt;
&lt;li&gt;Sequential: &lt;code&gt;&amp;lt;Profile → DealHot → Voucher&amp;gt;&lt;/code&gt; xuất hiện 40% cases&lt;/li&gt;
&lt;li&gt;Association: {DealHot} → {Voucher} có confidence 70%&lt;/li&gt;
&lt;li&gt;→ Dự đoán: User sẽ vào Voucher tiếp theo (high confidence)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  UX/UI Optimization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sequential Mining → Hiểu user journeys đầy đủ&lt;/li&gt;
&lt;li&gt;Funnel Analysis → Tìm điểm drop-off cao&lt;/li&gt;
&lt;li&gt;Association Rules → Pages nào nên đặt gần nhau&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Funnel: Profile → DealHot → Voucher → Order&lt;/li&gt;
&lt;li&gt;Drop-off lớn nhất: DealHot → Voucher (30% users rời đi)&lt;/li&gt;
&lt;li&gt;Association Rule: {DealHot} → {Voucher} có lift cao&lt;/li&gt;
&lt;li&gt;→ Action: Làm nổi bật "Xem Voucher" button trong DealHot page&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Personalization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cosine Similarity → Phân loại user vào nhóm tương đồng&lt;/li&gt;
&lt;li&gt;TF-IDF → Tìm unique preferences&lt;/li&gt;
&lt;li&gt;Sequential → Dự đoán hành động tiếp theo&lt;/li&gt;
&lt;li&gt;Personalize: Homepage, notifications, emails theo từng nhóm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User A: TF-IDF cho thấy thích Mission (score cao)&lt;/li&gt;
&lt;li&gt;Pattern: &lt;code&gt;&amp;lt;Mission → CreateMission → Mission&amp;gt;&lt;/code&gt; (lặp lại)&lt;/li&gt;
&lt;li&gt;→ Homepage: Hiển thị Mission content ở top&lt;/li&gt;
&lt;li&gt;→ Push notification: Mission events, competitions&lt;/li&gt;
&lt;li&gt;→ Email: Mission-related updates&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>THUẬT TOÁN PHÂN LOẠI NGƯỜI DÙNG</title>
      <dc:creator>Hoàng Mạnh Khiêm</dc:creator>
      <pubDate>Fri, 22 May 2026 05:29:55 +0000</pubDate>
      <link>https://forem.com/hoangmanhkhiem/thuat-toan-phan-loai-nguoi-dung-4kdf</link>
      <guid>https://forem.com/hoangmanhkhiem/thuat-toan-phan-loai-nguoi-dung-4kdf</guid>
      <description>&lt;h2&gt;
  
  
  🎯 BÀI TOÁN
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Có:&lt;/strong&gt; 2,666 users, mỗi user vào các pages khác nhau (DealHot, Mission, Voucher,...)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Muốn:&lt;/strong&gt; Chia users thành các nhóm có hành vi giống nhau&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nhóm 1: Thích săn deal (hay vào DealHot, Voucher)&lt;/li&gt;
&lt;li&gt;Nhóm 2: Thích chơi mission (hay vào Mission, CreateMission)&lt;/li&gt;
&lt;li&gt;Nhóm 3: Thích chat (hay vào ChatRoom, ReferralFriend)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  I) K-MEANS - PHÂN NHÓM ĐƠN GIẢN NHẤT
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Giống như phân học sinh thành các nhóm học:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Thầy giáo chọn 5 bạn làm nhóm trưởng (ngẫu nhiên)&lt;/li&gt;
&lt;li&gt;Các bạn còn lại tìm nhóm trưởng "giống mình nhất" để vào nhóm đó&lt;/li&gt;
&lt;li&gt;Nhóm trưởng mới = trung bình của các bạn trong nhóm&lt;/li&gt;
&lt;li&gt;Lặp lại bước 2-3 đến khi không ai đổi nhóm nữa&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  📖 Ví dụ thực tế
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Từ data piggi_metrics.csv, lấy 7 users:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 664402: Profile(3), UpdateProfile(1)                    → 4 lượt
User 581242: EmbeddedBrowser(1)                              → 1 lượt
User 665300: GetMissionPoint(1), Mission(2), Profile(1)      → 4 lượt
User 273471: Voucher(1), DealHot(1)                          → 2 lượt
User 184423: Profile(1), ReferralFriend(1)                   → 2 lượt
User 665302: Mission(1), CreateMission(1)                    → 2 lượt
User 121:    DealHot(1)                                      → 1 lượt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chuyển sang vector (đếm lượt vào từng page):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              Mission  DealHot  Profile  Voucher  Social
User 665300:    3        0        1        0        0
User 665302:    2        0        0        0        0
User 664402:    0        0        4        0        0
User 273471:    0        1        0        1        0
User 121:       0        1        0        0        0
User 184423:    0        0        1        0        1
User 581242:    0        0        0        0        0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chạy K-Means với k=3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bước 1: Chọn 3 nhóm trưởng ngẫu nhiên
  - Nhóm trưởng 1: User 665300 (Mission nhiều)
  - Nhóm trưởng 2: User 273471 (Deal)
  - Nhóm trưởng 3: User 664402 (Profile nhiều)

Bước 2: Các user tìm nhóm trưởng giống mình
  - User 665302 giống User 665300 → Nhóm 1 (Mission)
  - User 121 giống User 273471 → Nhóm 2 (Deal)
  - User 184423 giống User 664402 → Nhóm 3 (Profile/Social)
  - User 581242 (ít tương tác) → Nhóm 3

Bước 3: Tính nhóm trưởng mới
  - Nhóm 1: Mission trung bình cao
  - Nhóm 2: DealHot, Voucher trung bình cao
  - Nhóm 3: Profile, social features

Bước 4: Lặp lại cho đến khi hội tụ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kết quả cuối:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm 1 (Mission Players):&lt;/strong&gt; User 665300, 665302&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm 2 (Deal Hunters):&lt;/strong&gt; User 273471, 121&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm 3 (Profile/Social Users):&lt;/strong&gt; User 664402, 184423, 581242&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nhanh&lt;/strong&gt; - Chạy với 2,666 users trong vài giây&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đơn giản&lt;/strong&gt; - Dễ hiểu, dễ code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kết quả rõ ràng&lt;/strong&gt; - Mỗi user chỉ thuộc 1 nhóm duy nhất&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phải biết trước số nhóm (k)&lt;/strong&gt; - Muốn chia thành mấy nhóm?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhạy với "outliers"&lt;/strong&gt; - User lạ sẽ kéo nhóm lệch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kết quả khác nhau mỗi lần chạy&lt;/strong&gt; - Do chọn nhóm trưởng ngẫu nhiên&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi bạn biết muốn chia thành bao nhiêu nhóm (vd: 5 nhóm)&lt;br&gt;
✅ Khi cần kết quả nhanh&lt;br&gt;
✅ Khi users khá đồng đều (không có user quá lạ)&lt;/p&gt;


&lt;h2&gt;
  
  
  II) DBSCAN - TÌM NHÓM BẠN ĐÔNG ĐÚC
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Giống như tìm nhóm bạn trong lớp học:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nếu bạn có &lt;strong&gt;ít nhất 5 người bạn thân&lt;/strong&gt; (trong bán kính gần) → Bạn là "người nổi"&lt;/li&gt;
&lt;li&gt;Bạn của "người nổi" → Cùng nhóm&lt;/li&gt;
&lt;li&gt;Nếu bạn không có đủ 5 bạn thân và cũng không phải bạn của "người nổi" → &lt;strong&gt;Loner&lt;/strong&gt; (outlier)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Không cần biết trước số nhóm!&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Từ 21 dòng data đầu tiên, ta có:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 665300: Mission(2), GetMissionPoint(1), Profile(1)      → Mission-focused
User 665302: Mission(1), CreateMission(1)                    → Mission-focused
User 200165: Mission(1)                                      → Mission-focused
  ↓ 3 users này "gần nhau" vì đều thích Mission

User 273471: Voucher(1), DealHot(1)                          → Deal-focused
User 121:    DealHot(1)                                      → Deal-focused
User 82777:  FlashsaleEmbedded(1)                            → Deal-focused
  ↓ 3 users này "gần nhau" vì đều thích săn deal

User 664402: Profile(3), UpdateProfile(1)                    → OUTLIER
  ↓ Chỉ vào Profile, không giống ai → Lẻ loi

User 581242: EmbeddedBrowser(1)                              → OUTLIER
User 294132: ChatRoom(1)                                     → OUTLIER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DBSCAN tự động phát hiện:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set parameters: eps=0.5, min_samples=3

Bước 1: Tìm vùng đông đúc
  - Vùng Mission: 3 users gần nhau → Nhóm 1 ✅
  - Vùng Deal: 3 users gần nhau → Nhóm 2 ✅

Bước 2: Đánh dấu outliers
  - User 664402: Không có đủ 3 neighbors → Outlier ⚠️
  - User 581242: Không thuộc nhóm nào → Outlier ⚠️
  - User 294132: ChatRoom độc lập → Outlier ⚠️
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kết quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm 1 (Mission Players):&lt;/strong&gt; User 665300, 665302, 200165&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm 2 (Deal Hunters):&lt;/strong&gt; User 273471, 121, 82777&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outliers:&lt;/strong&gt; User 664402, 581242, 294132 (hành vi lạ, không thuộc nhóm chính)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không cần biết số nhóm trước&lt;/strong&gt; - Tự động tìm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tìm được outliers&lt;/strong&gt; - User có hành vi lạ (VIP, bot, test accounts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhóm hình dạng bất kỳ&lt;/strong&gt; - Không bắt buộc hình tròn&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Khó chọn tham số&lt;/strong&gt; - "Bao xa là gần?" "Bao nhiêu bạn là đủ đông?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chậm hơn K-Means&lt;/strong&gt; - Với 2,666 users vẫn OK&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không tốt nếu mật độ khác nhau&lt;/strong&gt; - Vùng đông ít khác biệt quá&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi KHÔNG biết có bao nhiêu nhóm&lt;br&gt;
✅ Khi muốn tìm users lạ (VIP, bot)&lt;br&gt;
✅ Khi các nhóm có kích thước/mật độ tương đương&lt;/p&gt;


&lt;h2&gt;
  
  
  III) GMM - MỖI NGƯỜI CÓ NHIỀU MẶT
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Khác với K-Means (mỗi user chỉ thuộc 1 nhóm), GMM cho phép:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;User A có thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60% là "Deal Lover"&lt;/li&gt;
&lt;li&gt;35% là "Mission Player"&lt;/li&gt;
&lt;li&gt;5% là "Social User"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Giống như một người có nhiều sở thích:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bạn An: 70% thích bóng đá, 30% thích game&lt;/li&gt;
&lt;li&gt;Bạn Bình: 50% thích bóng đá, 50% thích đọc sách&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;User 664402 từ data thực:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-05-20 15:56:44  →  Profile
2026-05-20 15:56:45  →  UpdateProfile
2026-05-20 15:56:46  →  Profile

Hành vi thực tế: Profile(3), UpdateProfile(1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Giả sử user này còn có thêm data:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Profile: 15 lần
- Mission: 8 lần
- DealHot: 3 lần
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;K-Means nói:&lt;/strong&gt; User này thuộc nhóm "Profile User" (100%)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GMM nói:&lt;/strong&gt; User này có nhiều mặt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60% Profile/Settings User (quan tâm cài đặt)&lt;/li&gt;
&lt;li&gt;35% Mission Player (thỉnh thoảng chơi mission)&lt;/li&gt;
&lt;li&gt;5% Deal Hunter (ít quan tâm deals)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Insight:&lt;/strong&gt;&lt;br&gt;
→ User này chủ yếu vào chỉnh sửa profile, NHƯNG cũng thích missions&lt;br&gt;
→ &lt;strong&gt;Recommend:&lt;/strong&gt; Personalization features + Mission notifications&lt;br&gt;
→ Không nên spam Deal notifications vì chỉ 5% quan tâm&lt;/p&gt;


&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linh hoạt&lt;/strong&gt; - User có thể thuộc nhiều nhóm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realistic&lt;/strong&gt; - Người thật thường có nhiều sở thích&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cung cấp xác suất&lt;/strong&gt; - Biết độ tin cậy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phức tạp hơn&lt;/strong&gt; - Khó hiểu hơn K-Means&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chậm hơn&lt;/strong&gt; - Tính toán nhiều hơn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vẫn cần biết số nhóm&lt;/strong&gt; - Như K-Means&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi users có nhiều sở thích (không rõ ràng 1 nhóm)&lt;br&gt;
✅ Khi cần recommendation đa dạng&lt;br&gt;
✅ Khi muốn xác suất thay vì nhóm cứng&lt;/p&gt;


&lt;h2&gt;
  
  
  IV) PHÂN LOẠI THEO RFD - ĐÁNH GIÁ MỨC ĐỘ TƯƠNG TÁC
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Không phân loại theo "thích gì" mà phân loại theo "tương tác như thế nào":&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 tiêu chí:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R (Recency):&lt;/strong&gt; Lần cuối vào app cách đây bao lâu?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F (Frequency):&lt;/strong&gt; Vào app bao nhiêu lần?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D (Diversity):&lt;/strong&gt; Vào bao nhiêu pages khác nhau?&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Phân tích 3 users từ data thực:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User 665300:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Từ data: GetMissionPoint(1), Mission(2), Profile(1) trong ngày 2026-05-20

- Recency: 2026-05-20 (hôm nay = data mới nhất) → R = 5 ✅
- Frequency: 4 lượt trong data này → F = 3 (trung bình) ⚠️
- Diversity: 3 pages khác nhau (Mission, GetMissionPoint, Profile) → D = 3 ⚠️
→ Xếp hạng: 5-3-3 = "Potential Loyalist"
   (Active gần đây, nhưng chưa dùng nhiều features)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;User 664402:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Từ data: Profile(3), UpdateProfile(1) trong ngày 2026-05-20

- Recency: 2026-05-20 (hôm nay) → R = 5 ✅
- Frequency: 4 lượt → F = 3 ⚠️
- Diversity: 2 pages (Profile, UpdateProfile) → D = 2 ⚠️
→ Xếp hạng: 5-3-2 = "Loyal but Focused"
   (Active, nhưng chỉ quan tâm Profile features)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;User 581242:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Từ data: EmbeddedBrowser(1) trong ngày 2026-05-20

- Recency: 2026-05-20 (hôm nay) → R = 5 ✅
- Frequency: 1 lượt duy nhất → F = 1 ❌
- Diversity: 1 page → D = 1 ❌
→ Xếp hạng: 5-1-1 = "New User"
   (Mới vào lần đầu hoặc người dùng thụ động)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Insight:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tất cả đều active (R=5) vì data chỉ có 1 ngày (2026-05-20)&lt;/li&gt;
&lt;li&gt;User 665300 explore nhiều nhất → Tiềm năng cao&lt;/li&gt;
&lt;li&gt;User 664402 chỉ focus vào Profile → Cần khuyến khích dùng features khác&lt;/li&gt;
&lt;li&gt;User 581242 mới vào → Cần onboarding&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🎭 Các nhóm users
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhóm&lt;/th&gt;
&lt;th&gt;Đặc điểm&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Champions&lt;/strong&gt; (5-5-5)&lt;/td&gt;
&lt;td&gt;Active, hay vào, explore nhiều&lt;/td&gt;
&lt;td&gt;VIP treatment, early access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Loyal Customers&lt;/strong&gt; (5-5-2)&lt;/td&gt;
&lt;td&gt;Active, hay vào, nhưng chỉ thích vài tính năng&lt;/td&gt;
&lt;td&gt;Giữ chân, đừng thay đổi features họ thích&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;New Users&lt;/strong&gt; (5-1-1)&lt;/td&gt;
&lt;td&gt;Mới vào lần đầu&lt;/td&gt;
&lt;td&gt;Onboarding, hướng dẫn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;At Risk&lt;/strong&gt; (2-4-3)&lt;/td&gt;
&lt;td&gt;Lâu không vào, nhưng từng active&lt;/td&gt;
&lt;td&gt;Gửi email "We miss you", tặng voucher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Lost&lt;/strong&gt; (1-1-1)&lt;/td&gt;
&lt;td&gt;Đã bỏ app&lt;/td&gt;
&lt;td&gt;Win-back campaign, hoặc để yên&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Đơn giản&lt;/strong&gt; - Chỉ 3 con số, dễ hiểu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business-friendly&lt;/strong&gt; - Marketing team hiểu ngay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhanh&lt;/strong&gt; - Tính toán 2,666 users trong &amp;lt; 1 giây&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionable&lt;/strong&gt; - Biết ngay làm gì với từng nhóm&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không nói user thích page nào&lt;/strong&gt; - Chỉ nói mức độ tương tác&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quá đơn giản&lt;/strong&gt; - Bỏ qua nhiều thông tin chi tiết&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cần data dài hạn&lt;/strong&gt; - Recency cần ít nhất vài tuần data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi cần phân loại nhanh để marketing&lt;br&gt;
✅ Khi muốn kết quả dễ giải thích&lt;br&gt;
✅ &lt;strong&gt;KẾT HỢP với thuật toán khác&lt;/strong&gt; để biết user thích gì&lt;/p&gt;


&lt;h2&gt;
  
  
  V) RULE-BASED - LẬP LUẬT THỦ CÔNG
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bạn tự quy định luật, không dùng AI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NẾU user vào DealHot &amp;gt; 30 lần
  → Gắn nhãn "Deal Lover"

NẾU user vào Mission &amp;gt; 20 lần
  → Gắn nhãn "Mission Player"

NẾU user không vào app &amp;gt; 30 ngày
  → Gắn nhãn "Churn Risk"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Giống như thầy cô chấm điểm theo thang điểm cố định.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Áp dụng rules cho users thực:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 1: Mission Player&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IF count_Mission &amp;gt;= 2 THEN "mission_player"

User 665300: Mission(2) + GetMissionPoint(1) → Tổng 3 → ✅ "mission_player"
User 665302: Mission(1) + CreateMission(1) → Tổng 2 → ✅ "mission_player"
User 200165: Mission(1) → ❌ Không đủ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule 2: Deal Hunter&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IF (count_DealHot &amp;gt;= 1 OR count_Voucher &amp;gt;= 1) THEN "deal_hunter"

User 273471: DealHot(1) + Voucher(1) → ✅ "deal_hunter"
User 121: DealHot(1) → ✅ "deal_hunter"
User 82777: FlashsaleEmbedded(1) → ✅ "deal_hunter"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule 3: Profile Focused&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IF count_Profile &amp;gt;= 2 AND count_other_pages &amp;lt; 2 THEN "profile_focused"

User 664402: Profile(3) + UpdateProfile(1) → ✅ "profile_focused"
User 184423: Profile(1) → ❌ Không đủ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule 4: Chuỗi hành vi (Sequence)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Từ data thực:
2026-05-20 15:56:44  User 664402  Profile
2026-05-20 15:56:45  User 664402  UpdateProfile
2026-05-20 15:56:46  User 664402  Profile

Rule: IF path = ["Profile" → "UpdateProfile" → "Profile"]
      THEN "edit_then_verify" (Sửa profile rồi check lại)
→ User 664402: ✅ Match pattern này
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kết quả phân loại:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mission Players:&lt;/strong&gt; 665300, 665302&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deal Hunters:&lt;/strong&gt; 273471, 121, 82777&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile Focused:&lt;/strong&gt; 664402&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncategorized:&lt;/strong&gt; 581242, 184423, 294132, 568861, 145593, 200165&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🎯 Case Study
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Công ty muốn tìm users "sắp mua hàng":&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rule: "Ready to Buy"
  IF (vào DealHot &amp;gt; 5 lần trong 3 ngày qua
      AND vào Voucher &amp;gt; 2 lần
      AND chưa Order trong 7 ngày qua)
  THEN gửi push notification "Flash Sale 50% - Chỉ 2 giờ!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;→ Conversion rate tăng vì đúng timing!&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dễ hiểu 100%&lt;/strong&gt; - Ai cũng đọc được&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiểm soát hoàn toàn&lt;/strong&gt; - Bạn quyết định mọi thứ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không cần training&lt;/strong&gt; - Viết rule là xong&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giải thích được cho sếp&lt;/strong&gt; - "Em làm theo logic này..."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không tự học&lt;/strong&gt; - Không tìm ra patterns mới&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cần domain knowledge&lt;/strong&gt; - Phải hiểu business sâu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Khó maintain&lt;/strong&gt; - 100 rules sẽ rối loạn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules có thể conflict&lt;/strong&gt; - Rule 1 nói A, Rule 2 nói B&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi business logic rõ ràng&lt;br&gt;
✅ Khi cần giải thích cho non-tech team&lt;br&gt;
✅ Khi bắt đầu (chưa có data để train ML)&lt;br&gt;
✅ &lt;strong&gt;KẾT HỢP với ML&lt;/strong&gt; - ML tìm patterns, Rules finalize&lt;/p&gt;


&lt;h2&gt;
  
  
  VI) HIERARCHICAL - XÂY DỰNG CÂY GIA PHẢ
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Giống như vẽ cây gia phả:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Tất cả Users
                    /          \
            Active Users    Inactive Users
            /        \
    Deal Lovers   Mission Players
       /    \
   Heavy  Light
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bắt đầu từ mỗi user = 1 nhóm riêng, merge dần các user giống nhau.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lấy 6 users từ data thực:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 665300: Mission(3), Profile(1)               → Mission-heavy
User 665302: Mission(1), CreateMission(1)         → Mission-heavy
User 273471: DealHot(1), Voucher(1)               → Deal-heavy
User 121:    DealHot(1)                           → Deal-heavy
User 664402: Profile(3), UpdateProfile(1)         → Profile-heavy
User 184423: Profile(1), ReferralFriend(1)        → Mixed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Quá trình merge (từ dưới lên):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ban đầu: [665300] [665302] [273471] [121] [664402] [184423]

Bước 1: 665300 và 665302 giống nhất (cùng Mission) → Merge
        [665300,665302] [273471] [121] [664402] [184423]

Bước 2: 273471 và 121 giống nhất (cùng Deal) → Merge
        [665300,665302] [273471,121] [664402] [184423]

Bước 3: 664402 và 184423 gần nhau (cùng Profile) → Merge
        [665300,665302] [273471,121] [664402,184423]

Bước 4: Mission group và Deal group merge
        [665300,665302,273471,121] [664402,184423]

Bước 5: Merge tất cả
        [665300,665302,273471,121,664402,184423]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dendrogram (cây phân cấp):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User:  665300  665302  273471  121  664402  184423
         |       |       |      |      |       |
         └───────┘       └──────┘      └───────┘
             │               │              │
             └───────────────┘              │
                     │                      │
                     └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cắt cây ở độ cao khác nhau:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cắt cao (2 nhóm):&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[665300, 665302, 273471, 121] = Active Users&lt;/li&gt;
&lt;li&gt;[664402, 184423] = Profile Users&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cắt trung bình (3 nhóm):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[665300, 665302] = Mission Players&lt;/li&gt;
&lt;li&gt;[273471, 121] = Deal Hunters&lt;/li&gt;
&lt;li&gt;[664402, 184423] = Profile Users&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cắt thấp (6 nhóm):&lt;/strong&gt; Mỗi user riêng lẻ&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  📊 Dendrogram (Cây phân cấp)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User:  A    B    E    C    D
       |    |    |    |    |
       └────┘    |    └────┘
          │      │       │
          └──────┘       │
               │         │
               └─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;→ Nhìn vào cây, quyết định cắt ở đâu!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không cần biết số nhóm trước&lt;/strong&gt; - Cắt ở đâu cũng được&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualization đẹp&lt;/strong&gt; - Dendrogram trực quan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hiểu được hierarchy&lt;/strong&gt; - Nhóm con, nhóm cha&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic&lt;/strong&gt; - Chạy lại kết quả giống nhau&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chậm&lt;/strong&gt; - Với &amp;gt; 10,000 users sẽ rất lâu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không thể undo&lt;/strong&gt; - Merge sai không rollback được&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory lớn&lt;/strong&gt; - Phải lưu toàn bộ relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ Khi muốn khám phá (exploratory analysis)&lt;br&gt;
✅ Khi cần hiểu structure/hierarchy&lt;br&gt;
✅ Khi data nhỏ-trung bình (&amp;lt; 5,000 users)&lt;br&gt;
✅ Khi cần present cho leadership (dendrogram đẹp!)&lt;/p&gt;


&lt;h2&gt;
  
  
  VII) HDBSCAN - BẢN NÂNG CẤP CỦA DBSCAN
&lt;/h2&gt;
&lt;h3&gt;
  
  
  💡 Ý tưởng chính
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DBSCAN nhưng thông minh hơn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DBSCAN: "Bao xa là gần?" → 1 con số cố định&lt;/li&gt;
&lt;li&gt;HDBSCAN: "Tự động điều chỉnh cho từng vùng"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Giống như:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DBSCAN: "Trong bán kính 5m có ≥ 5 người → nhóm bạn"&lt;/li&gt;
&lt;li&gt;HDBSCAN: "Ở chỗ đông → 3m, ở chỗ vắng → 10m cũng OK"&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📖 Ví dụ thực tế với data piggi_metrics.csv
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Từ 21 dòng data, giả sử có thêm nhiều users tạo ra 2 vùng mật độ khác nhau:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vùng đông đúc - Mission Players (10 users gần nhau):
  665300: Mission(3), Profile(1)
  665302: Mission(1), CreateMission(1)
  200165: Mission(1)
  ... + 7 users khác cũng thích Mission

Vùng thưa thớt - VIP/Diverse Users (3 users xa nhau):
  664402: Profile(3), UpdateProfile(1), DealHot(5), Mission(8), ChatRoom(2)
         → User đa dạng, vào nhiều thứ
  581242: EmbeddedBrowser(8), ChatRoom(5), Loyalty(3)
         → User đa dạng khác
  294132: ChatRoom(10), ReferralFriend(8), Mission(4)
         → User xã hội hóa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DBSCAN với eps=0.5, min_samples=3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Tìm được vùng Mission (10 users đông đúc)
❌ Bỏ sót 3 VIP users (xa nhau, không đủ min_samples=3)
→ 3 VIP users bị gán là outliers (sai!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;HDBSCAN tự động:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bước 1: Phát hiện vùng Mission đông đúc
  → Tạo Cluster 1 với 10 users

Bước 2: Phát hiện 3 VIP users tuy xa nhau nhưng có pattern riêng
  → Tự điều chỉnh: "Ở vùng này, chỉ cần 2 users gần nhau cũng OK"
  → Tạo Cluster 2 với 3 VIP users

Bước 3: Các users lẻ loi thật sự (EmbeddedBrowser(1), ...) → Outliers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kết quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DBSCAN:&lt;/strong&gt; 1 cluster (Mission) + 3 VIP bị nhầm outliers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HDBSCAN:&lt;/strong&gt; 2 clusters (Mission + VIP) + outliers thật sự ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;→ HDBSCAN thông minh hơn, tự thích nghi với mật độ khác nhau!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Ưu điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tự động hóa cao&lt;/strong&gt; - Ít cần tune parameters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tốt nhất cho density-based&lt;/strong&gt; - State-of-the-art&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle varied density&lt;/strong&gt; - Mật độ khác nhau OK&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outlier scores&lt;/strong&gt; - Cho điểm từ 0-1 (không chỉ yes/no)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Nhược điểm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phức tạp&lt;/strong&gt; - Khó hiểu thuật toán&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cần thư viện riêng&lt;/strong&gt; - Không có sẵn trong sklearn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chậm hơn K-Means&lt;/strong&gt; - Nhưng nhanh hơn DBSCAN&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Khi nào dùng?
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Thay thế DBSCAN&lt;/strong&gt; - Better version&lt;br&gt;
✅ Khi có nhóm đông/thưa khác nhau&lt;br&gt;
✅ Khi muốn tự động hóa (ít tune)&lt;br&gt;
✅ &lt;strong&gt;Đề xuất cho production&lt;/strong&gt; - Robust, chất lượng cao&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 SO SÁNH BẰNG VÍ DỤ HẰNG NGÀY
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thuật toán&lt;/th&gt;
&lt;th&gt;Giống như...&lt;/th&gt;
&lt;th&gt;Khi nào dùng?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;K-Means&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chia lớp thành các tổ học&lt;/td&gt;
&lt;td&gt;Biết cần mấy nhóm, cần nhanh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DBSCAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tìm nhóm bạn trong quán cafe đông người&lt;/td&gt;
&lt;td&gt;Tìm outliers, không biết số nhóm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GMM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Phân loại người có nhiều sở thích&lt;/td&gt;
&lt;td&gt;User không rõ ràng 1 nhóm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RFD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Xếp hạng khách hàng thân thiết&lt;/td&gt;
&lt;td&gt;Marketing, đơn giản, nhanh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rule-Based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quy định của công ty&lt;/td&gt;
&lt;td&gt;Logic business rõ ràng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hierarchical&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vẽ cây gia phả&lt;/td&gt;
&lt;td&gt;Khám phá, visualization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HDBSCAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tìm nhóm bạn thông minh (tự động)&lt;/td&gt;
&lt;td&gt;Production, chất lượng cao&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Meilisearch</title>
      <dc:creator>Hoàng Mạnh Khiêm</dc:creator>
      <pubDate>Thu, 21 May 2026 12:15:50 +0000</pubDate>
      <link>https://forem.com/hoangmanhkhiem/meilisearch-3p23</link>
      <guid>https://forem.com/hoangmanhkhiem/meilisearch-3p23</guid>
      <description>&lt;h3&gt;
  
  
  1. Giới thiệu
&lt;/h3&gt;

&lt;p&gt;Meilisearch là một search engine mã nguồn mở, tốc độ cao, tập trung vào trải nghiệm developer. Được viết bằng Rust, thiết kế theo hướng search-as-you-type (tìm kiếm ngay khi gõ).&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Điểm nổi bật:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tính năng&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Siêu nhanh&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Phản hồi dưới &lt;strong&gt;50ms&lt;/strong&gt; ngay cả khi xử lý lượng dữ liệu lớn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typo Tolerance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tự động xử lý lỗi chính tả và từ khóa gần đúng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full-text Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hỗ trợ tìm kiếm toàn văn bản với độ chính xác cao&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Faceted Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hỗ trợ lọc dữ liệu theo danh mục, thuộc tính (facet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTful API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dễ dàng tích hợp thông qua giao tiếp HTTP API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hosted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Triển khai trên server riêng, không phụ thuộc dịch vụ bên thứ ba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hỗ trợ đa ngôn ngữ, bao gồm cả tiếng Việt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Header bắt buộc
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Content-Type: application/json&lt;br&gt;
Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.  Các loại Search
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1. Single Index Search — Tìm kiếm trong một index
&lt;/h4&gt;

&lt;p&gt;Tìm kiếm thông thường trong một index cụ thể.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /indexes/{indexUid}/search&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2. Multi-Search — Tìm kiếm nhiều index cùng lúc
&lt;/h4&gt;

&lt;p&gt;Cho phép gửi nhiều query trong một request duy nhất, giảm số lần gọi API.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /multi-search&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "queries": [&lt;br&gt;
    { "indexUid": "movies", "q": "action" },&lt;br&gt;
    { "indexUid": "books", "q": "thriller" }&lt;br&gt;
  ]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.3. Federated Search — Tìm kiếm liên hợp
&lt;/h4&gt;

&lt;p&gt;Tìm kiếm trên nhiều index và gộp kết quả thành một danh sách duy nhất, có ranking đồng nhất.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /multi-search&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "federation": {},&lt;br&gt;
  "queries": [&lt;br&gt;
    { "indexUid": "movies", "q": "batman" },&lt;br&gt;
    { "indexUid": "comics", "q": "batman" }&lt;br&gt;
  ]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4. Search with Filters — Tìm kiếm kết hợp lọc
&lt;/h4&gt;

&lt;p&gt;Dùng thuộc tính filter để thu hẹp kết quả tìm kiếm theo điều kiện.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.5. Faceted Search — Tìm kiếm phân loại
&lt;/h4&gt;

&lt;p&gt;Dùng facets để lấy thống kê số lượng theo từng nhóm giá trị (ví dụ: bao nhiêu phim thuộc thể loại "Action").&lt;/p&gt;

&lt;h4&gt;
  
  
  4.6. Search with Geo (Geosearch) — Tìm kiếm theo vị trí địa lý
&lt;/h4&gt;

&lt;p&gt;Tìm kiếm và sort theo tọa độ GPS.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JSON&lt;br&gt;
{&lt;br&gt;
  "q": "restaurant",&lt;br&gt;
  "sort": ["_geoPoint(48.8566, 2.3522):asc"]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Các tham số trong Search API
&lt;/h3&gt;

&lt;p&gt;Endpoint: GET\POST /indexes/{indexUid}/search&lt;/p&gt;

&lt;h4&gt;
  
  
  5.1. Tham số truy vấn cơ bản
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Chuỗi tìm kiếm. Để trống → placeholder search (trả về tất cả documents). Dùng &lt;code&gt;"..."&lt;/code&gt; cho phrase search. Dùng &lt;code&gt;-word&lt;/code&gt; để loại trừ từ khóa. Chỉ xét tối đa 10 từ đầu tiên&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Số kết quả tối đa trả về. Không được vượt quá &lt;code&gt;maxTotalHits&lt;/code&gt;. Bị bỏ qua khi sử dụng &lt;code&gt;page&lt;/code&gt; / &lt;code&gt;hitsPerPage&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;offset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bỏ qua N kết quả đầu tiên (phân trang thủ công). Bị bỏ qua khi sử dụng &lt;code&gt;page&lt;/code&gt; / &lt;code&gt;hitsPerPage&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Số trang hiện tại (bắt đầu từ &lt;code&gt;1&lt;/code&gt;). Dùng kèm với &lt;code&gt;hitsPerPage&lt;/code&gt;. Khi thiết lập → response trả về &lt;code&gt;totalHits&lt;/code&gt; và &lt;code&gt;totalPages&lt;/code&gt; thay vì &lt;code&gt;estimatedTotalHits&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hitsPerPage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Số kết quả trên mỗi trang. Đặt &lt;code&gt;0&lt;/code&gt; để chỉ lấy &lt;code&gt;totalHits&lt;/code&gt; chính xác mà không trả về documents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  5.2. Tham số lọc &amp;amp; sắp xếp
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Biểu thức lọc kết quả. Tất cả attributes dùng trong filter bắt buộc phải có trong &lt;code&gt;filterableAttributes&lt;/code&gt;. Hỗ trợ geo filter: &lt;code&gt;_geoRadius()&lt;/code&gt;, &lt;code&gt;_geoBoundingBox()&lt;/code&gt;, &lt;code&gt;_geoPolygon()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Sắp xếp kết quả. Format: &lt;code&gt;["attribute:asc", "attribute:desc"]&lt;/code&gt;. Attribute phải có trong &lt;code&gt;sortableAttributes&lt;/code&gt;. Hỗ trợ geo sort: &lt;code&gt;_geoPoint(lat,lng):asc&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;facets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Trả về số lượng match theo từng giá trị facet. Dùng &lt;code&gt;["*"]&lt;/code&gt; để lấy tất cả &lt;code&gt;filterableAttributes&lt;/code&gt;. Response sẽ có thêm &lt;code&gt;facetDistribution&lt;/code&gt; và &lt;code&gt;facetStats&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;distinct&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Chỉ trả về 1 document đại diện cho mỗi giá trị unique của field này. Attribute phải có trong &lt;code&gt;filterableAttributes&lt;/code&gt;. Override &lt;code&gt;distinctAttribute&lt;/code&gt; của index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;matchingStrategy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;last&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chiến lược match khi thiếu kết quả: &lt;code&gt;last&lt;/code&gt; (bỏ bớt từ từ cuối), &lt;code&gt;all&lt;/code&gt; (chỉ lấy kết quả khớp hoàn toàn), &lt;code&gt;frequency&lt;/code&gt; (bỏ bớt từ phổ biến nhất trước)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attributesToSearchOn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Giới hạn tìm kiếm chỉ trong các attributes được liệt kê. Mỗi attribute phải tồn tại trong &lt;code&gt;searchableAttributes&lt;/code&gt;. Thứ tự không ảnh hưởng đến relevancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rankingScoreThreshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Loại bỏ các kết quả có điểm ranking thấp hơn ngưỡng này (&lt;code&gt;0.0 – 1.0&lt;/code&gt;). Các hits bị loại sẽ không được tính vào &lt;code&gt;estimatedTotalHits&lt;/code&gt;, &lt;code&gt;totalHits&lt;/code&gt;, hoặc facet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;locales&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enum[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Chỉ định ngôn ngữ của query theo chuẩn ISO-639. Override auto-detection. Ví dụ: &lt;code&gt;["vi", "en"]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ví dụ filter nâng cao:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "filter": "genre = 'Action' AND rating &amp;gt; 7 AND NOT country = 'US'",&lt;br&gt;
  "sort": ["release_date:desc"]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5.3. Tham số hiển thị kết quả
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attributesToRetrieve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;["*"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Danh sách fields trả về trong mỗi document. Dùng &lt;code&gt;["*"]&lt;/code&gt; để lấy tất cả. Attributes không có trong &lt;code&gt;displayedAttributes&lt;/code&gt; sẽ bị bỏ qua&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attributesToHighlight&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Bôi đậm từ khóa match trong các attributes chỉ định. Kết quả xuất hiện trong &lt;code&gt;_formatted&lt;/code&gt;. Dùng &lt;code&gt;["*"]&lt;/code&gt; để highlight tất cả fields trong &lt;code&gt;attributesToRetrieve&lt;/code&gt;. Hỗ trợ cả synonyms và stop words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;highlightPreTag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"&amp;lt;em&amp;gt;"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chuỗi chèn trước từ được highlight. Có thể là HTML tag hoặc ký tự bất kỳ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;highlightPostTag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"&amp;lt;/em&amp;gt;"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chuỗi chèn sau từ được highlight. Dùng cùng với &lt;code&gt;highlightPreTag&lt;/code&gt; để tránh tạo HTML không hợp lệ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attributesToCrop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Cắt ngắn nội dung và trả về đoạn trích (snippet) trong &lt;code&gt;_formatted&lt;/code&gt;. Hỗ trợ syntax &lt;code&gt;attribute:length&lt;/code&gt; để override theo từng attribute. Đoạn cắt được căn giữa quanh từ khóa match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cropLength&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Số từ tối đa trong đoạn trích. Cả query terms và stop words đều được tính vào độ dài này&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cropMarker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"…"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ký hiệu đánh dấu vị trí bị cắt. Đặt &lt;code&gt;null&lt;/code&gt; hoặc chuỗi rỗng nếu không muốn hiển thị marker. Chỉ xuất hiện khi có nội dung thực sự bị cắt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showMatchesPosition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Khi đặt &lt;code&gt;true&lt;/code&gt;, mỗi hit sẽ có thêm &lt;code&gt;_matchesPosition&lt;/code&gt; chứa byte offset (&lt;code&gt;start&lt;/code&gt; + &lt;code&gt;length&lt;/code&gt;) của từng term match. Hữu ích cho custom highlighting. Đơn vị là &lt;code&gt;bytes&lt;/code&gt;, không phải &lt;code&gt;characters&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  5.4. Tham số nâng cao
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showRankingScore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Khi đặt &lt;code&gt;true&lt;/code&gt;, mỗi document sẽ có thêm field &lt;code&gt;_rankingScore&lt;/code&gt; (&lt;code&gt;0.0 – 1.0&lt;/code&gt;). Điểm càng cao → mức độ liên quan càng lớn. Rule &lt;code&gt;sort&lt;/code&gt; không ảnh hưởng đến giá trị này&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showRankingScoreDetails&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Khi đặt &lt;code&gt;true&lt;/code&gt;, mỗi document sẽ có thêm &lt;code&gt;_rankingScoreDetails&lt;/code&gt; — breakdown điểm theo từng ranking rule. Hữu ích để debug relevancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showPerformanceDetails&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Khi đặt &lt;code&gt;true&lt;/code&gt;, response sẽ có thêm object &lt;code&gt;performanceDetails&lt;/code&gt; chứa timing breakdown của từng bước xử lý query&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ví dụ request đầy đủ:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "q": "avengers",&lt;br&gt;
  "limit": 10,&lt;br&gt;
  "offset": 0,&lt;br&gt;
  "filter": "genre = 'Action' AND rating &amp;gt;= 7",&lt;br&gt;
  "sort": ["release_date:desc"],&lt;br&gt;
  "facets": ["genre", "director"],&lt;br&gt;
  "attributesToRetrieve": ["title", "poster", "rating", "genre"],&lt;br&gt;
  "attributesToHighlight": ["title", "description"],&lt;br&gt;
  "highlightPreTag": "&amp;lt;mark&amp;gt;",&lt;br&gt;
  "highlightPostTag": "&amp;lt;/mark&amp;gt;",&lt;br&gt;
  "attributesToCrop": ["description"],&lt;br&gt;
  "cropLength": 20,&lt;br&gt;
  "showRankingScore": true,&lt;br&gt;
  "matchingStrategy": "all"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Cấu hình Settings (Index Settings)
&lt;/h3&gt;

&lt;p&gt;Endpoint: &lt;code&gt;GET/PATCH/DELETE /indexes/{indexUid}/settings&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.1. Searchable Attributes
&lt;/h4&gt;

&lt;p&gt;Xác định trường nào được đưa vào full-text search index. Thứ tự trong array = mức độ ưu tiên (trường đầu tiên được ưu tiên cao nhất).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/searchable-attributes&lt;br&gt;
["title", "description", "tags"]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.2. Displayed Attributes: Các trường được trả về trong kết quả search.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/displayed-attributes&lt;br&gt;
["title", "poster_url", "rating", "genre"]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.3. Filterable Attributes: Khai báo các trường có thể dùng trong filter và facets. Bắt buộc phải khai báo trước khi dùng filter.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/filterable-attributes&lt;br&gt;
JSON&lt;br&gt;
["genre", "rating", "country", "release_year"]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.4. Sortable Attributes: Khai báo các trường có thể dùng để sort. Bắt buộc phải khai báo trước khi dùng sort.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/sortable-attributes&lt;br&gt;
JSON&lt;br&gt;
["rating", "release_date", "price"]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.5. Typo Tolerance: Kiểm soát mức độ chấp nhận lỗi chính tả.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PATCH /indexes/{indexUid}/settings/typo-tolerance&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "enabled": true,&lt;br&gt;
  "minWordSizeForTypos": {&lt;br&gt;
    "oneTypo": 5,&lt;br&gt;
    "twoTypos": 9&lt;br&gt;
  },&lt;br&gt;
  "disableOnWords": ["iphone", "batman"],&lt;br&gt;
  "disableOnAttributes": ["serial_number"]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.6. Synonyms: Cấu hình từ đồng nghĩa để mở rộng khả năng tìm kiếm.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/synonyms&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "phone": ["smartphone", "mobile", "điện thoại"],&lt;br&gt;
  "car": ["automobile", "vehicle", "xe hơi"],&lt;br&gt;
  "ai": ["artificial intelligence", "machine learning"]&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.7. Stop Words: Loại bỏ các từ không có giá trị tìm kiếm khỏi query.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/stop-words&lt;br&gt;
JSON&lt;br&gt;
["the", "a", "an", "is", "are", "và", "của", "cho"]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.8. Distinct Attribute: Chỉ lấy 1 kết quả đại diện cho mỗi giá trị unique.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT /indexes/{indexUid}/settings/distinct-attribute&lt;br&gt;
JSON&lt;br&gt;
"product_id"&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.9. Faceting: Cấu hình tính năng faceted search.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PATCH /indexes/{indexUid}/settings/faceting&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "maxValuesPerFacet": 100,&lt;br&gt;
  "sortFacetValuesBy": {&lt;br&gt;
    "*": "alpha",&lt;br&gt;
    "rating": "count"&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.10. Pagination: Cấu hình giới hạn phân trang.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PATCH /indexes/{indexUid}/settings/pagination&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "maxTotalHits": 1000&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.11. Embedders (Semantic Search): Cấu hình vector embedding cho AI/semantic search.
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PATCH /indexes/{indexUid}/settings/embedders&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "myEmbedder": {&lt;br&gt;
    "source": "openAi",&lt;br&gt;
    "apiKey": "sk-...",&lt;br&gt;
    "model": "text-embedding-3-small",&lt;br&gt;
    "documentTemplate": "{{doc.title}} {{doc.description}}"&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Ranking Rules
&lt;/h3&gt;

&lt;p&gt;Ranking Rules xác định thứ tự ưu tiên khi tính điểm liên quan của kết quả. Rule đứng trước có độ ưu tiên cao hơn.&lt;/p&gt;

&lt;p&gt;Endpoint: &lt;code&gt;GET/PUT /indexes/{indexUid}/settings/ranking-rules&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;words&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ưu tiên document chứa nhiều từ trong query hơn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;typo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ưu tiên document có ít lỗi chính tả hơn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proximity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ưu tiên document có các từ xuất hiện gần nhau hơn trong nội dung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attribute&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ưu tiên match ở field có độ ưu tiên cao hơn (theo thứ tự trong &lt;code&gt;searchableAttributes&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Áp dụng tiêu chí sắp xếp do người dùng truyền vào&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exactness&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ưu tiên document khớp chính xác với từ khóa hơn&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mặc định:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;["words", "typo", "proximity", "attribute", "sort", "exactness"]&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Custom ranking rules: Có thể thêm rule tùy chỉnh theo trường cụ thể:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;["words", "typo", "proximity", "attribute", "sort", "exactness", "rating:desc", "release_date:asc"]&lt;/code&gt;&lt;br&gt;
_&lt;br&gt;
Tips: Đặt sort lên trước nếu muốn ưu tiên tiêu chí sắp xếp của người dùng hơn là độ liên quan ngữ nghĩa. Đặt exactness lên trước nếu cần match chính xác cao._&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Các API xóa dữ liệu
&lt;/h3&gt;

&lt;h4&gt;
  
  
  8.1. Xóa toàn bộ Index
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE /indexes/{indexUid}&lt;/code&gt; : Xóa cả cấu hình lẫn dữ liệu của index.&lt;/p&gt;

&lt;h4&gt;
  
  
  8.2. Xóa tất cả Documents trong Index
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE /indexes/{indexUid}/documents&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.3. Xóa Document theo ID
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE /indexes/{indexUid}/documents/{documentId}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.4. Xóa nhiều Documents theo danh sách ID
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST /indexes/{indexUid}/documents/delete-batch&lt;br&gt;
[1, 2, 3, 42, 100]&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.5. Xóa Documents theo Filter
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST /indexes/{indexUid}/documents/delete&lt;br&gt;
{&lt;br&gt;
  "filter": "genre = 'Horror' AND release_year &amp;lt; 2000"&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.6. Reset Settings về mặc định
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE /indexes/{indexUid}/settings&lt;/code&gt;: Reset từng phần setting cụ thể:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DELETE /indexes/{indexUid}/settings/synonyms&lt;br&gt;
DELETE /indexes/{indexUid}/settings/stop-words&lt;br&gt;
DELETE /indexes/{indexUid}/settings/ranking-rules&lt;br&gt;
DELETE /indexes/{indexUid}/settings/filterable-attributes&lt;br&gt;
DELETE /indexes/{indexUid}/settings/sortable-attributes&lt;br&gt;
DELETE /indexes/{indexUid}/settings/searchable-attributes&lt;br&gt;
DELETE /indexes/{indexUid}/settings/typo-tolerance&lt;br&gt;
DELETE /indexes/{indexUid}/settings/faceting&lt;br&gt;
DELETE /indexes/{indexUid}/settings/pagination&lt;br&gt;
DELETE /indexes/{indexUid}/settings/embedders&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.7. Hủy Task đang chờ xử lý
&lt;/h4&gt;

&lt;p&gt;Cho phép hủy các task chưa hoàn thành (&lt;code&gt;enqueued&lt;/code&gt;, &lt;code&gt;processing&lt;/code&gt;) theo nhiều điều kiện khác nhau.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /tasks/cancel?uids=1,2,3&lt;br&gt;
POST /tasks/cancel?indexUids=movies&lt;br&gt;
POST /tasks/cancel?statuses=enqueued,processing&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Danh sách task UID cần hủy, phân tách bằng dấu phẩy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;indexUids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hủy tất cả task thuộc các index được chỉ định&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;statuses&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hủy task theo trạng thái (&lt;code&gt;enqueued&lt;/code&gt;, &lt;code&gt;processing&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Response&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "taskUid": 42,&lt;br&gt;
  "indexUid": null,&lt;br&gt;
  "status": "enqueued",&lt;br&gt;
  "type": "taskCancelation",&lt;br&gt;
  "enqueuedAt": "2026-05-21T10:00:00Z"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8.8. Xóa lịch sử Task
&lt;/h4&gt;

&lt;p&gt;Cho phép xóa lịch sử task đã hoàn thành hoặc thất bại khỏi hệ thống.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DELETE /tasks?uids=1,2,3&lt;br&gt;
DELETE /tasks?indexUids=movies&lt;br&gt;
DELETE /tasks?statuses=succeeded,failed&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Query Parameters
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Kiểu&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Danh sách task UID cần xóa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;indexUids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Xóa tất cả task thuộc các index được chỉ định&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;statuses&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Xóa task theo trạng thái (&lt;code&gt;succeeded&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Response trả về thông tin task deletion đã được enqueue:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "taskUid": 43,&lt;br&gt;
  "indexUid": null,&lt;br&gt;
  "status": "enqueued",&lt;br&gt;
  "type": "taskDeletion",&lt;br&gt;
  "enqueuedAt": "2026-05-21T10:05:00Z"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>opensource</category>
      <category>performance</category>
      <category>rust</category>
    </item>
    <item>
      <title>Full-Text Search Functions</title>
      <dc:creator>Hoàng Mạnh Khiêm</dc:creator>
      <pubDate>Mon, 18 May 2026 09:39:52 +0000</pubDate>
      <link>https://forem.com/hoangmanhkhiem/full-text-search-functions-55en</link>
      <guid>https://forem.com/hoangmanhkhiem/full-text-search-functions-55en</guid>
      <description>&lt;h2&gt;
  
  
  I) Cấu trúc chính
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col2&lt;/span&gt;&lt;span class="p"&gt;,...)&lt;/span&gt; &lt;span class="n"&gt;AGAINST&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;search_modifier&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;col1, col2, ...&lt;/code&gt;: Các cột chứa dữ liệu văn bản mà bạn muốn tìm kiếm.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;expr&lt;/code&gt;: Biểu thức tìm kiếm, có thể là một chuỗi hoặc một biến&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_modifier&lt;/code&gt;: Tùy chọn để xác định cách thức tìm kiếm, có thể là &lt;code&gt;IN NATURAL LANGUAGE MODE&lt;/code&gt;, &lt;code&gt;IN BOOLEAN MODE&lt;/code&gt;, hoặc &lt;code&gt;WITH QUERY EXPANSION&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  II) Điều kiện dùng FULLTEXT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MySQL hỗ trợ InnoDB hoặc MyISAM&lt;/li&gt;
&lt;li&gt;Chỉ mục index dạng FULLTEXT&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  II) Các loại tìm kiếm FULLTEXT
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Tìm kiếm bằng ngôn ngữ tự nhiên (A Natural Language)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1) Định nghĩa
&lt;/h4&gt;

&lt;p&gt;Tìm kiếm bằng ngôn ngữ tự nhiên được cài đặt mặc định khi dùng câu lệnh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;AGAINST&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;AGAINST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keyword'&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="k"&gt;NATURAL&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="k"&gt;MODE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  1.2) Đặc điểm
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tìm kiếm bằng ngôn ngữ tự nhiên mặc định không có phân biệt rõ ràng chữ hoa với chữ thường. Để cho phép tìm kiếm bằng ngon ngữ tự nhiên phân biệt rõ ràng các chữ hoa chữ thường thì cần chuyển đổi kiểu &lt;strong&gt;&lt;em&gt;utf8mb4&lt;/em&gt;&lt;/strong&gt; sang &lt;strong&gt;&lt;em&gt;utf8mb4_0900_as_cs&lt;/em&gt;&lt;/strong&gt; hoặc &lt;strong&gt;&lt;em&gt;utf8mb4_bin&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Có áp dụng danh sách stopwords&lt;/li&gt;
&lt;li&gt;MySQL tự động tính độ liên quan (relevance score)&lt;/li&gt;
&lt;li&gt;Kết quả thường được sắp xếp theo độ liên quan&lt;/li&gt;
&lt;li&gt;Chỉ hoạt động trên cột có &lt;strong&gt;FULLTEXT INDEX&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Chỉ hỗ trợ các kiểu dữ liệu: &lt;strong&gt;CHAR, VARCHAR, TEXT&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1.3) Điểm mạnh
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tìm kiếm bằng ngôn ngữ tự nhiên có hiệu suất tìm kiếm full-text hơn cách quét toàn bộ bảng dữ liệu trong MySQL&lt;/li&gt;
&lt;li&gt;Hiệu suất tìm kiếm nhanh hơn LIKE '%keyword%'&lt;/li&gt;
&lt;li&gt;Tìm kiếm bằng ngôn ngữ tự nhiên giúp không cần sử dụng Order By trong query.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Tìm kiếm Boolean (Boolean Search)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1) Định nghĩa
&lt;/h4&gt;

&lt;p&gt;Boolean Full-Text Search là kiểu tìm kiếm full-text sử dụng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;AGAINST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keyword'&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;MODE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.2) Đặc điểm
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Trong tìm kiếm Boolean cho phép sử dụng các toán tử, cụ thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; : bắt buộc phải có
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '+apple +juice' : Tìm các hàng chứa cả hai từ.
 '+apple macintosh' : Tìm các hàng có chứa từ _apple_ , nhưng xếp hạng các hàng cao hơn nếu chúng cũng chứa từ _macintosh _.
 '+apple +juice' : Tìm các hàng chứa cả hai từ.      
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-&lt;/code&gt; : không được có
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '+apple -macintosh' : Tìm các hàng có chứa từ “ apple ” nhưng không chứa từ _macintosh_ .
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"&lt;/code&gt; : tìm chính xác cụm từ
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '"some words"' : Tìm các hàng chính xác có từ _some words_
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; : wildcard / prefix
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 'apple*' : Tìm các hàng chứa các từ như _apple_ , _apples_ , _applesauce_ hoặc _applet_ 
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;&lt;/code&gt; : tăng / giảm độ liên quan
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '+apple +(&amp;gt;turnover &amp;lt;strudel)' : Tìm các hàng chứa các từ _apple_ và _turnover_ hoặc _apple_ và _strudel_ (theo bất kỳ thứ tự nào), nhưng xếp hạng _apple turnover_ cao hơn _apple strudel_
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~&lt;/code&gt; : giảm điểm relevance
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '+apple ~macintosh' : Tìm các hàng chứa từ _apple_ , nhưng nếu hàng đó cũng chứa từ _macintosh_ , hãy đánh giá thấp hơn so với trường hợp hàng đó không chứa từ _macintosh_ .
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;()&lt;/code&gt; : nhóm biểu thức
&lt;/li&gt;
&lt;li&gt;Ví dụ:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt; '+apple +(&amp;gt;turnover &amp;lt;strudel)' : Nhóm 2 biểu thức bắt buộc phải có, và độ liên quan.
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Không tự động sắp xếp theo độ liên quan&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Có áp dụng stopwords&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Với &lt;strong&gt;InnoDB&lt;/strong&gt;, tất cả cột trong MATCH() phải có FULLTEXT INDEX&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;MyISAM&lt;/strong&gt; có thể search dù không có FULLTEXT INDEX nhưng rất chậm&lt;/p&gt;

&lt;h4&gt;
  
  
  2.3) Điểm mạnh
&lt;/h4&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Tìm kiếm linh hoạt hơn &lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Hỗ trợ các logic Or, and, not&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Tìm kiếm mở rộng truy vấn (Query Expansion Search)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1) Định nghĩa
&lt;/h4&gt;

&lt;p&gt;Query Expansion (mở rộng truy vấn) là một biến thể của tìm kiếm full-text trong MySQL, giúp mở rộng kết quả tìm kiếm bằng cách tự động bổ sung thêm từ khóa liên quan từ các kết quả ban đầu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="n"&gt;AGAINST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keyword'&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;QUERY&lt;/span&gt; &lt;span class="n"&gt;EXPANSION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.2) Đặc điểm
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tìm kiếm mở rộng truy vấn hoạt động dựa vào 2 bước chính là: 

&lt;ul&gt;
&lt;li&gt;Bước 1: Tìm kiếm như tìm kiếm theo ngôn ngữ tự nhiên&lt;/li&gt;
&lt;li&gt;Bước 2: Lấy một số từ quan trọng từ các kết quả đầu tiên và thực hiện lại tìm kiếm với tập từ khóa đã mở rộng.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tìm kiếm mở rộng truy vấn dựa theo ngữ nghĩa&lt;/li&gt;

&lt;li&gt;Tự động mở rộng truy vấn tìm kiếm&lt;/li&gt;

&lt;li&gt;Không cần người dùng nhập đủ keywords&lt;/li&gt;

&lt;li&gt;Hỗ trợ tốt khi từ để tìm kiếm từ thiếu ngữ nghĩa&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3.3) Điểm mạnh
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Từ keyword thiếu ngữ nghĩa có thể mở rộng phạm vi kết quả tìm kiếm.&lt;/li&gt;
&lt;li&gt;Tăng khả năng tìm kiếm ý định tìm kiếm liên quan&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  III. Full-Text Stopwords
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Định nghĩa
&lt;/h3&gt;

&lt;p&gt;Stopwords là các từ quá phổ biến (như “the”, “a”, “is”, …) sẽ bị bỏ qua khi tạo index và khi tìm kiếm full-text trong MySQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Full-Text Restrictions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Định nghĩa
&lt;/h3&gt;

&lt;p&gt;Full-Text Restrictions là tập hợp các giới hạn và điều kiện bắt buộc khi sử dụng tính năng Full-Text Search trong MySQL. Các giới hạn này quy định những trường hợp mà FULLTEXT index và câu lệnh MATCH() ... AGAINST() được phép hoặc không được phép hoạt động.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Fine-Tuning MySQL Full-Text Search
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Định nghĩa
&lt;/h3&gt;

&lt;p&gt;Fine-Tuning Full-Text Search là quá trình điều chỉnh các tham số và cấu hình của MySQL Full-Text Search nhằm thay đổi hành vi tìm kiếm (như tokenization, stopwords, operator, indexing), tối ưu theo nhu cầu cụ thể.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cấu hình
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1) Cấu hình độ dài từ
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;innodb_ft_min_token_size&lt;/span&gt;
&lt;span class="err"&gt;innodb_ft_max_token_size&lt;/span&gt;
&lt;span class="err"&gt;ft_min_word_len&lt;/span&gt;
&lt;span class="err"&gt;ft_max_word_len&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2) Cấu hình ngưỡng Natural Language (MyISAM)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#define GWS_IN_USE GWS_FREQ
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3) Cấu hình ngưỡng Natural Language (MyISAM)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ft_boolean_syntax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
