[Algolia] infix/suffix 검색 설정하기

2024. 2. 16. 21:22API,SDK

728x90

이번 포스트에서는 알고리아에서 infix/suffix 검색을 설정하는 방법에 대해 알아보도록 하겠습니다.

파이어베이스와 알고리아 연동 및 사용방법은 이전 포스트를 참고해 주시길 바랍니다.

 

 

[Firebase 웹] 파이어스토어 검색 기능 구현하기(feat. 쿼리문 & Algolia)

이번 포스트에서는 파이어베이스에서 검색을 구현하는 방법에 대해 알아보도록 하겠습니다. 일단 가장 중요한 부분을 짚고 넘어가자면, 현재 파이어스토어에서는 문서의 전체 텍스트 검색을

mingeesuh.tistory.com

 

 

공식문서에 따르면 알고리아에서 infix/suffix 검색을 자체적으로 지원하지는 않습니다.

이는 설계상 의도된 것으로 가장 빠르게 가장 적합한 검색 결과를 보여주기 위함이라고 합니다.

 

예를 들어, 핸드폰 번호가 01012345678이라고 가정을 해보겠습니다. 알고리아는 설계상 prefix 검색만 지원하기 때문에 010123으로는 검색이 가능하지만 중간 번호인 1234 또는 끝번호인 1077을 통해 검색을 하면 제대로 검색이 되지 않습니다. 물론 중간에 스페이스나 특수문자 등이 섞여있다면 얘기가 달라집니다. 만약 번호를 010-1234-5678 같은 형식으로 저장을 했을 경우 알고리아가 이를 자동으로 토큰화시킬 수 있기 때문에 1234라고 검색해도 제대로 검색이 되는 걸 확인할 수 있습니다. 하지만  시리얼 넘버 라던지 위와 같이 핸드폰 번호를 특수문자 없이 저장하는 경우에는 원하는 대로 검색이 되지 않습니다.

 


해결방안

 

위에 이미 언급했듯이 해결방안은 크게 두 가지가 있습니다.

1. 검색을 원하는 필드의 값을 처음부터 띄어쓰거나 특수문자를 섞어서 알고리아가 자동으로 토큰화할 수 있도록 설정  ex) 010-1234-5678

2. 검색용으로 사용할 필드를 따로 만들어주기 

 

 

필자는 기존 필드의 저장 형식을 바꾸는 방법보다는 algolia 공식문서에서도 추천하는 검색용으로 사용할 필드를 따로 만들어주는 두 번째 방법을 채택했습니다.

 

고객의 정보를 휴대폰 번호 중간번호든 뒷자리든 바로 검색이 가능하도록 하기 위해 phone_suffixes라는 배열을 추가로 생성해 알고리아에 인덱스에 저장해주는 예제입니다. 

 

// 파이어스토에 문서생성시 알고리아에 인덱스 생성

      const user = {
        ...change.after.data(), // 사용자 데이터
        objectID: uid,
        phone_suffixes: []

      let phoneNumber = change.after.data()?.phoneNumber;
      
      while (phoneNumber > 1) {
        phoneNumber = phoneNumber.substr(1);
        user.phone_suffixes.push(phoneNumber);
      }

      // 추가시
      if (!change.before.exists) {
        return userIndex.saveObject({
          ...user,
          createdAt: Date.now(),
        });
      }

 

이런 식으로 저장해 주면 알고리아에서는 아래와 같이 저장된 걸 확인할 수 있습니다.

 

이제 Algolia console에서 Configuration -> Searchable attributes -> 검색 허용가능 하게할 필드 (phone_suffixes)를 추가해주시면 됩니다. 또는 아래와 같이 설정 후 사용하시면 됩니다.

 

index.setSettings({
  searchableAttributes: [
    "phoneNumber",
    "phone_suffixes"
  ]
}).then(() => {
  // 완료
});

 

 

phoneNumber가 phone_suffixes 먼저 오도록 설정해 두셔야 전체 일치가 우선순위로 오기 때문에 이점 유의 해주시면 됩니다.

더 정확한 검색결과를 위해서는 검색용으로 생성한 필드는 type tolerance를 꺼주시는게 좋습니다.

이를 꺼주지 않으면 사용자 데이터가 많아 질수록 비슷한 조합의 숫자가 많아짐으로 인해 검색결과가 부정확해질 수 있기 때문입니다. 

 

index.setSettings({
  searchableAttributes: [
    "phoneNumber",
    "phone_suffixes"
  ],
  disableTypoToleranceOnAttributes: ['phone_suffixes']
}).then(() => {
  // 완료
});

 

 

이로써 알고리아에서 infix/suffix 검색을 설정하는 방법에 대해 알아보았습니다.

 

위 예제와 같이 연락처로 검색하는 경우가 많을 경우 해당 대안은 매우 유용할 수 있지만 무분별하게 검색용 배열을 생성할 경우 퍼포먼스에 영향을 줄 수 있기 때문에 신중하게 고려한뒤 사용하시면 되겠습니다. 해당 검색용 배열이 필요한지에 대한 여부는 알고리아 analytics를 사용해 사용자가 어떤 검색어를 자주 쓰고 결과가 제대로 전달되는지 우선적으로 확인해보고 적용하시는걸 추천드립니다.