차근차근/Spring

MySQL FULLTEXT 검색

예쁜꽃이피었으면 2020. 2. 18. 01:37

FULLTEXT 을 사용한 이유

row1 | [java,linux,database,ajax,r,sql,reactjs] (순서없음)
row2 | [java,javascript,django,c#,c++,database,ajax,r,sql,reactjs] (순서없음)
row3 | [c] (순서없음)
row4 | [c++] (순서없음)
 
검색어 [java , c , c++]  ( 순서 없음 , 개수 정해지지 않음 , list로 vue에서 보냄 )이게 모두 포함된 row를 모두 찾기

 

검색어가 몇개가 될지 모르는 상황에서 검색어를 ,(콤마)로 구분하여 하나씩 for문을 돌리는 것 보다 다른 방법을 찾아야 겠다고 생각함.

검색의 조건이 텍스트 포함 여부만 있는 것이 아니라

기간 검색 , 여러 칼럼에 대한 텍스트 검색이 함께 있어서 시간을 줄일 필요가 있었음.. 


 

1. 데이터 베이스 수정 -> index 생김

ALTER TABLE 프로젝트명 ADD FULLTEXT(컬럼명);

-

인덱스 안주면 에러남

Error Code: 1191. Can't find FULLTEXT index matching the column list     0.000 sec

 

2. 테이블형식은 MyISAM 이어야 한다는데

나는 그대로 InnoDB로 둬도 잘 된다. ( + charset은 utf8 )

 

3. 다행히 검색어에 한글이 없는데 한글이 있으면 다른 설정이 필요한 것 같다.

 

4. 특수문자는 검색되지 않는다. / 검색어가 3자이상이어야..검색이 되는 것 같다.

-> 데이터베이스에 검색에 필요한 컬럼을 저장할 때 특수문자를 치환해서 저장하고 (c++  ->  cplusplus )

검색시에 특수문자를 치환해서 검색한다.  (c++  ->  cplusplus)

검색결과를 원래 데이터를 치환해서 return한다.  (cplusplus -> c++)

 

 

if( project.getProject_dev_setting() != null || project.getProject_dev_setting() != "" ) {
String tempdev_setting = project.getProject_dev_setting();
tempdev_setting = tempdev_setting.replaceAll("[+][+]","plusplus");
tempdev_setting = tempdev_setting.replaceAll("[#]","shop");
tempdev_setting = tempdev_setting.replaceAll("c","ccccc");
tempdev_setting = tempdev_setting.replaceAll("r","rrrrr");

String tempdev_setting2 = tempdev_setting.substring(1, tempdev_setting.length() - 1);  //리스트로 받기 때문에 양쪽의 대괄호 삭제
String tempdev_settingArray = "+"+tempdev_setting2.replaceAll(",", "+");  //가장 앞의 단어에 + 붙임
project.setProject_dev_setting(tempdev_settingArray);
}

List projectResult = new ArrayList();
projectResult = portfolioService.projectSearch(project);  //projectSearch 여기 쿼리문에서 where절에 select문을 쓰는 다중쿼리로 작성했는데 서브쿼리의 검색결과가 여러개라 IN으로 처리했다.
System.out.println("projectResult.size() :"+ projectResult.size());
for (int i = 0; i < projectResult.size(); i++) {
Project project2 = projectResult.get(i);

String tempdev_setting = projectResult.get(i).getProject_dev_setting();
tempdev_setting = tempdev_setting.replaceAll("plusplus", "++");
tempdev_setting = tempdev_setting.replaceAll("shop", "#");
tempdev_setting = tempdev_setting.replaceAll("ccccc", "c");
tempdev_setting = tempdev_setting.replaceAll("rrrrr", "r");

project2.setProject_dev_setting(tempdev_setting);  //치환한 데이터 리턴값에 집어 넣기

}

 

더보기

 

 

반응형