[엘라스틱서치] stopwords, synonym 적용 방안 - forewalk/elastic GitHub Wiki

Elasticsearch

dictionary


stopwords, synonym 사전, userdic 을 위한 사전 갱신 방안은 두 가지가 있다.

  1. search_analyzer와 analyzer를 분리, index를 close, open 하는 방법
  2. 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의 경우 적용 불가하다.