
텍스트를 분절시키는 방법 입니다.
어떻게 텍스트를 token으로 나눌 것인가?
참고로 tokenizer는 하나만 사용가능하다.
standard tokenizer는 띄어쓰기를 기준으로 나눈다.
POST _analyze { "analyzer": "standard", "text": "안녕하세요 반갑습니다." }결과
{ "tokens": [ { "token": "안녕하세요", "start_offset": 0, "end_offset": 5, "type": "<HANGUL>", "position": 0 }, { "token": "반갑습니다", "start_offset": 6, "end_offset": 11, "type": "<HANGUL>", "position": 1 } ] }띄어쓰기를 기준으로 나누면 안녕하세요, 안녕을 서로 다른 token으로 저장한다.
Full Text Search 를 더 잘 사용하려면 한글 전용 형태소 분석기를 사용하면 좋다.
먼저 우리나라에서 가장 자주 사용하는 nori를 사용해보겠다.
POST _analyze { "analyzer": "nori", "text": "안녕하세요 반갑습니다." }결과
{ "tokens": [ { "token": "안녕", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "반갑", "start_offset": 6, "end_offset": 8, "type": "word", "position": 4 } ] }nori를 사용하면 이렇게 한글에 더 알맞게 나눠준다.
참고로 nori를 사용하기 위해서는 Elasitc server에서 미리 다운 받아야한다.
ngram은 문장을 해당 문자갯수에 따라 token으로 나누는 방식이다.
설정
PUT ngram_test_index { "settings": { "analysis": { "filter": { "my_ngram": { "type": "ngram", "min_gram": 2, "max_gram": 3 } } } } }
- min_gram은 최소한으로 나누는 단위, max_gram은 최대한으로 나누는 단위
- 예시 내용을 보면 2글자, 3글자 단위로 나뉜다.
예시
GET ngram_test_index/_analyze { "tokenizer": "whitespace", "filter": [ "my_ngram" ], "text": "대한민국" }결과
{ "tokens": [ { "token": "대한", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 }, { "token": "대한민", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 }, { "token": "한민", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 }, { "token": "한민국", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 }, { "token": "민국", "start_offset": 0, "end_offset": 4, "type": "word", "position": 0 } ] }
ngram 2로 나눴을 때
검색 퀄리티를 높이기 위해서는 여러가지 방법이 있을 것이다.
nori처럼 분석하는 것도 좋지만 ngram과 같은 방법이 필요할 때도 있을 것이다.
그러면 tokenizer는 한개 밖에 사용 못하는데 어떻게하면 두개의 tokenizer를 사용할 수 있을까?
다음 게시글에서 그 방법을 알려드리고 제가 프로젝트에서 사용했던 방법을 알려드리곘습니다.