Elasticsearch - Search fullwidth and halfwidth

1.Lời nói đầu

Ở bài viết trước mình có giới thiệu qua về việc sao lưu và phục hồi trong Elasticsearch để phục vụ cho việc tìm kiếm cơ bản với Elasticsearch, tuy nhiên dữ liệu dùng để tìm kiếm mới chỉ dừng lại text halfwidth? Còn đối với dữ kiệu ở dạng fullwith thì tìm kiếm như thế nào ? Làm sao để Elasticsearch phân tích và tìm kiếm chính xác cho chúng ta với những dữ liệu trên. Bài viết hôm nay mình xin giới thiệu 1 plugin để xử lý những vấn đề trên.

2.Cài đặt

    sudo bin/elasticsearch-plugin install analysis-icu

Để tìm hiểu thêm về plugin này các bạn có thể đọc thêm tài liệu ở đây ICU Analysis Plugin

3.Tạo index

  1. Tạo index

    
    curl -X PUT "localhost:9200/icu_sample" -H 'Content-Type: application/json' -d'
    {
        "settings": {
          "index": {
              "analysis": {
                "normalizer": {
                  "nfkc_cf_normalized": {
                    "filter": [
                      "lowercase",
                      "icu_normalizer" 
                    ]
                  }
                }
              }
            }
      }
    }
    '
    
    

  2. Tạo Mappings

    curl -X PUT "localhost:9200/icu_sample/_mapping/_doc" -H 'Content-Type: application/json' -d
    ' 
        { 
            "properties": { 
                "name": {
                    "type": "keyword",
                    "normalizer": "nfkc_cf_normalized"
                } 
            }
        } 
    '

3. Tạo data

curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
	{"index": {"_index": "icu_sample", "_type": "_doc"}}
	{"name": "hang"}
	{"index": {"_index": "icu_sample", "_type": "_doc"}}
	{"name": "hang"}
	{"index": {"_index": "icu_sample", "_type": "_doc"}}
	{"name": "RC Paris"}
    {"index": {"_index": "icu_sample", "_type": "_doc"}}
	{"name": "HANG"}
'

4.Search

Bây giờ chúng ta thử search fulltext với fullwidth và halfwidth xem kết quả như thế nào nhé! ✌️

  1. fullwidth
curl -X GET "localhost:9200/icu_sample/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "wildcard" : { "name" : "*hang*" }
    }
}
'

  1. halfwidth
curl -X GET "localhost:9200/icu_sample/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "wildcard" : { "name" : "*hang*" }
    }
}
'

  1. lowercase
curl -X GET "localhost:9200/icu_sample/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "wildcard" : { "name" : "*HANG*" }
    }
}
'

Các bạn thấy đấy, cả 3 query đều cho ra kết quả như nhau do mình đang sử dụng plugin analysis-icu, nó sẽ phân tích, chuẩn hóa cú pháp, hỗ trợ Unicode, chữ hoa, chữ thường cho câu lệnh query của chúng ta. Hy vọng bài viết sẽ giúp ích cho các bạn trong việc tìm kiếm giải pháp search dữ liệu cả fullwidth và halfwidth đang gặp phải!