[ES] Text Analysis
1. text analysis
 1) text 형태소 분리(토큰화) : tokenizer
- "tokenizer": "whitespace": 여백을 기준으로 형태소 분석
>> request
GET _analyze
{
  "text": "Home Sweet Home",
  "tokenizer": "whitespace"
}
-------------------------------------------------------
>> response
Home / Sweet / Home
 2) 형태소 필터링 : filter
- "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
 3) index에 analyzer 적용
- 위 방법은 analyze API를 활용하여 주어진 text만을 분석
- index에 analyzer를 적용하면, analyzer가 해당 field 데이터를 모두 분석(토큰화,필터링)하여 검색에 반영
>> analyzer 적용
PUT sampleindex
{
  "mappings": {
    "properties": {
      "적용대상field명": {
        "type": "text",
        "analyzer" : "snowball"
      }
    }
  }
}
--------------------------------------------------------------------------------------------------
>> 'snowball' 적용 후 검색 시
: analyzer가 적용된 field 내 데이터를 그대로 입력하지 않고 
  **기본 형태만 입력하거나, **해당 단어와 같은 기본 형태를 갖는 그 외 형태를 입력하여 검색해도 검색 가능
  예) `develop`이 저장된 경우, `developing`, `developer`로도 검색 가능
 4) 사용자 정의 analyzer 생성
>> 사용자 정의 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 데이터 분석, 검색 적용
2. 한글 형태소 분석(nori)
 0) nori 한글 형태소 분석기 설치
C:\ElasticStack\elasticsearch-7.11.1\bin>elasticsearch-plugin install analysis-nori
 1) 한글 형태소 분리 : nori_tokenizer
- 한글 형태소 분리
- @등 특수문자는 문자로 인식하지 않음
>> request
GET _analyze
{
  "tokenizer": "nori_tokenizer",
  "text": "뒷동산에 @ 감나무 심기"
}
-------------------------------------------------------
>> response
뒷 / 동산 / 에 / 감 / 나무 / 심기
 2) 사용자 정의 사전에 단어 등록 : user_dictionary_rules / user_dictionary
- 위 분석 결과 중 뒷동산,감나무등의 복합어를 하나의 단어로 인식하고 싶을 경우, 해당 단어를 사용자 정의 사전에 등록
- ① 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
뒷동산 / 에 / 감나무 / 심기
 3) 복합어 처리 방식 : decompound_mode(none / discard / mixed)
- 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
삼성전자 / 삼성 / 전자
 4) 품사 필터(특정 품사 제외) : nori_part_of_speeck - stoptags
- 한글 형태소 분석시 조사(은,는,이/가) 등 의미를 갖지 않는 품사를 필터링 하기 위함
- 필요에 따라 의미를 갖는 품사도 필터링 할 수 있음
- 품사별 입력 태그는 꼬꼬마 한국어 형태소 분석기, 한글 형태소 품사 (Part Of Speech, POS) 태그표 에서 확인할 수 있음
>> 품사 필터 포함한 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
그대 / 이름 / 장미  # 조사 "은" 제거됨
 5) 형태소별 품사 확인 : explain
- 품사 필터를 사용하기 전, 형태소별 품사 확인이 필요할 경우 사용
- "explain": true옵션 적용
>> request
GET _analyze
{
   "tokenizer": "nori_tokenizer",
   "explain": true,
   "text": "그대 이름은 장미"
}
-------------------------------------------------------
>> response
그대	"NP(Pronoun)"
이름	"NNG(General Noun)"
은	"J(Ending Particle)"
장미 	"NNG(General Noun)"
 6) 한자 한글 변환 필터 : nori_readingform
- text 중 한자 값을 한글로 변환해주는 필터
>> 한자 한글 변환 필터 포함한 analyzer 생성
PUT my_nori
{
  "settings": {
    "analysis": {
      "analyzer": {
        "사용자정의analyzer이름": {
          "tokenizer": "nori_tokenizer",
          "filter": ["nori_readingform"]
        }
      }
    }
  }
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
  "analyzer": "사용자정의analyzer이름",
  "text": "中國"
}
>> response
중국
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Author And Source
                            
                            이 문제에 관하여([ES] Text Analysis), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://velog.io/@geesuee/ES-Text-Analysis
                            
                            
                            
                                저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
"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 데이터 분석, 검색 적용0) nori 한글 형태소 분석기 설치
C:\ElasticStack\elasticsearch-7.11.1\bin>elasticsearch-plugin install analysis-nori
1) 한글 형태소 분리 : nori_tokenizer
- 한글 형태소 분리
- @등 특수문자는 문자로 인식하지 않음
>> request
GET _analyze
{
  "tokenizer": "nori_tokenizer",
  "text": "뒷동산에 @ 감나무 심기"
}
-------------------------------------------------------
>> response
뒷 / 동산 / 에 / 감 / 나무 / 심기2) 사용자 정의 사전에 단어 등록 : user_dictionary_rules / user_dictionary
- 위 분석 결과 중 뒷동산,감나무등의 복합어를 하나의 단어로 인식하고 싶을 경우, 해당 단어를 사용자 정의 사전에 등록
- ① 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
뒷동산 / 에 / 감나무 / 심기3) 복합어 처리 방식 : decompound_mode(none / discard / mixed)
- 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
삼성전자 / 삼성 / 전자4) 품사 필터(특정 품사 제외) : nori_part_of_speeck - stoptags
- 한글 형태소 분석시 조사(은,는,이/가) 등 의미를 갖지 않는 품사를 필터링 하기 위함
- 필요에 따라 의미를 갖는 품사도 필터링 할 수 있음
- 품사별 입력 태그는 꼬꼬마 한국어 형태소 분석기, 한글 형태소 품사 (Part Of Speech, POS) 태그표 에서 확인할 수 있음
>> 품사 필터 포함한 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
그대 / 이름 / 장미  # 조사 "은" 제거됨5) 형태소별 품사 확인 : explain
- 품사 필터를 사용하기 전, 형태소별 품사 확인이 필요할 경우 사용
- "explain": true옵션 적용
>> request
GET _analyze
{
   "tokenizer": "nori_tokenizer",
   "explain": true,
   "text": "그대 이름은 장미"
}
-------------------------------------------------------
>> response
그대	"NP(Pronoun)"
이름	"NNG(General Noun)"
은	"J(Ending Particle)"
장미 	"NNG(General Noun)"6) 한자 한글 변환 필터 : nori_readingform
- text 중 한자 값을 한글로 변환해주는 필터
>> 한자 한글 변환 필터 포함한 analyzer 생성
PUT my_nori
{
  "settings": {
    "analysis": {
      "analyzer": {
        "사용자정의analyzer이름": {
          "tokenizer": "nori_tokenizer",
          "filter": ["nori_readingform"]
        }
      }
    }
  }
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
  "analyzer": "사용자정의analyzer이름",
  "text": "中國"
}
>> response
중국Author And Source
이 문제에 관하여([ES] Text Analysis), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@geesuee/ES-Text-Analysis저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)