티스토리 뷰

프로그래밍 공부/Ruby on Rails : 이론

검색 기능 구현의 고민 : 공백처리

마음 따뜻한 개발자, 나른한 하루 2019. 12. 14. 00:24

이번 시간에는 검색 기능에 있어 고민을 가지고 해결 과정을 파헤쳐보겠습니다.

 

     [떠리몰] 남성 플리스 기모 팬츠 (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 [클릭]

댓글
댓글쓰기 폼
공지사항
Total
37,626
Today
18
Yesterday
231
링크
«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함