Elasticsearch Analyzer & Normalizer

littlenoteslittlenotes
3 min read

I. Kiểu dữ liệu “text” và “keyword”

Khi làm việc với Elasticsearch, chúng ta đã quen thuộc với 2 nhóm kiểu dữ liệu textkeyword.

text: Kiểu dữ liệu full-text content, thường là nội dung của các email hoặc các description mô tả sản phẩm. Kiểu dữ liệu này được analyzed thông qua bộ Analyzer thành các individual terms và đưa vào inverted index. Khi tìm kiếm trên trường dữ liệu text, Analyzer cũng phân tích nội dung từ truy vấn thành các individual words và tìm kiếm trên inverted index của trường dữ liệu text.
keyword: Kiểu dữ liệu có cấu trúc, thường là các ID, địa chỉ email, hostname, status code, zip code,… Kiểu dữ liệu này sẽ không được phân tích thành các terms mà sẽ giữ nguyên toàn bộ nội dung để nhằm mục đích truy vấn trong các trường hợp tìm kiếm chính xác giá trị. Khi được đưa vào index của Elasticsearch, các trường keyword được xử lý thông qua một bộ Normalizer.

II. Analyzer và Normalizer

AnalyzerNormalizer đều có nhiệm vụ là xử lý data trước khi đưa vào các index và inverted index. Tuy nhiên, Analyzer làm việc trên textfield còn Normalizer làm việc trên keywordfield.

  1. Các thành phần của Analyzer

    Analyzer gồm 3 thành phần: Character filter, Tokenizer, Token filter.

    Character filter: Thêm, xóa, sửa nội dung text đầu vào. Ví dụ như bỏ qua các ký tự html <b> <div>,..
    Tokenizer: Tách nội dung text thành các token (individual terms)
    Token filter: Thêm, xóa, sửa các token sau khi được tách. Ví dụ như lowercase, loại bỏ stopword (các từ không có ý nghĩa như a, an, the, and, to, is ,…), thêm các từ đồng nghĩa synonyms, hoặc stemming (lấy từ gốc reading → read, confirmed → confirm,…)

  2. Các thành phần của Normalizer

    Normalizer khác với Analyzer khi chỉ gồm 2 thành phần là Character filter, Token filter, không có TokenizerNormalizer chỉ xuất ra một token duy nhất chứ không split thành nhiều token như Analyzer.

    Lưu ý, Token filterNormalizer sử dụng cũng giới hạn chứ không phải toàn bộ các token filter mà Analyzer có thể dùng vì mục đích là giữ nguyên nội dung đầu vào. Các Token filter có thể dùng gồm:

    lowercase: chuyển chữ hoa sang chữ thường
    uppercase: chuyển chữ thường sang chữ hoa
    asciifolding: chuyển các ký tự có dấu sang ASCII ( é → e)

    trim: loại bỏ các dấu space đầu cuối

Mặc định, nếu không định nghĩa thì Elasticsearch sử dụng Analyzerstandard(Character filter: không có, Tokenizer: standard, Token filter: lowercase, stop), còn Normalizer thì không sử dụng trừ khi định nghĩa custom normalizer.

III. Tổng kết

AnalyzerNormalizer
Kiểu dữ liệuTextKeyword
Thành phầnCharacter filter, Tokenizer, Token filterCharacter filter, Tokenizer, Token filter
Mặc địnhstandard analyzer(Character filter: không dùng, Tokenizer: standard, Token filter: lowercase, stop)Không dùng
Số lượng token outputNhiều token1 token
Giới hạn token filterKhôngGiới hạn dùng các token filter để tránh làm thay đổi nội dung gốc
0
Subscribe to my newsletter

Read articles from littlenotes directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

littlenotes
littlenotes