Question

Dans mon application Web, j'utilise deux différentes langues à savoir Anglais et arabe.

j'ai un Barre de recherche dans mon application Web dans laquelle si nous recherchons par nom ou partie du nom, il récupérera les valeurs de la base de données en comparant les "Ville natale" de l'utilisateur

Explication:

Comme si un utilisateur appartient à ville natale "Californie" et il cherche un nom dire "Victor" alors ma requête verra d'abord les personnes qui ont le même ville natale "Californie" et dans la liste des personnes qui ont "Californie" comme ville natale le "Victor" *nom* sera recherché et il récupérer les utilisateurs ayant "Californie" comme leur ville natale et "Victor" en leur nom ou une partie du nom.

Le problème c'est si la ville natale "Californie" est enregistré dans Anglais il comparera et récupérera les valeurs.Mais "Californie" sera enregistré sous "كاليفورنيا" en arabe.Dans ce cas le la comparaison de la ville natale échoue et il ne peut pas récupérer les valeurs.

Je souhaite que ma requête trouve que les deux sont la même ville natale et récupère les valeurs.Est-il possible?

Quoi alterner Je devrais penser à cette logique de comparaison.Je suis confus.Une suggestion s'il vous plaît ?

MODIFIER: *J'ai une idée telle que si le ville natale Il est alors possible d'utiliser un traducteur ou un translittérateur Google et de changer la ville natale dans une autre langue.si c'est en anglais alors en arabe ou si c'est en anglais alors en arabe et donnez les résultats de la recherche joignant les deux.Toute suggestion?*

Était-ce utile?

La solution

Transliterate tous les noms dans la même langue (par exemple anglais) pour la recherche et l'utilisation Levenstein distance d'édition pour calculer la similarité entre les représentations phonétiques des noms. Ce sera lent si vous comparez simplement votre requête avec tous les noms, mais si vous pré-indexer tous les noms de lieux dans votre base de données en Burkhard-Keller arbre , alors ils peuvent être efficacement recherché par la distance d'édition du terme de requête.

Cette technique vous permet de trier les noms par la proximité qu'ils correspondent réellement. Vous êtes sans doute trouver plus de chances d'un match de cette façon que d'utiliser metaphone ou double-metaphone, bien que cela est plus difficile à mettre en œuvre.

Autres conseils

Le problème que vous rencontrez est que vous voulez des informations / besoin en 2 langues ou plus et que vous voulez être en mesure d'utiliser les deux langues à l'utilisateur de votre application. Une approche possible est de conserver plusieurs dossiers par article et comprenant un code de langue dans le cadre de la clé primaire, par exemple, si votre dossier est

id   hometown   name
001  California Victor

vous pouvez introduire un code de langue et de stocker

id   lang hometown   name
001  en   California Victor
001  ar   كاليفورنيا Victor

alors votre recherche ne correspond soit « California » ou « كاليفورنيا » vous donnant l'id 001, que vous pouvez ensuite utiliser pour charger toutes les traductions de vos données (ou simplement les données dans la langue de sortie actuelle.) Cette sceme peut être utilisé avec un certain nombre de langues et a l'avantage supplémentaire que vous ne avez pas besoin de pré-remplir la table. Vous pouvez ajouter de nouvelles traductions des documents quand ils sont connus.

(caveat. Je viens de répéter votre chaîne arabe, je ne peux pas le lire, aussi « ar » le plus probable est pas le code de langue approprié pour aribic mais vous voyez l'idée)

Est-ce que l'arabe son comme "California"? Si oui, vous aurez besoin de comparer sur un « sons-like » -basis ce qui entraînera probablement une conversion de phonème.

Vos sons de suggestion de Google comme il pourrait aussi être un bon, mais vous devriez jouer avec elle, et assurez-vous que vous êtes satisfait de son exactitude. En testant la façon dont il a travaillé en cours entre l'hébreu et l'anglais, j'ai remarqué que, parfois, Google laisse simplement les noms de lieux anglais en lettres anglaises lors de la traduction à l'hébreu.

Que diriez-vous d'utiliser une localisation sur le côté client aux valeurs d'affichage. Ou créer une classe wrapper pour ville natale qui remplacera equal(Object) de la manière l'instance pour la Californie retournera true pour les deux « California » et « كاليفورنيا » (désolé si je faisais erreur ici, il suffit de copier-collé à partir ci-dessus).

Cela ressemble à un problème d'encodage classique.Chaque fois que vous transférez un caractère non-ASCII, vous devez vous assurer que vous l'encodez correctement.Pour l'arabe et l'anglais, je pense que vous pouvez utiliser UTF-8 (mais je ne connais pas l'arabe, donc c'est peut-être faux).

Dans votre configuration, vous aurez probablement les points suivants :

Browser <-> Servlet container <-> Database
                   |
                System.out

Dans toutes les interfaces système où les caractères (16 bits) sont convertis en octets (8 bits), vous devrez vous assurer que le codage est correct.

Navigateur vers conteneur de servlet

Lorsque vous effectuez des requêtes GET ou POST à ​​partir d'une page Web, le navigateur examinera 1) Les en-têtes HTTP du serveur, en particulier les Content-Type: text/html; charset=UTF-8, qui, s'il est présent, remplacera le méta-en-tête HTML <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

Du côté du conteneur de servlets, HttpServletRequest.getParameter() aura un encodage que vous devrez probablement définir dans les paramètres du serveur.

Exemple de serveur.xml de Tomcat

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           maxThreads="2000"                
           connectionTimeout="20000" 
           redirectPort="8443" />

Conteneur de servlet vers la base de données

La base de données doit avoir les encodages corrects, sinon le tri, etc. ne sera pas correct.

Exemple my.cnf pour MySQL

[mysqld] 
 ....
init_connect=''SET collation_connection = utf8_general_ci'' 
init_connect='SET NAMES utf8' 
default-character-set=utf8 
character-set-server = utf8 
collation-server = utf8_general_ci 

[mysql] 
 ....
default-character-set=utf8 

Ensuite, le pilote JDBC doit être défini pour UTF-8.

Exemple de chaîne de connexion JDBC

jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8

Système.out

System.out.printnln() on ne peut pas compter sur cela pour vérifier les choses.Cela dépend d’abord de l’encodage par défaut de Java vm, défini à l’aide de System.property -Dfile.encoding=UTF-8, deuxièmement, le terminal dans lequel vous effectuez le System.out devra être configuré et prendre en charge UTF-8.Ne faites pas confiance à System.out !

Une fois qu'une chaîne dans la VM est un caractère approprié, elle ne sera pas affectée par l'encodage.En mémoire, chaque caractère d'une chaîne est de 16 bits, ce qui couvre (presque) tous les caractères que utf-8 peut encoder.Vous pouvez écrire la chaîne dans un fichier et examiner le fichier pour vraiment savoir si vous avez les caractères corrects dans votre VM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top