📝검색엔진
DB에 일반 검색에 문제점들을 해결하기 위해 만들어졌으며 현재에는 검색뿐만 아니라 다양하게 이용되고 있습니다 대표적인 특징들은 아래와 같습니다
💗장점
- 전문 검색
- 데이터베이스로 처리하기 어려운 대량의 비정형 데이터 검색이 가능하다
- 예를 들면 "다이슨선풍기" 라는 키워드로는 "다이슨 DP-03 퓨어쿨 선풍기" 를 조회할 수 없습니다 하지만 "다이슨 / DP-03 / 퓨어 / 쿨 / 선풍기" 라고 검색엔진이 형태소 분해를 했을 때는 조회가 가능합니다
- 동의어 검색
- 예를 들면 검정 구두라고 했을 때 블랙 구두도 나오게 하고 싶을 때 사용하기 좋습니다.
- 복잡한 정렬 가능
- 일반적으로 관련성이 높은 레코드를 상위에 노출하는게 중요합니다
- 색인된 데이터들로 적합도 점수를 매겨서 빠르게 정렬 및 다양한 정렬을 할 수 있게 해줍니다
엘라스틱에서는 BM25라는 알고리즘을 사용합니다.
TF는 문서내 검색 키워드의 단어 빈도수가 높을 경우 점수가 높아진다
("치킨" 이라는 키워드가 본문에 50개가 나왔다 등)
IDF의 경우 전체 문서에서 검색 키워드의 빈도수가 높을수록 검색 점수는 낮아진다.
(필요 없는 단어라는 취급 예를 들면 "조사", "숫자" 등)
TF와 IDF의 적절한 조합으로 인해 만들어진게 BM25라는 엘라스틱 자체 적합도 알고리즘
⚠️단점
- 색인 처리를 한 후에 검색을 할 수 있기 때문에 실시간 처리는 불가능하다.
- 트랜잭션(Transaction) 롤백(Rollback) 등의 기능을 제공하지 않는다
- 분산 시스템 구성의 특징 때문에, 시스템적으로 비용 소모가 큰 롤백, 트랜잭션을 지원하지 않습니다 그래서 데이터 관리에 유의해야 합니다.
엘라스틱서치에는 물론 업데이트 명령이 있습니다만, 실제로는 데이터를 삭제했다가 다시 만드는 과정으로 업데이트됩니다 이러한 특성은 나중에 불변성(Immutable)이라는 이점을 제공하기도 합니다.
📝DB vs 검색엔진
DB로도 충분한데 왜 검색엔진을 쓰냐라고 하시는데 검색엔진은 검색에 특화되어있는 솔루션으로 검색에서 위에 설명한 거 같은 장점이있습니다.
📝동작 방식 (역인덱싱)
검색엔진은 색인이라는 역인덱싱과정을 채택하는데 색인과정을 거칠시 형태소가 분해되어 각 형태소가 몇번째에 레코드와 관련있는지에 대해서 표시를 해줍니다. 그래서 짜장면을 검색할시 형태소에서 찾아 얘는 관련되어 있는 레코드는 1번이네? 이러면서 찾아갑니다
물론 미리 색인작업을 거쳐야하기 때문에(빨리 찾아갈 수 있게끔) 실시간이 상황에 따라 어렵다는 단점이 있습니다.
📝Solar vs Elastic
오픈소스 검색엔진이 두개가 있습니다. (Solar와 Ealstic Search)
어떤 글에서는 Solar보다 Elastic이 더 빠르다 아니다 이런 글들이 많은데 솔직히 핵심기능 측면에서는 큰 차이는 없어보입니다.
- Solar
- 자유도가 높습니다 개발자 중심의 API를 가지고 있습니다.
- 대시보드를 제공하지 않지만, 외부 시각화 도구와 연동할 수 있습니다.
- Solr은 일괄 처리 방식을 사용하여 변경 사항이 검색 결과에 반영되기까지 시간이 걸릴 수 있습니다 이는 Solr이 변경 사항이 발생할 때마다 색인을 업데이트하는 것이 아니라 변경 사항이 축적된 후 일괄 처리를 수행하기 때문입니다.
- Elastic
- 자유도는 높지 않지만 다양한 API를 제공하기 때문에 필요한 건 웬만해서 구현이 다 가능합니다
- 대시보드를 따로 제공해주고 있습니다 (Kibana)
- Elasticsearch는 변경 사항이 발생할 때마다 실시간으로 검색 색인을 업데이트하므로, 변경 사항이 바로 검색 결과에 반영됩니다 Elasticsearch는 분산 아키텍처와 실시간 검색 성능에 대한 요구 사항이 높은 대규모 애플리케이션에서 사용하기 좋습니다
기술적인 장단점에 차이는 없는 것 같고 커뮤니티 활성도등을 따지는게 좋을 거 같습니다 저 같은 경우는 엘라스틱을 선택해 사용중입니다.
'[CS 지식]' 카테고리의 다른 글
[CS 지식] 테크리드(Tech Lead), CTO (1) | 2022.10.20 |
---|---|
[CS 지식] MIME타입, 싱글톤(SingleTon) 패턴, Chunk 지향 처리, APM, 메모리디비 (0) | 2022.09.27 |
[CS 지식] 강타입, 약타입, MView, Base64, CI/CD, 쿠버네티스(k8s) (0) | 2022.09.11 |
[CS 지식] 개발자 종류 [1] (프론트엔드 개발자, 백엔드(서버쪽), 모바일개발자, 애플리케이션개발자, 게이밍 플레이 개발자, 게이밍 엔진 개발자, 보안 개발자, 백엔드 시스템 플랫폼 개발자) (0) | 2022.09.04 |
[CS 지식] SGML, XML, DTD (0) | 2022.09.04 |