1. Mon programme original
En fait, mon programme original était assez simple, complètement modifié par rapport aux SearchFiles et IndexFiles de la démo. La seule différence était qu'il faisait référence au tokenizer SmartCN.
Je publierai le code qui a modifié ce point.
IndexhChinois.java :
Date de début = new Date();try { IndexWriterwriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); indexDocs(writer, docDir System.out); .println("Indexation vers le répertoire '" +INDEX_DIR+ "'..."); System.out.println("Optimisation...") //writer.optimize(); new Date(); System.out.println(end.getTime() - start.getTime() + " millisecondes totales" }
RechercheChinois.java
Analyseur analyseur = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = null;if (requêtes != null) { in = new BufferedReader(new FileReader(queries));} else { in = new BufferedReader(new InputStreamReader(System.in) , "GBK"));}
Ici, je précise que la requête d'entrée est codée en GBK.
Ensuite, je l'ai exécuté en toute confiance... et j'ai découvert que le chinois ne pouvait pas être récupéré et que la récupération de l'anglais à l'intérieur était normale.
2. Trouvez le problème.
Alors je suis devenu déprimé. Comme j'étais trop familier avec Java et Lucene, et qu'il n'y avait pas beaucoup de discussions en dehors de la version 3.0.0 que j'utilisais, j'ai bidouillé pendant un moment et j'ai découvert que je pouvais récupérer le fichier si je l'enregistrais. au format ansi. C'est en chinois (c'était UTF-8). Après quelques recherches, j'ai trouvé le code suivant dans indexChinese.java :
static void indexDocs (IndexWriterwriter, File file) throws IOException { // n'essayez pas d'indexer les fichiers qui ne peuvent pas être lus if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // une erreur d'E/S pourrait se produire if (files != null) { for (int i = 0; i < files.length; i++) { indexDocs(writer, new File(file, files[i])) ; } } } else { System.out.println("adding " + file); try {writer.addDocument(FileDocument.Document(file) } // au moins sous Windows, certains fichiers temporaires déclenchent cette exception avec un " message "accès refusé" // vérifier si le fichier peut être lu n'aide pas à intercepter (FileNotFoundException fnfe) { ; } } }
Le point clé est cette phrase :
essayez {writer.addDocument(FileDocument.Document(file));}
Le code de lecture du fichier devrait être ici, tracez-le :
public static Document Document(File f) throws java.io.FileNotFoundException, UnsupportedEncodingException { Document doc = new Document(); doc.add(new Field("path", f.getPath(), Field.Store.YES, Field. Index.NOT_ANALYZED)); doc.add(new Field("modified", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); add(new Field("contents", FileReader(f))); // renvoie le document return doc;} private FileDocument() {}}
Il s'agit d'une classe interne de Lucene. Sa fonction est d'obtenir le contenu d'un fichier texte. Le document généré a trois champs par défaut : chemin, modifié, contenu et le contenu est le contenu texte du fichier. f), Il y avait un problème avec cette fonction. Il n'y avait pas d'encodage spécifié à utiliser pour la lecture, je l'ai donc simplement modifié ici.
FileInputStream fis=new FileInputStream(f);//Convertir le flux d'octets en flux de caractères selon le codage UTF-8. InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//Obtenir le texte du flux de caractères et le mettre en mémoire tampon BufferedReader br=nouveau BufferedReader(isr); doc.add(new Field("contents", br));
Quant à "Unicode", il peut être remplacé par tous les encodages pris en charge. Lorsque je l'ai remplacé par "utf-8", il peut être utilisé normalement.
3. Quelques suppositions :
Lors de l'indexation de fichiers dans Lucene, l'encodage n'a pas d'importance tant qu'il est spécifié correctement, les fichiers de sortie peuvent être récupérés normalement. En d'autres termes, les résultats après indexation de différents fichiers d'encodage sont les mêmes (vérification).