티스토리 뷰
이번 시간에는 검색 기능에 있어 고민을 가지고 해결 과정을 파헤쳐보겠습니다.
[떠리몰] 남성 플리스 기모 팬츠 (7,990원/무료배송) |
ORM 방식의 SQL을 통해 문자열 탐색에 있어 위 글자([떠리몰] 남성 플리스 기모 팬츠 (7,990원/무료배송))를 검색한다고 해보겠습니다.
Case 1 : Full-Name
[Model].where(title: "[떠리몰] 남성 플리스 기모 팬츠 (7,990원/무료배송)")
검색창에 "플리스[떠리몰] 남성 플리스 기모 팬츠 (7,990원/무료배송)" 라고 검색을 시도할 시 당연하게도 결과가 잘 나옵니다.
Case 2 : 일부 단어 탐색
[Model].where(title: "플리스")
검색창에 "플리스" 라고 검색을 시도해 본다면 검색 결과는 안나옵니다.
Case 3 : % 구문을 함께한 단어 탐색
[Model].where("title LIKE ?", "%플리스%")
SQL에 있어 where 안에 Query 단어와 함께 %를 넣으면 앞(뒤) 문자 내용에 상관없이 탐색결과를 볼 수 있게 됩니다.
저 같은 경우는 앞, 뒤 양측에 % 문자를 넣어서 탐색을 시도해보겠습니다.
하지만 이 방법도 완벽치 않은게, 만약 "%플리 스%" Query를 탐색 시, 결과가 안나옵니다.
Case 4 : 공백을 없앤다면?
Case 4에 가로막혀서 고민하던 찰나, 가만 생각해보니 '공백을 없앤다면?' 을 생각해봤습니다.
예를들어
- DB상에 저장되어 있는 데이터들은 띄어쓰기가 적용되어 있으나, 실제로 탐색을 할 땐 이 띄어쓰기를 다 없애고 검색을 합니다.
- Query 단어(검색 할 단어) 역시, 띄어쓰기를 넣었어도, 실제 내부적으로 검색을 할 땐 띄어쓰기가 없는 채로 탐색이 이루어 집니다.
그래가지고 알아본 결과, 저와 비슷한 사람이 은근 있더라고요.
그리고 해당 구문의 답을 찾게 되었습니다.
@word = "플리 스"
[Model].order("date DESC").where("replace([Column], ' ', '') like replace(?, ' ', '')", "%#{@word}%")
- DB 내 데이터는 "[떠리몰] 남성 플리스 기모 팬츠 (7,990원/무료배송)" 라고 되어있지만, 실제적으로 SQL 탐색이 이루어질 땐 "[떠리몰]남성플리스기모팬츠(7,990원/무료배송)" 으로 변형되어 탐색을 당합니다.
- @word 변수는 "플리 스" 라고 초기화를 했지만, 실제적으로 검색을 할 때는 띄어쓰기를 없앤 "플리스" 라는 단어를 탐색하게 됩니다.
SQL 쿼리문에서도 잘 보면 중간에 컬럼과 Query가 Replace가 되는걸 보실 수 있습니다.
그리고 띄어쓰기를 배제하고 검색하면 결과가 잘 나오는게 확인이 됩니다 :D
Case 5 : PostgreSQL 대/소문자 구분?
PostgreSQL DB 같은 경우 따로 문법을 따로 설정을 해주지 않으면 탐색을 못해내는 문제가 있습니다.
해당 문제에 대한 이슈는 https://kbs4674.tistory.com/91 게시글을 참고해주세요.
-
자료 참고
1. StackoverFlow [클릭]
'프로그래밍 공부 > Ruby on Rails : 이론' 카테고리의 다른 글
Ruby on Rails : Table JOIN (0) | 2020.01.31 |
---|---|
Ruby on Rails : 다른 AWS EC2 서버 내의 Database와 Remote Connect 하기 (0) | 2020.01.19 |
SQLite, PostgreSQL 차이 : Like / iLike (2) | 2019.12.13 |
Ruby on Rails : SQL N+1 맛보기 (4) | 2019.11.06 |
Ruby on Rails : SQL Performance의 고민 (서론) (0) | 2019.11.06 |