티스토리 뷰
DB에서 초성 조회 관련 검색을 하면 가장 좋은 방법은 초성을 분리하여 따로 작성해두고 그 테이블 또는 필드만 검색을 하는게 가장 좋다고 한다.
레코드를 생성할때 부터 초성을 분리하여 생성해두는게...
당장 그럴수 없기에 강제로 조회하는 방법 중 가장 빠르게 떠오르는 방법은 아래 2가지 이다..
1. 검색해야하는 테이블에서 해당 필드의 모든 값을 가져와서 초성만 분리하여 비교하거나,
2. 각초성을 포함한 범위의 글자 사이인지를 조회한다. 등등...
이중 2번 방법을 사용한다면 아래 조건을 신경쓰면 된다.
1. if문 또는 switch 등르로 각 초성일때를 판단하여 분기한다.
2. 만약 'ㄱ'이라면 찾고자 하는 위치가 '가' 부터 '깋' 까지의 글자인지 조회하는 쿼리를 추가한다.
3. 쌍자음의 경우 단음에 포함하여 검색 할것인지 분리할것인지를 결정한다.
이 경우에 대한 PHP sample은 이렇다.
if($find_word == 'ㄱ') //찾는게 'ㄱ'이라면
$qry .= " substr(text,1,1) between '가' and '깋'"; // 레코드 중 text 필드의 1번째 1개의 글자가 범위인지
쿼리를 이용하면된다. 초성만큼 분기하여 상황에 따른 글자값을 넣어서....
단점 1은 비교 위치가 지정되기에 다른 위치부터 시작하는 단어는 검색하지 못한다.
예로 위 쿼리로 "가을"은 검색할 수 있으나, "학교"는 검색할수 없다. "학교"는 두번째 글자가 'ㄱ'의 범위이기 때문이다.
단점 2는 공백에 대한 처리도 고려해야 한다.
"ㄱㅇ ㄴㄹ"를 검색한다고 할때 "가을 노래"는 검색되지만 "가을노래"는 검색되지 않는다. 당연히 "가을 노래"처럼 공백이 2개 있는경우도 검색되지 않든다. replace함수를 이용하여 검색어와 DB의 공백을 제거하는 식으로 우회는 가능하지만 정확도가 떨어지니 상황에 맞게 결정 해야 한다.
단점 3은 쿼리에서 자주 사용하는 %를 활용한 조회가 힘들다.
예로 "%가"는 가로 끝나는 모든 값을 가져올수 있으나 위 방식은 가능하지만 힘들다.
각 레코드의 검색어 필드의 문자열를 가져와서 길이를 계산하고 마지막 위치를 지정한 뒤에 그 글자가 'ㄱ' 범위인지를 확인해야 하기 때문이다.
아니면 첫번째 자리가 'ㄱ' 범위 이거나 두번째 자리가 'ㄱ'이거나 식으로 입력 가능한 길이에 대한 모든 범위를 조회해야 하기에 아주 비효율 적이다.
DB환경에 따라 선택의 고민이 필요하다.... 초성을 분리하여 저장 할것인지.... between으로 범위 검색을 할것인지....
'개발(SW)' 카테고리의 다른 글
DB의 시간 자동 삽입 - TimeStamp (0) | 2022.01.17 |
---|---|
FTP 없이 리눅스 서버의 파일을 받아야 하는 경우 (0) | 2022.01.06 |
PHP 한글 초성 확인 (0) | 2021.12.29 |
php mysql에서 count 오류 관련 (0) | 2021.11.17 |
OAuth2.0에서 토큰의 유효성 검사시 ID리턴 (0) | 2021.10.08 |
- Total
- Today
- Yesterday
- 크레인
- 포르쉐
- 운반트럭
- 크롤러
- 초성검색
- 테크닉
- 42098
- 42009
- 8109
- php
- 스마트싱스
- Windows
- 911
- 스챔
- MySQL
- 75893
- 스피드챔피언
- 70804
- 42096
- Lego
- 31088
- putty
- 하트레이크
- 레고
- DB
- 페라리
- 31073
- oauth2.0
- 42064
- 아이스크림
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |