엔지니어 블로그

Elasticsearch로 검색기능 구현 -4 본문

개인 프로젝트/Elk 검색기능 구현 프로젝트

Elasticsearch로 검색기능 구현 -4

안기용 2022. 4. 4. 08:27

지난 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 [서울 / 종로 / 봉익] 이 일치하는 부분이 있기 때문에 검색이 잘 진행된다.