[엘라스틱서치] stopwords, synonym 적용 방안 - forewalk/elastic GitHub Wiki
Elasticsearch
dictionary
stopwords, synonym 사전, userdic 을 위한 사전 갱신 방안은 두 가지가 있다.
- search_analyzer와 analyzer를 분리, index를 close, open 하는 방법
- reindex 방법
새로운 단어를 사전에 추가해야한다는 이슈가 있다면, 어느 것이 가장 효과적일까? 결론부터 얘기하면, nori userdic은 새로운 단어에 대한 방안이 reindex뿐이다. 이는 이미 들어가는 데이터의 분절이 진행되기때문이다. 잘 생각해보자, '데이터게이트' 라는 단어를 색인하는 시점에 '데이터'와 '게이트'를 분절하여 색인하지 않는다면, 검색시에 게이트로 검색했을 경우 찾아낼 수 있는 방법이 없다.(단순히 음절의 분절이라면 ngram을 하면 되겠지만, 용량을 고려하여 설계해야 한다)
즉, 이미 색인되어 있는 데이터를 search analyzer로 분리하였다 하더라도, 의미가 없다는 걸 알 수 있다.
그러나 stopwords나 synonym의 경우 다르다. 이 두 필터는 검색시에 차단하거나 유의어를 함께 참조하는 것이 가능하다. 따라서 search_analyzer와 analyzer를 분리할 수 있다는 의미가 되며, reindex로 데이터를 다시 만들거나(사이즈가 너무 크면 아에 reindex를 고려하지 못할 수도 있겠다.) 하지 않아도 될 것이다.
※ 다만 txt가 수정되고 이것이 적용될 때, 잘못하면 open이 안될 수 있으니 txt를 만들고 수정하는 처리를 잘해야 할 것이다. 파일이 잘못 생성되는 홀이 생긴다면, 별 것 아닌 것에 index를 오픈하지 못하는 큰 장애가 발생할 수 있는 큰 리스크가 있다.
이 부분을 방지하기 위해선 stop_words의 경우 lenient 옵션이 들어가 있어 별 이슈 없이 잘 오픈되지만, synonym의 경우 "lenient": true 을 옵션으로 넣어야 한다. nori의 경우 적용 불가하다.