1. Mi programa original
De hecho, mi programa original era bastante simple, completamente modificado a partir de SearchFiles e IndexFiles en la demostración. La única diferencia era que hacía referencia al tokenizador SmartCN.
Publicaré el código que modificó ese punto.
IndexhChinese.java:
Fecha de inicio = nueva Fecha(); intente { IndexWriter escritor = nuevo IndexWriter(FSDirectory.open(INDEX_DIR), nuevo SmartChineseAnalyzer(Version.LUCENE_CURRENT), verdadero, IndexWriter.MaxFieldLength.LIMITED(escritor, docDir); .println("Indexando al directorio '" +INDEX_DIR+ "'..."); System.out.println("Optimizando..."); //writer.optimize() Writer.close(); nueva Fecha(); System.out.println(end.getTime() - start.getTime() + " milisegundos totales ");
BuscarChino.java
Analizador analizador = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = null;if (consultas! = null) { in = new BufferedReader(new FileReader(consultas));} else { in = new BufferedReader(new InputStreamReader(System.in) , "GBK"));}
Aquí, especifico que la consulta de entrada está codificada en GBK.
Luego lo ejecuté con confianza... y descubrí que no se podía recuperar el chino y que la recuperación del inglés en el interior era normal.
2. Encuentra el problema.
Entonces me deprimí. Como estaba demasiado familiarizado con Java y Lucene, y no había muchas discusiones fuera de la versión 3.0.0 que estaba usando, estuve jugueteando un rato y descubrí que podía recuperar el archivo si lo guardaba. en formato ansi. Está en chino (solía ser UTF-8). Parece ser un problema de codificación de archivos. Después de buscar un poco, encontré el siguiente código en indexChinese.java.
static void indexDocs(IndexWriter escritor, archivo de archivo) lanza IOException { // no intente indexar archivos que no se pueden leer if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // podría ocurrir un error de IO 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)} // al menos en Windows, algunos archivos temporales generan esta excepción con un " mensaje "acceso denegado" // comprobar si el archivo se puede leer no ayuda a detectar (FileNotFoundException fnfe) { ; } } }
El punto clave es esta frase:
intente { escritor.addDocument(FileDocument.Document(archivo));}
El código para leer el archivo debería estar aquí, rastrealo:
Documento estático público (Archivo f) lanza java.io.FileNotFoundException, UnsupportedEncodingException { Documento doc = new Document(); new Field("path", f.getPath(), Field.Store.YES, Field. Index.NOT_ANALYZED)); doc.add(new Field("modificado", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); add(new Field("contents", FileReader(f))); // devuelve el documento return doc;} private FileDocument() {}}
Esta es una clase interna de Lucene. Su función es obtener contenido de un archivo de texto. El documento generado tiene tres campos por defecto: ruta, modificado, contenido y el contenido es el contenido de texto del archivo. f), Había algún problema con esta función. No había una codificación especificada para usar en la lectura, así que simplemente la modifiqué aquí.
FileInputStream fis=new FileInputStream(f);//Convierte el flujo de bytes en un flujo de caracteres según la codificación UTF-8 InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//Obtiene texto del flujo de caracteres y lo almacena en buffer BufferedReader br=new BufferedReader(isr); doc.add(nuevo campo("contenido", br));
En cuanto a "Unicode", se puede cambiar a todas las codificaciones compatibles. Cuando lo cambié a "utf-8", se puede usar normalmente.
3. Algunas conjeturas:
Al indexar archivos en Lucene, la codificación no importa, siempre que se especifique correctamente, los archivos de salida se pueden recuperar normalmente. En otras palabras, los resultados después de indexar diferentes archivos de codificación son los mismos (verificación).