duydo/elasticsearch-analysis-vietnamese

vi_tokenizer Không dữ lại token gốc khi config filter preserve_original = true

phikll12 opened this issue · 3 comments

vi_tokenizer Không dữ lại token gốc khi config filter preserve_original = true
duydo commented

@phikll12 Em setting cho index cụ thể thế nào em cho lên đây luôn để anh tiện reproduce lại và fix nếu có issue nhé.

PUT my-index-000001
{
   "settings": {
    "index": {
      "analysis": {
        "filter": {
          "custom_asciifolding":{
            "type":"asciifolding",
            "preserve_original": true
          },
          "custom_lowercase":{
            "type":"lowercase",
            "preserve_original": true
          }
        },
        "analyzer": {
          "my_analyzer": {
            "filter": [
              "custom_lowercase",
              "custom_asciifolding"
            ],
            "tokenizer": "vi_tokenizer"
          }
        }
      }
    }
  }
}

@duydo Đây là setting index của em.
Sau khi em analyzer

{
  "tokens" : [
    {
      "token" : "mua",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<PHRASE>",
      "position" : 0
    },
    {
      "token" : "dien thoai",
      "start_offset" : 4,
      "end_offset" : 14,
      "type" : "<PHRASE>",
      "position" : 1
    },
    {
      "token" : "điện thoại",
      "start_offset" : 4,
      "end_offset" : 14,
      "type" : "<PHRASE>",
      "position" : 1
    }
  ]
}

Làm sao để giữ được Token củ ạ ví dụ :

{
  "tokens" : [
   {
      "token" : "mua dien thoai",
      "start_offset" : 0,
      "end_offset" : 14,
      "type" : "<PHRASE>",
      "position" : 0
    }
    {
      "token" : "mua",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<PHRASE>",
      "position" : 0
    },
    {
      "token" : "dien thoai",
      "start_offset" : 4,
      "end_offset" : 14,
      "type" : "<PHRASE>",
      "position" : 1
    },
    {
      "token" : "điện thoại",
      "start_offset" : 4,
      "end_offset" : 14,
      "type" : "<PHRASE>",
      "position" : 1
    }
  ]
}

Em cám ơn.

duydo commented

@phikll12 Các filters chỉ apply trên tokens đã được tokenized. Nếu em muốn giữ nguyên input source thì em có thể define multi fields, ví dụ:

"name": {
    "type": "text",
    "analyzer": "my_analyzer",
    "fields": {
          "raw": { "type": "keyword"}
      }
}

Lúc này

name.raw = 'mua dien thoai'
name = [mua, dien thoai, điện thoại]