검색엔진을 구현할때는 다양한 방법이 있습니다.
그 중에서 mysql like, mysql full-text-scan, elasticsearch 등이 있습니다.
1. MySQL Like
일반적으로 mysql 등의 디비에서 키워드를 검색할때는 like연산자를 이용하여 일치하는 값을 검색합니다.
그러나 like연산자를 이용하는 방식은 단어 또는 구문에 대한 검색에는 어느정도 한계가 있습니다.
만약 '크림 파스타' 라는 데이터가 있고, 유저가 "크림파스타" 라고 검색을 한다면 결과값은 나오지 않을 것입니다.
결과값이 나오게 하려면
select * from search_warming where REPLACE(keyword, " ", "") LIKE "%크림파스타%”
이런식으로 조회를 해야 결과가 나올 것 입니다.
또는 "크림 머쉬룸 파스타" 라는 데이터를 "크림파스타" 라고 검색을 한다면 이 또한 결과값이 나오지 않을 것이고,
결과값이 나오게 하려면
select * from search_warming
where keyword like '%크%' and keyword like '%림%' and keyword like '%파%' and keyword like '%스%' and keyword like '%타%';
이런 요란한 방법을 써야할지도 모릅니다.
심지어 이런 검색 결과를 중요도 순으로 정렬한다면?
select * from search_warming
where keyword like '%크%' and keyword like '%림%' and keyword like '%파%' and keyword like '%스%' and keyword like '%타%'
order by case
when keyword LIKE "% 크림파스타 %" then 1
when keyword LIKE "%크림파스타%" then 2
else 3
end
키워드 하나만을 위해 이런 복잡한 로직이 쓰이게 됩니다.
코드레벨에서 해결한다고 하더라도 로직이 복잡해지는건 마찬가지입니다.
그리고 like는 인덱싱되지 않은 컬럼에 적용하면 데이터베이스가 full scan을 사용하여 값을 찾고,
인덱싱 됐다 해도 대부분의 인덱스 검색보다 효율적이지 못합니다.
레코드 수가 많아질 수록 성능이 저하되기때문에 사실상 사용하지 않는 것이 좋습니다.
그래서 mysql 에서는 fulltext를 지원해줍니다.
2. fulltext란?
인덱서는 텍스트를 입력으로 받아 텍스트 처리(어미 자르기, 중요하지 않은 단어 등)를 수행하고 모든 것을 인덱스에 저장합니다.
이러한 인덱스의 구조는 매우 빠른 검색을 허용합니다.
색인 검색 인터페이스인 검색 엔진은 클라이언트의 요청을 받아 구문을 처리하고 색인에서 검색합니다.
자연어 검색, 불린 모드 검색, 쿼리 확장 검색의 검색 방식을 지원합니다.
fulltext는 키가 개별 용어이고 관련 값이 해당 용어를 포함하는 레코드 세트인 인덱스를 사용합니다.
이러한 레코드 집합을 결합하여 교차를 계산하도록 최적화가 되어있고, 검색 키워드와 얼마나 근접하게 일치하는지 정량화하는 순서 알고리즘을 제공 합니다.
3. Elasticsearch란?
Elasticsearch는 시간이 갈수록 증가하는 문제를 처리하는 분산형 RESTful 검색 및 분석 엔진입니다. Elastic Stack의 핵심 제품인 Elasticsearch는 데이터를 중앙에 저장하여 손쉽게 확장되는 광속에 가까운 빠른 검색, 정교하게 조정된 정확도, 강력한 분석을 제공합니다.
1. 텍스트 검색에 매우 뛰어난 검색 성능을 보여주는데, 비교적 저사양의 노드로 구성된 클러스터로도 매우 많은 양의 텍스트를 빠르고 안정적으로 서비스가 가능합니다.
2. JSON 문서 기반으로 데이터가 작성되며, 데이터 저장 시에 미리 정의하지 않은 컬럼도 인덱싱이 가능하여 스키마의 변경이 자유롭습니다.
3. 검색엔진이 기반이기 때문에 키워드/결과 차원에 대한 스코어링이 기본적으로 탑재되어 있습니다. 따라서 원래 목적인 검색 결과/차원(dimension)에 따라 분류/집계(aggregation) 하고, 통계 값을 매기는 스코어링을 할 수 있어 리포트 – 통계를 내는 목적으로도 이용이 가능합니다.
결론적으로 fulltext보다 ElasticSearch가 성능면에서 더 뛰어나고 빠르기때문에 ElasticSearch를 이용하여 검색엔진을 구현해보도록 하겠습니다.
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 03. db연동하기 (0) | 2023.07.26 |
---|---|
[Elasticsearch] 02. Elasticsearch 사용하기 (with nori) (0) | 2023.07.25 |