1. Mein ursprüngliches Programm
Tatsächlich war mein ursprüngliches Programm recht einfach und wurde gegenüber den SearchFiles und IndexFiles in der Demo vollständig modifiziert. Der einzige Unterschied bestand darin, dass es auf den SmartCN-Tokenizer verwies.
Ich werde den Code veröffentlichen, der diesen Punkt geändert hat.
IndexhChinese.java:
Date start = new Date();try { IndexWriterwriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); indexDocs(writer, docDir); .println("Indizierung auf Verzeichnis '" +INDEX_DIR+ "'..."); System.out.println("Optimierung..."); new Date(); System.out.println(end.getTime() - start.getTime() + „Gesamtmillisekunden“);
SearchChinese.java
Analysatoranalyzer = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = null;if (queries != null) { in = new BufferedReader(new FileReader(queries));} else { in = new BufferedReader(new InputStreamReader(System.in , „GBK“));}
Hier gebe ich an, dass die Eingabeabfrage in GBK codiert ist.
Dann habe ich es mit Zuversicht ausgeführt ... und festgestellt, dass Chinesisch nicht abgerufen werden konnte und die englische Abruffunktion normal war.
2. Finden Sie das Problem.
Da ich mit Java und Lucene zu vertraut war und es außerhalb der von mir verwendeten Version 3.0.0 nicht viele Diskussionen gab, fummelte ich eine Weile herum und stellte fest, dass ich die Datei wiederherstellen konnte, wenn ich sie speicherte im Ansi-Format (früher war es UTF-8). Nach einigem Suchen habe ich den folgenden Code in indexChinese.java gefunden.
static void indexDocs(IndexWriterwriter, File file) throws IOException { // Versuchen Sie nicht, Dateien zu indizieren, die nicht gelesen werden können if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // ein IO-Fehler könnte auftreten, wenn (files != null) { for (int i = 0; i < files.length; i++) { indexDocs(writer, new File(file, files[i])) ; } } } else { System.out.println("adding " + file); try { write.addDocument(FileDocument.Document(file) } // Zumindest unter Windows lösen einige temporäre Dateien diese Ausnahme mit einem " aus Meldung „Zugriff verweigert“ // Überprüfen, ob die Datei gelesen werden kann, hilft nicht beim Abfangen (FileNotFoundException fnfe) { ; } } }
Der entscheidende Punkt ist dieser Satz:
Versuchen Sie es mit {writer.addDocument(FileDocument.Document(file));}
Der Code zum Lesen der Datei sollte hier sein, verfolgen Sie ihn:
öffentliches statisches Dokument 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))); // das Dokument zurückgeben return doc;} private FileDocument() {}}
Dies ist eine interne Klasse von Lucene. Ihre Funktion besteht darin, Inhalte aus einer Textdatei abzurufen. Das generierte Dokument verfügt standardmäßig über drei Felder: Pfad, geändert, Inhalt und Inhalt ist der Textinhalt der Datei. f) Mit dieser Funktion stimmte etwas nicht. Es gab keine angegebene Codierung zum Lesen, daher habe ich sie hier einfach geändert.
FileInputStream fis=new FileInputStream(f);// Konvertieren Sie den Byte-Stream in einen Zeichenstrom gemäß UTF-8-Kodierung. InputStreamReader isr=new InputStreamReader(fis,"UNICODE");// Holen Sie sich Text aus dem Zeichenstrom und puffern Sie ihn BufferedReader br=new BufferedReader(isr); doc.add(new Field("contents", br));
Was „Unicode“ betrifft, kann es in alle unterstützten Kodierungen geändert werden. Wenn ich es in „utf-8“ geändert habe, kann es normal verwendet werden.
3. Einige Vermutungen:
Bei der Indizierung von Dateien in Lucene spielt die Codierung keine Rolle. Solange sie korrekt angegeben ist, können die Ausgabedateien normal abgerufen werden. Mit anderen Worten, die Ergebnisse nach der Indizierung verschiedener Codierungsdateien sind gleich (Überprüfung).