예전에 mysql을 많이 썼는데 최근에 앱,웹앱 만든다고 nosql firestore를 사용하고 있다
그런데 파이어스토어는 %검색어 같은 like query가 안된다!
그야말로 firestore는 특정 용도의 앱 개발할때만 사용하는 것이 옳고 텍스트를 다룬다면 자매품인 실시간데이터베이스를 사용해야 한다
like 검색이 안된다는 것은 제목이 ABCDE로 저장되었을때 ABC로 검색을 하면 찾지 못한다는 것이다. 그래서 firestore는 where() filter에 arraycontains 기능을 제공하는데 이게 contain이 들어갔다고 해서 ABCDE가 ABC를 contain하고 있으므로 찾아준다고 생각하면 안된다. 제목 필드를 그냥 String이 아니라 Array로 만들어서 공백문자를 기준으로 문장을 단어로 나눠서 List<String> Array로 만들어서 넣고 filter로 입력된 단어와 정확하게 일치할때만 찾아준다는 것이다. 구글 파이어스토어팀의 contain이란 용어에 속아서 한참 헤맸다
어쨋든 제목으로 apples가 저장되어 있다면 apple을 입력했을때 검색이 안된다는 것이다. 알파벳은 그나마 낫다 한글은 조사/어미 때문에 훨씬 더 문제가 까다롭다. 한글 제목입력시 http, python 백앤드 서버를 따로 돌리고 한글 형태소 분석 및 분리 머신러닝 모델인 koNLPy로 전처리하여 조사, 어미를 제외한 명사, 형용사, 부사, 동사만 따와서 Array로 가져와 제목 필드에 저장할 수 있다. 빨간사과로 입력하면 빨간, 사과로 분리시켜 저장하므로 사과로 검색해도 찾아준다
데이터량이 크지 않다면 그냥 컬렉션의 모든 문서를 다 받아서 프론트엔드에서 검색 필터로 문서를 골라내는 방법도 있다
가장 좋은 것은 설계단계부터 텍스트를 처리할 일이 있으면 nosql이나 firestore를 쓰지 말고 mysql, mariaDB 같은 RDBMS를 사용하는 것이다
'drqr 닥터큐알 - 고객에게 QR코드로 웹페이지의 정보를 전달하세요' 7일동안 만들면서 고민한 것 정리
댓글 0