12/08/2018, 16:23

Custom Analyzer Elasticsearch

Khi các máy phân tích tích hợp không đáp ứng được nhu cầu của bạn, bạn có thể tạo một bộ phân tích tùy chỉnh sử dụng kết hợp thích hợp: Không sử dụng hoặc sử dụng bộ lọc ký tự Character Filters Một tokenizer Tokenizers Không sử dụng hoặc sử dụng bộ lọc token Token Filters Trình phân tích ...

Khi các máy phân tích tích hợp không đáp ứng được nhu cầu của bạn, bạn có thể tạo một bộ phân tích tùy chỉnh sử dụng kết hợp thích hợp:

  • Không sử dụng hoặc sử dụng bộ lọc ký tự Character Filters
  • Một tokenizer Tokenizers
  • Không sử dụng hoặc sử dụng bộ lọc token Token Filters

Trình phân tích tùy chỉnh chấp nhận các tham số sau:

  • Tokenizer: Trình tạo tokenizer được cài đặt sẵn hoặc được tuỳ chỉnh (bắt buộc phải có)
  • Char Filter: Một mảng tùy chọn các bộ lọc ký tự được cài đặt sẵn hoặc tùy chỉnh.
  • Token Filter: Một mảng tùy chọn các bộ lọc thẻ được xây dựng sẵn hoặc tùy chỉnh.
  • position_increment_gap: Khi lập chỉ mục mảng văn bản, Elasticsearch chèn khoảng cách giả giữa kỳ cuối cùng của một giá trị và thời hạn đầu tiên của giá trị tiếp theo để đảm bảo rằng cụm từ truy vấn không khớp với hai thuật ngữ từ các phần tử mảng khác nhau. Mặc định là 100. Xem thêm position_increment_gap

Ví dụ 1:

  • Sử dụng bộ lọc ký tự: Html strip charfilter
  • Sử dụng Standard Tokenizer
  • Token Filter:
    • Lowercase Token Filter
    • ASCII-Folding Token Filter
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom",
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": "Is this <b>déjà vu</b>?"
}

Ví dụ này cho biết điều khoản sau đây:

[ is, this, deja, vu ]

Và khi chúng ta gõ 1 trong những từ trên thì kết quả sẽ được trả về

Ví dụ 2

Ở ví dụ trước ta sử dụng những bộ lọc kí tự, bộ lọc token và tokenizer mặc định có sẵn của elasticsearch. Ví dụ này chúng ta sẽ tìm hiểu 1 ví dụ mà sử dụng những bộ lọc được custom.

  • Character Filter: Sử dụng Mapping Character Filter thêm cấu hình thay thế :) bằng _happy và thay :( thành _sad_
  • Tokenizer: Sử dụng Pattern Tokenizer và cấu hình phân chia ký tự theo dấu .
  • Token Filters:
    • Lowercase Token Filter
    • Stop token filter:được cấu hình để sử dụng danh sách các từ dừng của tiếng Anh

Dưới đây là cách cấu hình

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": [
            "emoticons" 
          ],
          "tokenizer": "punctuation", 
          "filter": [
            "lowercase",
            "english_stop" 
          ]
        }
      },
      "tokenizer": {
        "punctuation": { 
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "char_filter": {
        "emoticons": { 
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "filter": {
        "english_stop": { 
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":     "I'm a :) person, and you?"
}

Và kết quả sẽ thu về các điều luật sau đây:

[ i'm, _happy_, person, you ]

Còn rất nhiều cấu hình khác có thể tủy chỉnh theo ý mình mọi người có thể xem thêm tại Custom Analyzer

0