"tokenizer": "whitespace"
: 여백을 기준으로 형태소 분석>> request
GET _analyze
{
"text": "Home Sweet Home",
"tokenizer": "whitespace"
}
-------------------------------------------------------
>> response
Home / Sweet / Home
"filter": "lowercase"
: 소문자로 변환"filter": "stop"
: 불용어(the, and 등) 제거"filter": "snowball"
: ~ing, ~s 등 제거, 단어를 기본 형태로 변환>> request
GET _analyze
{
"text": "I bought you five roses and ring",
"tokenizer": "whitespace",
"filter": ["lowercase", "stop", "snowball"]
}
-------------------------------------------------------
>> response
i / bought / you / five / rose / ring
>> analyzer 적용
PUT sampleindex
{
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "snowball"
}
}
}
}
--------------------------------------------------------------------------------------------------
>> 'snowball' 적용 후 검색 시
: analyzer가 적용된 field 내 데이터를 그대로 입력하지 않고
**기본 형태만 입력하거나, **해당 단어와 같은 기본 형태를 갖는 그 외 형태를 입력하여 검색해도 검색 가능
예) `develop`이 저장된 경우, `developing`, `developer`로도 검색 가능
>> 사용자 정의 analyzer 생성 및 적용
PUT sampleindex
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "whitespace"
"filter": ["lowercase", "stop", "snowball"]
}
}
}
}
},
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 원하는 옵션 선택하여 사용자 정의 analyzer 생성 가능
>> 생성 후 적용까지 해주면 해당 field 데이터 분석, 검색 적용
C:\ElasticStack\elasticsearch-7.11.1\bin>elasticsearch-plugin install analysis-nori
@
등 특수문자는 문자로 인식하지 않음>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"text": "뒷동산에 @ 감나무 심기"
}
-------------------------------------------------------
>> response
뒷 / 동산 / 에 / 감 / 나무 / 심기
뒷동산
, 감나무
등의 복합어를 하나의 단어로 인식하고 싶을 경우, 해당 단어를 사용자 정의 사전에 등록user_dictionary_rules
: tokenizer 지정시 함께 단어 등록>> 사용자 정의 사전 포함한 tokenizer 생성 및 적용
PUT sampleindex
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
},
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary_rules": ["뒷동산", "감나무"]
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenizer 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
user_dictionary
: C:\ElasticStack\elasticsearch-7.11.1\config
안에 텍스트 파일 생성하여 단어 등록>> 사용자 정의 사전 포함한 tokenizer 생성
PUT sampleindex
{
"settings": {
"analysis": {
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary": "텍스트파일명.txt"
}
},
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenziser 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
none
: 복합어 분리하지 않고, 원본만 그대로 출력discard
: 복합어 분리하여 출력(원본은 출력X)mixed
: 복합어 분리하여 출력하고, 원본도 함께 출력>> 각각의 decompound_mode를 포함한 tokenizer 생성
PUT my_nori
{
"settings": {
"analysis": {
"tokenizer": {
"nori_none": {
"type": "nori_tokenizer",
"decompound_mode": "none"
},
"nori_discard": {
"type": "nori_tokenizer",
"decompound_mode": "discard"
},
"nori_mixed": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
}
}
}
}
-------------------------------------------------------
>> 1) "none" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_none",
"text": "삼성전자"
}
>> response
삼성전자
------------------------------------
>> 2) "discard" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_discard",
"text": "삼성전자"
}
>> response
삼성 / 전자
------------------------------------
>> 3) "mixed" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_mixed",
"text": "삼성전자"
}
>> response
삼성전자 / 삼성 / 전자
>> 품사 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["사용자정의filter이름"]
}
},
"filter": {
"사용자정의filter이름": {
"type": "nori_part_of_speech",
"stoptags": ["J"] # "J"는 조사, 해당 필터는 조사 제외 필터
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analzer이름",
"text": "그대 이름은 장미"
}
>> response
그대 / 이름 / 장미 # 조사 "은" 제거됨
"explain": true
옵션 적용>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"explain": true,
"text": "그대 이름은 장미"
}
-------------------------------------------------------
>> response
그대 "NP(Pronoun)"
이름 "NNG(General Noun)"
은 "J(Ending Particle)"
장미 "NNG(General Noun)"
>> 한자 한글 변환 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["nori_readingform"]
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analyzer이름",
"text": "中國"
}
>> response
중국