검색 엔진
검색 엔진이란?
검색 엔진(Search Engine)은 사용자가 웹이나 문서에서 특정 키워드를 검색할 때 관련된 정보를 찾기 위한 소프트웨어 시스템을 의미한다. 대개는 비정형화된 텍스트에 대한 검색을 의미하며, 그림이나 비디오 등의 멀티미디어도 대상이 된다.
여기서의 검색 엔진은 정보 검색(IR, Information Retrieval)의 일종으로 볼 수 있다.
IR은 문서나 데이터 소스에서 관련 정보를 검색하고 제공하는 과정을 의미하며, 대개는 텍스트 기반의 정보 검색에 적용되어 사용자의 요구사항과 일치하는 문서를 찾는 것을 목적으로 한다.
IR은 사용자의 검색 쿼리를 분석하고 인덱스된 문서를 검색하여 정보를 찾는 등의 문서 검색, 질의 처리, 검색 결과 평가 등의 다양한 기술을 포함하는 개념이다.
검색 엔진은 텍스트 획득, 텍스트 변환(파싱, 불용어 제거, 오타 교정 등), 색인 생성, 랭크 부여, 실시간 검색 결과 제공 등의 기능을 제공한다.
검색 엔진의 종류 (OpenSource)
meilisearch는 Elasticsearch에 비해 구성하고 사용하기 매우 쉬우면서도 다양한 기능을 제공하기에 고려해볼만하다.
다만 Elasticsearch는 레퍼런스가 많고 깊게 커스터마이징할 수 있는 기능이 많다.
개인적으로는 내가 만든 서비스에 좋은 검색 엔진을 쉽게 붙이고 싶은 니즈라면 meilisearch, 검색 엔진이 상당히 중요한 서비스라면 Elasticsearch를 사용할 것 같다.
ElasticSearch
ElasticSearch 섹션을 참고하자.
meilisearch
- meilisearch는 검색 관련 기능(실시간 검색, 오타 교정, 동의어 등)이 기본적으로 탑재되어 있고, 빠른 검색 속도로 인해 간단한 설정만으로도 높은 퀄리티의 검색 엔진을 구성할 수 있어서 인기를 얻고 있는 검색 엔진이다.
- ES와 비교해서도 상당히 많은 기능과 커스터마이징, 높은 퍼포먼스를 보여주기 때문에 충분히 고려해볼만하다. 다만 ES와 달리 레퍼런스를 찾기 쉽지 않다.
- 예제 : https://where2watch.meilisearch.com/
- 특징 (Officially)
- Search-as-you-type(실시간 검색결과 반환): find search results in less than 50 milliseconds
- Typo tolerance(오타 허용): get relevant matches even when queries contain typos and misspellings
- Filtering and faceted search(필터링): enhance your user's search experience with custom filters and build a faceted search interface in a few lines of code
- Sorting(랭킹 커스터마이즈): sort results based on price, date, or pretty much anything else your users need
- Synonym support(동의어, 유의어 지원): configure synonyms to include more relevant content in your search results
- Geosearch(위치를 고려한 검색): filter and sort documents based on geographic data
- Extensive language support(한글에 최적화): search datasets in any language, with optimized support for Chinese, Japanese, Hebrew, and languages using the Latin alphabet
- Security management(보안 관리): control which users can access what data with API keys that allow fine-grained permissions handling
- Multi-Tenancy(데이터에 대한 개별 액세스 권한): personalize search results for any number of application tenants
- Highly Customizable(커스터마이징): customize Meilisearch to your specific needs or use our out-of-the-box and hassle-free presets
- RESTful API: integrate Meilisearch in your technical stack with our plugins and SDKs
- Easy to install, deploy, and maintain
- 내가 느낀 좋은 점
- 언어별 SDK 제공: JS, Python, Java, Go, Rust 등의 많은 언어의 SDK를 공식 제공한다.
- 프론트 검색 박스(Instant-meilisearch): 검색 박스를 따로 구현하지 않아도 라이브러리로 제공한다.
- Document가 잘 작성되어 있음: Elasticsearch는 문서는 방대하고 잘 작성되어 있지만 쉽지만은 않은데 비해, meilisearch의 문서는 상당히 쉬운 구조로 잘 작성되어 있음.
- 쿼리가 Elasticsearch에 비해 매우 간단함: Elasticsearch의 DSL을 어렵게 작성하지 않아도 되고 SQL 문법과 상당히 유사하게 사용할 수 있다
- 커스터미이징이 매우 쉬움: 플러그인이 따로 있지 않은 대신 동의어나 불용어, 오타 수정 등의 기본 기능이 매우 강력하고 사용하기 쉽다
- ElasticSearch, Algolia, Typesense와의 비교
# 필터링해서 Batman 검색
client.index('movies').search('Batman', {
'filter': 'release_date > 795484800 AND (director = "Tim Burton" OR director = "Christopher Nolan")'
})
zincsearch
- ES를 구성하기에는 너무 간단한 앱일 때, 가벼운 검색 엔진을 구현해주는 오픈소스.
- 예제 : https://playground.dev.zincsearch.com (admin / Complexpass#123)
- 특징 (Offically)
- Provides full text indexing capability
- Single binary for installation and running. Binaries available under releases for multiple platforms.
- Web UI for querying data written in Vue
- Compatibility with Elasticsearch APIs for ingestion of data (single record and bulk API)
- Out of the box authentication
- Schema less - No need to define schema upfront and different documents in the same index can have different fields.
- Index storage in disk (default), s3 or minio (deprecated)
- aggregation support
Apache Lucene(루씬)
- Java로 구성된 오픈소스 형태의 검색 엔진 라이브러리이다.
- melilsearch, zincsearch 등과 다르게 검색 플랫폼을 제공하는 것이 아닌, 검색 어플리케이션/플랫폼을 개발하는데에 사용하는 라이브러리이기 때문에 검색 시스템으로 고려할 필요는 없지만 개념은 이해하고 있어야 한다.
- Elasticsearch, Apache Solr 등에서 Lucene을 사용하여 검색 엔진 플랫폼을 구성하고 있다.
- 특징
- Full-text Search: Lucene은 Full Text 검색에 특화되어 있어서 대용량 텍스트 데이터를 빠르게 검색할 수 있다.
- Indexing: 텍스트 검색을 효율적으로 하기 위해 역색인 기능을 제공하고, 역색인을 통해 키워드 중심으로 검색할 수 있게 한다.
- Performance: 역색인, 캐싱, 멀티 쓰레드, 인덱스 세그먼트 등을 이용하여 높은 성능을 보인다.
- Multi-language Supprt: Java 이외에 Pascal, Ruby, Python, C++ 등의 언어를 사용할 수 있다.
- Support for complex queries: boolean, wildcard, phrase 쿼리 등 복잡한 쿼리를 처리할 수 있다.
- Faceted search(패싯 검색): faceted navigation, guided navigation이라고도 불리며, 수많은 정보들 사이에서 속성이나 카테고리를 통해 범위를 좁혀가며 필요한 정보를 골라내는 검색 방법을 의미한다.
Apache Solr(솔라)
- Apache Lucene 기반의 오픈소스 검색 엔진이며, 사이즈가 큰 데이터 검색에 용이한 특징을 가지고 있으나 검색 속도와 색인 주기가 Elasticsearch에 비해 느리다.
- 문서 원문 검색과 같은 프로젝트에서 주로 사용하며, 최근에는 다른 검색 엔진에 비해 많이 사용되고 있지 않은 것으로 보인다. (677 stars)
- Elasticsearch가 머신러닝 기능은 유료인 반면에, Solr는 머신러닝 기능을 무료로 사용 가능하다는 것 이외에는 큰 메리트가 없는 것으로 보인다.
상단에서 말한 것처럼 간단히 살펴보았을 때는 레퍼런스가 많고 커스터마이징을 많이 할 수 있는 elasticsearch
와 다양한 기능을 제공하고 구성하거나 사용하기 쉬운 meilisearch
사이에서 고민하면 될 듯하다.
특히 elasticsearch에서 제공하는 기능으로 우리가 구축해야 할 검색 시스템이 충분히 구현 가능하다면 ES를 사용하는 것이 베스트일 것으로 생각된다.
이외에도 typesense, sonic도 고려해볼 수 있으나 Elasticsearch와 meilisearch에 비해 사용해야 할 이유를 찾기 어려워 제외했다.
ElasticSearch란?
(2023-02 기준) ElasticSearch는 DB 랭킹의 8위를 차지하고 있으며, 검색 엔진으로서는 Stars 기준 1위의 오픈소스 프로젝트이다. (명확히는 2021년부터 오픈소스는 아니다.)
Apache Lucene을 기반으로 구축되었으며 Lucene의 검색 엔진에 분산형 클러스터링, RESTful API의 추가 기능을 제공한다. 또한 ELK Stack(Elasticsearch, Logstash, Kibana)을 통해 데이터 수집부터 검색 엔진, 결과 분석과 시각화까지 제공한다.
RDBMS에서는 데이터를 테이블 형태로 저장하지만, 검색 엔진에서는 Inverted index라는 구조로 저장하여 비정형화된 텍스트 검색에 특화되어 있다.
RDBMS vs 검색 엔진
RDBMS | 검색엔진 | |
---|---|---|
데이터 저장 방식 | 정규화 | 역정규화 |
전문 검색 속도 | 느림 | 빠름 |
의미 검색 | 불가능 | 가능 |
Join | 가능 | 불가능 |
수정 / 삭제 | 빠름 | 느림 |
ELK Stack (Elastic Stack)
- Beats(경량 데이터 수집기)
- 다양한 소스의 데이터를 수집하는 역할이며, 데이터 소스의 종류에 따라 다양한 beats를 설치하여 사용하는 형태이다.
- e.g. Filebeat(파일 내용 수집), Auditbeat(감사 데이터 수집), Metriceat(프로세스 상태 수집)
- Logstash(데이터 집계, 변환)
- 로그 데이터, RDBMS, 이벤트 데이터 등의 다양한 소스에서 데이터를 수집하고 가공한 뒤 다양한 목적지로 전송하는 기능을 제공한다.
- Elasticsearch(검색 엔진)
- Apache Lucene을 기반으로 하는 오픈소스 분산 검색 및 분석 엔진
- Kibana(시각화&분석 도구)
- Elasticsearch의 데이터를 검색, 분석, 시각화(+대시보드 구성)하는 기능을 제공한다.
- Log 모니터링, Metrics 대시보드, APM 등의 기능과 ML 관련 기능(유료)도 제공한다.
'스터디 > 검색 엔진' 카테고리의 다른 글
[검색엔진] Elasticsearch - 인덱스 교체 전략 (2) | 2024.04.14 |
---|---|
[검색엔진] Elasticsearch 랭킹 (2) - 유사도 점수 정규화 (0) | 2024.03.31 |