Ver1.

  async searchHumorBoard(searchQueryDto: SearchQueryDto) {
    const boolQuery = {
      bool: {
        should: [],
        minimum_should_match: 1,
      },
    };

    //만약 title쿼리값이 있을 경우,
    if (searchQueryDto.titleQuery) {
      boolQuery.bool.should.push({
        match: { title: searchQueryDto.titleQuery },
      });
    }
    //만약 content 쿼리값이 있을 경우,
    if (searchQueryDto.contentQuery) {
      boolQuery.bool.should.push({
        match: { content: searchQueryDto.contentQuery },
      });
    }

    const data = await this.esService.search({
      index: searchQueryDto.boardName,
      body: {
        query: boolQuery,
        sort: [
          {
            updated_at: {
              order: 'desc',
            },
          },
        ],
      },
    });

    // 검색 결과에서 문서들의 배열을 추출
    const hits = data.body.hits.hits;

    // 각 검색 결과 문서(_source)를 결과 배열에 저장
    let result = hits.map((hit) => hit._source);

    return result; // 검색 결과 반환
  }

제목, 내용, 제목+내용 별로 검색할 수 있게끔 코드를 구성했음

fffghhhj.PNG

불과 8개의 데이터만 찾아오는데도 불구하고, 모든 데이터를 다 조회해서 그런지 1153ms나 걸림

이때 총 데이터는 약 800개

데이터를 50000개 추가해서 한번더 해볼 예정

문제 1 : 한글이라서 오래 걸리는가?

약 데이터를 80000개정도 추가하고, 영어로 된 데이터를 검색해봤다.

htyjtuy.PNG

hit count가 680개인데 불과 15ms밖에 안걸렸다.. 아무래도 한글이라서 오래 걸리는거라고 생각된다.

가설 1 : 한글의 특수성때문에 오래걸린다

영어는 주로 구두점, 공백을 통해 토큰화가 진행되기 때문에, 검색어를 토큰화하는데 있어서 매우 짧은 시간이 걸린다. 하지만 한글같은 경우에는 구두점, 공백 뿐 아니라 어근, 어미의 분리를 통한 토큰화가 진행되기 때문에 많은 시간이 걸릴 수 밖에 없다.

문제2 : 왜 데이터 수의 차이에 영향받지 않는가?

난 80000개의 데이터를 더 넣고 검색했는데, 동일하게 한글로 검색했을때 둘다 800 ~ 1000ms 밖에 걸리지 않았다.

영어로 된 데이터를 집어넣었다고 하더라도 왜 검색속도에 차이가 없는건가?