특정 문장의 색인을 생성해야하는 응용 프로그램을 작성 중입니다. 현재 Java 및 PostgreSQL을 사용 중입니다. 문장은 악센트와 다른 비 ASCII 기호를 사용하여 프랑스어 및 스페인어와 같은 여러 언어로 표시 될 수 있습니다.색인 생성을 위해 문자열을 ASCII 7 문자로 줄이는 방법은 무엇입니까?
각 단어에 대해 사용자가 악센트 (음역)에 민감하지 않은 검색을 수행 할 수 있도록 색인 가능 항목을 만들고 싶습니다. 예를 들어, 사용자가 "nacion"을 검색하면 응용 프로그램에 저장된 원래 단어가 "Naci ó n"이더라도 찾아야합니다.
가장 좋은 전략은 무엇일까요? 필자는 반드시 PostgreSQL에만 국한되지는 않으며 내부 색인 값도 원래 단어와 유사해야합니다. 이상적으로는 유니 코드 문자열을 대/소문자 구분없이 ASCII 문자열로 변환하는 일반적인 솔루션이어야합니다.
지금까지 색인 된 값을 저장하기 전에 일부 문자를 ASCII로 대체 한 다음 쿼리 문자열에서 동일하게 수행하는 사용자 정의 함수를 사용하고 있습니다.
public String toIndexableASCII (String sStrIn) {
if (sStrIn==null) return null;
int iLen = sStrIn.length();
if (iLen==0) return sStrIn;
StringBuilder sStrBuff = new StringBuilder(iLen);
String sStr = sStrIn.toUpperCase();
for (int c=0; c<iLen; c++) {
switch (sStr.charAt(c)) {
case 'Á':
case 'À':
case 'Ä':
case 'Â':
case 'Å':
case 'Ã':
sStrBuff.append('A');
break;
case 'É':
case 'È':
case 'Ë':
case 'Ê':
sStrBuff.append('E');
break;
case 'Í':
case 'Ì':
case 'Ï':
case 'Î':
sStrBuff.append('I');
break;
case 'Ó':
case 'Ò':
case 'Ö':
case 'Ô':
case 'Ø':
sStrBuff.append('O');
break;
case 'Ú':
case 'Ù':
case 'Ü':
case 'Û':
sStrBuff.append('U');
break;
case 'Æ':
sStrBuff.append('E');
break;
case 'Ñ':
sStrBuff.append('N');
break;
case 'Ç':
sStrBuff.append('C');
break;
case 'ß':
sStrBuff.append('B');
break;
case (char)255:
sStrBuff.append('_');
break;
default:
sStrBuff.append(sStr.charAt(c));
}
}
return sStrBuff.toString();
}
ASCII 7로 바이트를 해석하면 달성하려는 "정보 손실"을 제공하지 않습니다. "coraçón"이 "coracon"과 같아서 검색 할 때 사용자가 액센트를 넣었는지 여부는 중요하지 않습니다. Google과 같은 맞춤법 검사 나 근접 검사가 필요하지 않습니다. "그게 ...?" 하지만 "é"== "e"가 필요합니다. –
요청한 매핑을 "음역"이라고합니다. –
감사합니다. 나는 음역을 추가하는 질문을 편집했고, Google에 도움이되었다. –