https://www.notion.so/gasbugs/e6d8283ea2ed47458adf42ddf457e89b
참고자료
https://www.elastic.co/guide/en/elasticsearch/plugins/6.4
https://coding-start.tistory.com/167
https://www.elastic.co/kr/blog/nori-the-official-elasticsearch-plugin-for-korean-language-analysis
데이터 삽입
POST test/data
{
"제목":"안녕하세요.",
"내용":"안녕하세요. 이동명입니다.",
"날짜":"2019-12-28",
"비밀번호":"1234"
}
첫번째 데이터 검색 요청
GET _search?q="안녕"
데이터 검색 결과 - 실패
{
"took" : 11,
"timed_out" : false,
"_shards" : {
"total" : 6,
"successful" : 6,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
두 번째 데이터 검색 요청
GET /_search?q="안녕하세요"
데이터 검색 결과 - 성공
{
"took" : 11,
"timed_out" : false,
"_shards" : {
"total" : 6,
"successful" : 6,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "test",
"_type" : "data",
"_id" : "lxNPSm8BB_pfiKR1HdID",
"_score" : 0.2876821,
"_source" : {
"제목" : "안녕하세요.",
"내용" : "안녕하세요. 이동명입니다.",
"날짜" : "2019-12-28",
"비밀번호" : "1234"
}
}
]
}
}
결론: 풀 텍스트 검색 불가능...
해결 방법: 노리를 사용해서 분석한 데이터를 입력하면 검색하도록 만들 수 있음
PS C:\elk\elasticsearch\bin> ***.\elasticsearch-plugin.bat install analysis-nori***
-> Downloading analysis-nori from elastic
[=================================================] 100%??
-> Installed analysis-nori
PS C:\elk\elasticsearch\bin>
$ ***sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori***
-> Downloading analysis-nori from elastic
[=================================================] 100%??
-> Installed analysis-nori
docker exec -t es01 /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori
docker exec -t es02 /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori
docker exec -t es03 /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori
POST _analyze
{
"analyzer":"nori",
"text":"역곡역 주변에 보안프로젝트 사무실이 생겼어요."
}
노리는 하나의 토크나이저와 두 개의 토큰 필터로 구성됨
토크나이저: 단어(term또는 token)를 분리
토큰 필터: 단어들을 검색 가능 하도록(searchable) 가공
토크나이저 + 토큰 필터 → 분석기(Analyzer) 한국어의 풀텍스트 서치 가능!
decompound_mode: 토크 나이저가 복합 토큰을 처리하는 방법을 결정
user_dictionary
$ES_HOME/config/userdict_ko.txt
c++
C샤프
세종
세종시 세종 시
사전 파일 생성 - userdict_test.txt
안녕하세요 안녕 하세 요
이동명입니다 이동명 입니다
사전 파일 배치
docker cp userdict_test.txt es01:/usr/share/elasticsearch/config
docker cp userdict_test.txt es02:/usr/share/elasticsearch/config
docker cp userdict_test.txt es03:/usr/share/elasticsearch/config
가장 먼저 인덱스가 노리의 분석 기능을 사용할 수 있도록 설정이 필요
PUT korean_analyzer1
{
"settings":{
"analysis":{
"tokenizer":{
"korean_nori_tokenizer":{
"type":"nori_tokenizer",
"decompound_mode":"mixed",
"user_dictionary":"userdict_test.txt"
}
},
"analyzer":{
"nori_analyzer":{
"type":"custom",
"tokenizer":"korean_nori_tokenizer"
}
}
}
}
}
POST korean_analyzer1/_analyze
{
"analyzer":"nori_analyzer",
"text":"안녕하세요. 이동명입니다."
}
nori_part_of_speech 토큰 필터는 품사 태그 세트와 일치하는 토큰을 제거
지원되는 음성 태그 및 의미의 목록은 여기에서 확인
http://lucene.apache.org/core/7_4_0/analyzers-nori/org/apache/lucene/analysis/ko/POS.Tag.html
숫자에 해당하는 태그는 삭제하도록 설정
PUT nori_sample
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "nori_tokenizer",
"filter": [
"my_posfilter"
]
}
},
"filter": {
"my_posfilter": {
"type": "***nori_part_of_speech***",
"stoptags": [
"***NR***"
]
}
}
}
}
}
}
다음 질의를 하면 NR에 해당하는 내용은 삭제
NR = Numeral 숫자
GET nori_sample/_analyze
{
"analyzer": "my_analyzer",
"text": "일곱 강아지가"
}
스탑 태그의 디폴트 세팅
"stoptags": [
"E",
"IC",
"J",
"MAG", "MAJ", "MM",
"SP", "SSC", "SSO", "SC", "SE",
"XPN", "XSA", "XSN", "XSV",
"UNA", "NA", "VSV"
]
nori_readingform 토큰 필터는 한자로 작성된 토큰을 한글 형식으로 다시 작성
한자 → 한글
PUT hanja
{
"settings": {
"index":{
"analysis":{
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "nori_tokenizer",
"filter" : ["nori_readingform"]
}
}
}
}
}
}
GET hanja/_analyze
{
"analyzer": "my_analyzer",
"text": "崔壹善"
}
매핑 작업
PUT article
{
"settings": {
"analysis": {
"analyzer": {
"nori": {
"tokenizer": "nori_tokenizer"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"fields": {
"nori": {
"type": "text",
"analyzer": "nori"
}
}
}
}
}
}
PUT article/_bulk
{"index": {}}
{"title":"양산 삼호지구 뉴딜사업 규모 확 늘린다"}
{"index": {}}
{"title":"무궁화 프로젝트, ‘end’가 아닌 ‘and'인 이유"}
{"index": {}}
{"title":"인천시 서구, 가재울마을 도시재생뉴딜사업 본격추진"}
{"index": {}}
{"title":"도시재생으로 활력 키우는 춘천시…인구·관광객 유치 효과 기대"}
{"index": {}}
{"title":"임실군, 농촌맞춤형 도시재생 구현 ‘앞장’"}
{"index": {}}
{"title":"광명시, '소규모주택정비사업' 시민들 많은 관심"}
{"index": {}}
{"title":"금천구 독산동 우시장 일대 도시재생 ‘성과공유회’ 개최"}
{"index": {}}
{"title":"[기고] 지역 전통주, 도시재생사업으로 마을기업 이룬다면"}
{"index": {}}
{"title":"국토부 'LH에 도시재생 직렬 신설 검토 중'"}
{"index": {}}
{"title":"대전 중구, 내년까지 동서대로 1421번길 일원… 40개 건물·65개 업소 간판 개선"}
POST article/_search
{
"query" : {
"match" : {
"station.nori": "홍대"
}
}
}