본문 바로가기

코딩/NodeJS

메모리 효율적인 자바스크립트 기반 Fulltext 검색엔진 MiniSearch 소개

반응형

해커톤에서 챗봇 개발을 했는데, 보유한 데이터를 검색해서 보여줄 수 있는 기능이 필요했다.

별도의 서버를 사용할 수 있다면 좀 더 정석적인 도구를 사용할 수 있었겠지만, 주어진 환경이 글리치 서버 환경 뿐이라서 MariaDB나 MongoDB 같은 DB 연동이 불가능한 환경이었고, 글리치 특성 상 무거운 라이브러리를 설치하기가 부담스러웠다.

그래서 주어진 환경에서 가장 가볍고 효율적으로 원하는 기능을 구현할 수 있는 MiniSearch를 사용하게 됐다.

 

MiniSearch의 깃허브 주소는 아래와 같다.

사용 방법과 소개 또한 원문으로 존재하기 때문에 혹시 사용해보고 싶다면 참고하면 좋을 것 같다.

https://lucaong.github.io/minisearch/

 

MiniSearch

MiniSearch MiniSearch is a tiny but powerful in-memory fulltext search engine written in JavaScript. It is respectful of resources, and it can comfortably run both in Node and in the browser. Try out the demo application. Find the complete documentation an

lucaong.github.io

 

깃허브 페이지를 살펴보면 알 수 있듯이 MiniSearch는 메모리를 최대한 효율적으로 사용할 수 있도록 설계된 검색엔진이다.

 

MiniSearch를 설치하는 방법은 간단하다.

// npm 사용
npm install minisearch
// yarn 사용
yarn add minisearch

설치가 무사히 끝났다면 이제 사용하는 방법도 간단히 알아보자.

우선 minisearch를 import 해줘야 한다.

// import 사용 시
import MiniSearch from 'minisearch'
// require 사용 시
const MiniSearch = require('minisearch')

 

 

나는 파이썬에 익숙해서 import를 선호하는데 require도 많이들 쓰더라.

어차피 둘 다 동일한 역할을 하기 때문에 편한거 사용하면 된다.

 

이제 검색을 위한 전체 데이터를 준비한다.

const data = [
  {
    id: 1,
    name: "abc",
    title: "test1",
  },
  {
    id: 2,
    name: "def",
    title: "test2",
  },
];

테스트를 위한거라 2개 규모의 작은 데이터를 준비했으며, 해커톤 당시에는 20개 정도의 데이터를 사용했다.

데이터를 생성할 때 주의할 점은 id값을 꼭 넣어줘야 한다는 점.

 

이제 new 연산자를 이용해서 객체를 만들어야 한다.

let miniSearch = new MiniSearch({
  fields: ["name"],
  storeFields: ["id", "name", "title"],
});

fields는 내가 검색할 데이터 영역을 의미한다.

fields에 name을 넣어주면 위에서 생성한 테스트용 데이터에서 name 부분의 데이터만 검색하겠다는 의미다.

즉, 내가 abc라는 단어를 검색하면 name이 abc인 데이터가 검색된다.

 

다음으로 storeFileds는 검색된 결과에서 어떤 데이터를 반환할 지를 정해주는 영역이다.

name이 abc인 데이터를 검색하면, 결과 값으로 id와 name, title을 모두 반환하도록 설정했다.

만약 storedFeilds에서 name을 빼버리면 아래와 같이 id와 title만 검색결과로 보여준다.

이제 addAll 함수를 사용해서 어떤 데이터를 검색 대상으로 사용할지 지정해준다.

miniSearch.addAll(data);

우리가 아까 테스트용 데이터로 만들어준 data 변수를 검색 대상으로 지정해준다.

 

마지막으로 search 함수를 활용해서 검색을 수행하면 된다.

let results = miniSearch.search("abc");

검색 결과는 results 변수에 할당되며, abc라는 단어를 검색하도록 했다.

저기 "abc"부분을 수정하면 검색어를 변경할 수 있다.

 

나는 테스트를 위해 console.log로 results 변수에 담긴 데이터를 출력해보았다.

검색 결과는 위와 같이 출력되는데 score는 검색 결과가 검색어와 얼마나 일치하는지에 대한 점수이다.

결과 데이터가 여러개일 경우 score 순서로 데이터가 정렬된다.

위 이미지를 보면 검색어인 abc와 검색 결과로 표시하도록 지시한 id, name, title이 잘 표시된 것을 확인할 수 있다.

 

아래는 전체코드다.

MiniSearch의 깃허브 페이지를 보면 추가적인 사용방법 예제들이 존재한다.

const MiniSearch = require("minisearch");

const data = [
  {
    id: 1,
    name: "abc",
    title: "test1",
  },
  {
    id: 2,
    name: "def",
    title: "test2",
  },
];

let miniSearch = new MiniSearch({
  fields: ["name"],
  storeFields: ["id", "name", "title"],
});

miniSearch.addAll(data);

let results = miniSearch.search("abc");

console.log(results);
반응형