문제 발단
- 대규모 채팅 데이터에서 ‘검색’이란 기능을 통해 데이터를 조회하는 시간이 너무 오래 걸림
- 적어도 2~3 초 안에는 데이터 검색이 되어야 유저가 쾌적하게 기능을 사용할 수 있을 것 같다고 판단
- mongo index를 사용해도 약 3백 만 건에 해당하는 데이터 안에서 조회를 하는데 무리가 있었음
결국 ‘역 인덱스’를 이용하는 elasticsearch에 대한 도입을 고려
mongodb와 똑같이 kafka를 통해 sink connector를 통한 데이터 consume을 하는 형태로 es에 저장했다.
문제 상황 : 포함 검색이 불가한 elasticsearch
mysql, mongodb는 ‘단어 검색’시 해당 단어를 포함하는 message를 조회하는 기능을 제공하고 있었다.
하지만 elasticsearch는 특정 단어 검색시 원하는 조회 결과를 내놓지 않는 문제가 발생했다.
이는 우리가 참고한 Discord 서비스도 똑같이 갖고 있는 문제이다.
발생 원인
- elasticsearch는 데이터를 ‘역 인덱스’로 관리함
- db에 key 값을 ‘특정 단어’로 저장하는 형태
- 예를 들어 ‘안녕하세요, 제 이름은 김건입니다’ 라는 메세지가 들어온다면
- 안녕하세요, 제, 이름은, 김건입니다 총 4개의 key로 관리하게 된다.
- 이렇게 되면 ‘안녕, 이름, 김건’에 대한 단어 검색을 하면 elasticsearch는 위 메세지를 반환할 수 없다.
- 무조건 ‘안녕하세요, 이름은, 김건입니다’라고 검색을 해야한다.
- 데이터를 효율적으로 관리하기 위해 저런 불편한 부분이 발생하게 된 것이다.
문제 해결