엔지니어 블로그
Elasticsearch로 검색기능 구현 -4 본문
지난 Elasticsearch로 검색기능 구현 -3 에서는 각 field를 원하는 type으로 mapping 하는 작업까지 완료했다. 이제는 각 field를 검색 조건으로 사용하기 위해 적절한 analyzer를 적용해볼 것이다.
1. 주소 analyze
우선, 원하는 검색의 형태는 다음과 같다.
전체 주소로 검색했을 때 검색이 가능한가?
"서울시 봉익동" 으로 검색했을 때 검색이 가능한가 ?
"서울시 종로구 봉익동" 으로 검색했을 때 검색이 가능한가 ?
"종로구 봉익동" 으로 검색했을 때 검색이 가능한가 ?
"봉익동" 으로 검색했을 때 검색이 가능한가 ?
"서울 봉익동" 으로 검색했을 때 검색이 가능한가?
위의 검색 경우의 수를 모두 만족시키기 위해 nori analyzer를 활용할 것이다.
"addr" : "서울특별시 종로구 봉익동 43-1"
그리고 모든 주소가 위와 같은 형식으로 시/구/동/번지 의 형태를 가지고 있다. 그렇기 때문에 field 전체에 동일한 analyzer를 적용해 줄 수 있다.
...
"analysis" : {
"analyzer" : {
"nori_analyzer" : {
"type" : "custom",
"tokenizer" : "nori_tokenizer",
"filter" : "synonym"
}
}
},
"mapping" : {
"properties" : {
"addr" : {
"type" : "text",
"analyzer" : "nori_analyzer"
}
}
}
token을 확인해 보니 서울/ 특별/ 시 / 종로/ 구 / 봉익/ 동 / 43 / 1 로 나눠졌다. 이제 위에서 언급한 검색 조건에 있는 모든 경우의 수를 검색이 가능하게 만들어야 한다. 그러기 위해서는 search_analyzer도 설정해 줬다.
...
"analysis" : {
"analyzer" : {
"nori_analyzer" : {
"type" : "custom",
"tokenizer" : "nori_tokenizer",
"filter" : "synonym"
},
"stop_nori" : {
"type" : "custom",
"tokenizer" : "nori_tokenizer",
"filter" : "stop_filter"
}
},
"filter" : {
"stop_filter" : {
"type" : "stop",
"stopwords_path" : "analysis/stop_dic.txt"
}
}
},
"mapping" : {
"properties" : {
"addr" : {
"type" : "text",
"analyzer" : "nori_analyzer",
"search_analyzer" : "stop_nori"
}
}
}
...
}
위에서 설정한 search analyzer인 stop_nori는 불용어 사전을 이용해서 설정해둔 불용어를 제외하고 색인을 진행한다.
지정해둔 불용어 사전에는 시,구,동,/,- 을 설정해 뒀다.
stop_nori를 통해 analyze를 진행한 결과 서울시 종로구 봉익동 이라는 검색어는 서울 / 종로 / 봉익 으로 tokenize 되었다.
search API를 통해 검색을 진행해 보면 검색 대상의 token [서울 / 특별 / 시 / 종구 / 구 / 봉익 / 동 / 43 / 1] 과 검색어 token [서울 / 종로 / 봉익] 이 일치하는 부분이 있기 때문에 검색이 잘 진행된다.
'개인 프로젝트 > Elk 검색기능 구현 프로젝트' 카테고리의 다른 글
Elasticsearch로 검색기능 구현 -5 (0) | 2022.04.07 |
---|---|
Elasticsearch로 검색기능 구현 -3 (0) | 2022.04.01 |
Elasticsearch로 검색기능 구현 -2 (0) | 2022.03.31 |
Elasticsearch로 검색기능 구현 -1 (0) | 2022.03.30 |