개인 블로그 이전하였습니다! https://mobilog.me 아무데나 클릭하면 닫힙니다.
엘라스틱 서치 데이터 node.js 에서 사용하기
//엘라스틱 서치 client 설정 elasticsearch.ts

import ElasticSearch from 'elasticsearch';

var ElasticClient = new ElasticSearch.Client({
  host: config.ELASTIC_HOST,
  log: 'trace',
});

export default ElasticClient;
//엘라스틱 서치 검색 예시
type IElasticData = {
  id: number;
  price: number;
  title: string;
  updatedat: number;
};

// 검색하는 방법
  async searchProductTitle(searchText: string) {
    const response = await ElasticClient.search<IElasticData>({
      index: 'store10',
      size: 15,
      body: {
        query: {
          match: {
            title: searchText,
          },
        },
      },
    });
    //실 데이터는 hits안의 hits명칭으로 배열로 저장된다. 
    //각각의 row부분에서 _source가 실제 데이터가 있는 곳임.
    const data = response.hits.hits.map((row) => {
      return {
        id: row._source.id,
        price: row._source.price,
        title: row._source.title,
      };
    });

자 이제 위 searchProductTitle 함수를 input이 바뀔때마다 매번 호출해주면 된다.
mysql에서 like로 했을때에 비해 최소 10~20배는 빠르게 조회되는 것 같다.


데이터가 적어서 많이 차이는 안나는 것같지만 평균적으로 mysql에서 검색시 20ms ~ 50ms 정도가 나오는데

데이터가 더 많아지면 더 오래걸릴듯 하다. (title에 인덱스가 잡혀있는것이 아니기때문에 ...)

그에 비해 엘라스틱 서치의경우 보통 10ms 밑의 수준으로만 나온다 20ms는 잘 보이지 않는다.

 

우선 기본적인 검색엔진은 완성되었다 !
하지만 추가적으로 자소 분리, 자음검색, 모음검색 등은 되지 않고있기도 하다..

 

nori 플러그인을 쓴다면 데이터가 삼겹살과 소주가 먹고싶다
일때 '삼, 삼겹살, 삼겹살과, 과, 소주, 소주가, 가, 먹고, 싶다'
위와 같이 데이터가 토큰화 되는데 '삼'을 검색시 자동 완성되서 데이터가 나타난다.
하지만 '삼ㄱ'을 검색하면 토큰내부에 일치하는 것이 없어 데이터를 가져오지 않는 현상이 발생한다.

 

이런 것 때문에 실제 검색엔진과는 다른점이 있고
이부분을 해결하기위해 자소 분리등을 찾아보았지만....


예전버전을 지원한다던지 자바코드를 짜야되거나 jar변환을 해서 사용해야한다...

자바에는 진짜 암것도 모르는 수준이라.........

방안을 찾아봐야겟다..