Nguyên Lý Phân Tích Văn Bản
Trong Elasticsearch, quá trình phân tích (analysis) là bước tiền xử lý quan trọng để chuyển đổi dữ liệu văn bản thô thành các token phù hợp cho việc xây dựng chỉ mục nghịch đảo (inverted index). Nhiệm vụ này được thực hiện bởi một thành phần gọi là Analyzer.
Cấu Trúc Bộ Phân Tích
Một analyzer hoàn chỉnh thường bao gồm ba thành phần chính hoạt động theo trình tự:
- Character Filter (Bộ lọc ký tự): Xử lý văn bản gốc trước khi tách từ. Ví dụ: loại bỏ các thẻ HTML hoặc thay thế ký tự đặc biệt như
&thành từand. - Tokenizer (Bộ tách từ): Chia chuỗi văn bản đã qua lọc thành các token riêng biệt dựa trên quy tắc cụ thể (như khoảng trắng, dấu câu).
- Token Filter (Bộ lọc token): Xử lý từng token sau khi tách. Các thao tác phổ biến bao gồm chuyển đổi chữ hoa thành thường, loại bỏ các từ dừng (stopwords) vô nghĩa, hoặc thêm từ đồng nghĩa.
Lưu ý: Thuật ngữ "Tokenizer" thường bị hiểu nhầm là "Analyzer". Thực tế, Tokenizer chỉ là một phần của Analyzer.
Chuẩn Hóa Dữ Liệu (Normalization)
Để tăng khả năng khớp tìm kiếm, Elasticsearch thực hiện chuẩn hóa dữ liệu khi xây dựng chỉ mục. Quá trình này bao gồm việc chuyển đổi thì của động từ, số ít/số nhiều, từ đồng nghĩa và chuẩn hóa chữ hoa/thường. Nhờ đó, truy vấn tìm kiếm mother liked little dog vẫn có thể tìm thấy tài liệu chứa câu His mom likes small dogs.
Bộ Phân Tích Mặc Định
Elasticsearch sử dụng standard analyzer làm mặc định. Bộ phân tích này hoạt động dựa trên ranh giới từ ngữ chuẩn Unicode và tích hợp sẵn các bộ lọc:
standardtoken filter: Loại bỏ ký tự đặc biệt.lowercasetoken filter: Chuyển tất cả ký tự về chữ thường.stoptoken filter: (Thường bị tắt mặc định) Loại bỏ các từ phổ biến như "a", "the".
Để kiểm tra hoạt động của bộ phân tích mặc định, ta có thể sử dụng API _analyze mà không cần chỉ định index:
GET _analyze
{
"analyzer": "standard",
"text": "New-Phone & The Best Price
Today"
}
Kết quả trả về sẽ hiển thị các token đã được tách và chuẩn hóa, kèm theo thông tin về vị trí và偏移量 (offset).
Cập Nhật Cấu Hình Phân Tích
Đối với các index đã tồn tại, việc thay đổi cấu hình phân tích (analysis settings) thuộc loại static settings. Do đó, bắt buộc phải đóng index trước khi cập nhật và mở lại sau khi hoàn tất.
POST ecommerce_logs/_close
PUT ecommerce_logs/_settings
{
"analysis": {
"analyzer": {
"log_processor": {
"type": "standard",
"stopwords": ["the", "is", "a"]
}
}
}
}
POST ecommerce_logs/_open
Sau khi kích hoạt bộ lọc stopwords tùy chỉnh, việc phân tích lại văn bản sẽ loại bỏ các từ nằm trong danh sách dừng:
GET ecommerce_logs/_analyze
{
"analyzer": "log_processor",
"text": "New-Phone & The Best Price
Today"
}
Xây Dựng Analyzer Tùy Chỉnh
Để có chiến lược phân tích linh hoạt hơn, người dùng có thể định nghĩa một analyzer mới bằng cách kết hợp các bộ lọc ký tự, bộ tách từ và bộ lọc token có sẵn.
Định Nghĩa Cấu Hình
Tương tự như trên, cần đóng index trước khi thêm cấu hình mới vào settings:
PUT ecommerce_logs/_settings
{
"analysis": {
"char_filter": {
"symbol_mapper": {
"type": "mapping",
"mappings": ["& => and"]
}
},
"filter": {
"custom_stop": {
"type": "stop",
"stopwords": ["the", "a"]
}
},
"analyzer": {
"full_text_custom": {
"type": "custom",
"char_filter": ["html_strip", "symbol_mapper"],
"tokenizer": "standard",
"filter": ["lowercase", "custom_stop"]
}
}
}
}
Cấu hình trên sẽ thực hiện các bước: loại bỏ thẻ HTML, thay thế ký tự & bằng and, chuyển về chữ thường và loại bỏ từ dừng.
Kiểm Tra Hoạt Động
Sử dụng API analyze để xác minh kết quả xử lý của full_text_custom:
GET ecommerce_logs/_analyze
{
"analyzer": "full_text_custom",
"text": "New-Phone & The Best Price
Today"
}
Kết quả trả về sẽ phản ánh đúng các quy tắc đã định nghĩa, ví dụ ký tự & đã được chuyển đổi và các từ dừng đã bị lược bỏ.
Áp Dụng Vào Mapping
Sau khi tạo analyzer, cần gán nó vào trường cụ thể trong mapping để áp dụng khi ghi dữ liệu:
PUT ecommerce_logs/_mapping/product_info
{
"properties": {
"description": {
"type": "text",
"analyzer": "full_text_custom"
}
}
}
Kiểm tra lại mapping sẽ thấy trường description đã được liên kết với bộ phân tích tùy chỉnh.
Xử Lý Lỗi Thường Gặp
Một lỗi phổ biến khi cấu hình analyzer là cố gắng cập nhật settings khi index đang mở. Hệ thống sẽ trả về ngoại lệ illegal_argument_exception với thông báo không thể cập nhật các thiết lập non-dynamic.
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Can't update non dynamic settings [[index.analysis.analyzer...]] for open indices"
}
],
"status": 400
}
}
Để khắc phục, đảm bảo luôn thực hiện thao tác _close trước khi thay đổi các cấu hình phân tích và _open sau khi hoàn tất.