elasticsearch tokenizer

# kibana 에서 로그 조회시 my_log:[ysoftman] 로 질의하면
# [ysoftman] 외 ysoftman 도 조회된다.
# \[ 로 이스케이프해도 동일하다.

# elasticsearch(es) 는 토큰을 생성할때 상황에 맞는 tokenizer(토크나이저)를 선택할 수 있다.
# 디폴트 standard 토크나이저는 공백과 특수문자를 모두 제거한다.
# es 에 다음과 같이 테스트하면 [] @ <> / 는 모두 제거 후 토큰을 분리한다.
# 따라서 ysoftman 처럼 [] 가 없는 토큰이 생성되어 검색시 [] 는 무시된다. 
curl -X GET "http://ysoftman.es.test:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "tokenizer" : "standard",
  "text" : "[ysoftman] 123@aac.com this is test... <b>test</b>"
}

# whitespace 토크나이저의 경우 특수문자 제거 없이 공백으로만 토큰을 분리한다.
# 따라서 [ysoftman] 이 자체가 토큰이 된다.
curl -X GET "http://ysoftman.es.test:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "tokenizer" : "whitespace",
  "text" : "[ysoftman] 123@aac.com this is test... <b>test</b>"
}

# [] 와 같은 특수 문자까지 구분해서 조회하기 위해서는 whitespace 토크나이저를 사용해야 한다.

# 테스트
# whitespace 토크나이저를 사용하는 ysoftman-test-001 인덱스 생성
curl -X PUT "http://ysoftman.es.test:9200/ysoftman-test-001" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ysoftman_tokenizer": { 
          "tokenizer": "whitespace"
        }
      }
    }
  },
  "mappings": {
      "properties": {
      "my_log": {
          "type": "text",
          "analyzer": "ysoftman_tokenizer"
      }
    }
  }
}
'
# 인덱스 생성 확인
curl "http://ysoftman.es.test:9200/ysoftman-test*"

# 설정한 토크나이저가 동작하는지 확인해 보자.
# explain = true 로 설정하면 사용된 토크나이저 정보가 응답에 추가된다.
curl -X GET "http://ysoftman.es.test:9200/ysoftman-test-001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "explain": true,
  "field": "my_log",
  "text" : "[ysoftman] lemon @apple @juice, 12 - 999"
}'

# 이제 ysoftman 와 [ysoftman] 데이터를 추가한다.
curl -X POST "http://ysoftman.es.test:9200/ysoftman-test-001/_doc/1" -H 'Content-Type: application/json' -d'
{
  "my_log" : "[ysoftman] lemon @juice, 100"
}
'
curl -X POST "http://ysoftman.es.test:9200/ysoftman-test-001/_doc/2" -H 'Content-Type: application/json' -d'
{
  "my_log" : "ysoftman apple @juice, 200"
}
'

# 이제 [ysoftman] 만 조회된다.
curl -X GET "http://ysoftman.es.test:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "text": "[ysoftman]"
    }
  }
}
'

# kibana -> index pattern -> ysoftman-test* 인덱스 생성
# *ysoftman* 로 조회시 [ysoftman] , ysoftman 모두 조회
# [ysoftman] 로 조회시 [ysoftman] 만 조회
# ysoftman 로 조회시 ysoftman 만 조회

# 결론
# 특수문자까지 구분하는 exact matching 을 할경우 whitespace 를 사용하면 되지만
# 한글자만 틀려도 조회되지 않아 필요시에만 사용하는게 좋다.

# 테스트 종료 후 인덱스 삭제
curl -X DELETE "http://ysoftman.es.test:9200/ysoftman-test-001"

# 참고

comments:

댓글 쓰기