2017-01-05 3 views
0

Ich versuche, eine Möglichkeit zu finden, Benutzer Suchanfragen mit einer Datenbank Datensätze in einer Suchmaschine mit Spring, aber ich habe Probleme, wenn die Suchabfrage enthält spezielle Zeichen wie Vokale mit Akzent.Übereinstimmungszeichenfolge mit normalen Zeichen und Sonderzeichen im Frühjahr

ZB: suche query = 'cafe'. Datenbank Datensatz = 'Café'

Ich verwende den Stamm der Wörter zur Abfrage mit den Datenbankeinträgen.

Was wäre die einfachste Art, die Abfrage mit einem Sonderzeichen "café" mit der Zeichenfolge zu verknüpfen, die dieses Sonderzeichen "cafe" nicht enthält, und umgekehrt?

UPDATE

die Informationen, die ich zwischengespeichert Alle muß bereits so den Ansatz eine neue Spalte in der db-Erstellung nicht so attraktiv ist. Ich suche nach einer Lösung, die mehr auf dem Frühling basiert.

+0

nicht sicher, welche DB Sie verwenden, aber MySQL Unterstützung Regex. siehe http://dev.mysql.com/doc/refman/5.7/en/regexp.html –

+0

Was "Suchmaschine"? – Andreas

+0

http://stackoverflow.com/questions/8359595/the-most-efficient-way-to-implement-a-phonetic-search Bitte überprüfen –

Antwort

5

Sie könnten java.text.Normalizer, wie Follow verwenden:

import java.text.Normalizer; 
import java.text.Normalizer.Form; 

public static String removeAccents(String text) { 
    return text == null ? null : 
     Normalizer.normalize(text, Form.NFD) 
      .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
} 

Die Normalizer teilt die ursprünglichen Zeichen in einem Satz von zwei Zeichen (Buchstaben und Akzent). Zum Beispiel das Zeichen (U + 00E1) in a (U + 0061) und acute accent U + 0301

Der \p{InCombiningDiacriticalMarks}+ regulären Ausdruck alle solche diakritischen Codes übereinstimmen aufgeteilt werden und wir werden sie mit einem leeren String ersetzen.

Und Ihre query könnte so sein:

SQL SERVER

SELECT * FROM Table 
WHERE Column Like '%stringwithoutaccents%' COLLATE Latin1_general_CI_AI 

ORACLE (von 10g)

SELECT * FROM Table 
WHERE NLSSORT(Column, 'NLS_SORT = Latin_AI') 
Like NLSSORT('%stringwithoutaccents%', 'NLS_SORT = Latin_AI') 

Der CI steht für "Case Insensitive" und AI für „Accent Unempfindlich ".

Ich hoffe, dass es Ihnen hilft.

Verwandte Themen