1. Program asli saya
Faktanya, program asli saya cukup sederhana, sepenuhnya dimodifikasi dari SearchFiles dan IndexFiles di Demo. Satu-satunya perbedaan adalah program ini merujuk pada tokenizer SmartCN.
Saya akan memposting kode yang mengubah poin itu.
IndexhChinese.java:
Tanggal mulai = Tanggal baru();coba { IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); .println("Pengindeksan ke direktori '" +INDEX_DIR+ "'..."); System.out.println("Mengoptimalkan..."); Tanggal baru(); System.out.println(end.getTime() - start.getTime() + " total milidetik" }
CariChinese.java
Penganalisis penganalisa = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); , "GBK"));}
Di sini, saya menentukan bahwa permintaan input dikodekan dalam GBK.
Kemudian saya menjalankannya dengan percaya diri... dan menemukan bahwa bahasa Mandarin tidak dapat diambil, dan pengambilan bahasa Inggris di dalamnya normal.
2. Temukan masalahnya.
Jadi saya menjadi depresi. Karena saya terlalu akrab dengan Java dan Lucene, dan tidak banyak diskusi di luar versi 3.0.0 yang saya gunakan, saya bermain-main sebentar dan menemukan bahwa saya dapat mengambil file tersebut jika saya menyimpannya. dalam format ansi. Ini dalam bahasa Cina (dulu UTF-8). Tampaknya ada masalah pengkodean file.
static void indexDocs(Penulis IndexWriter, File file) throws IOException { // jangan mencoba mengindeks file yang tidak dapat dibaca if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // kesalahan IO dapat terjadi jika (files != null) { for (int i = 0; i < files.length; i++) { indexDocs(writer, new File(file, files[i])) ; } } } else { System.out.println("menambahkan " + file); coba { writer.addDocument(FileDocument.Document(file) } // setidaknya di windows, beberapa file sementara memunculkan pengecualian ini dengan " akses ditolak" pesan // memeriksa apakah file dapat dibaca tidak membantu menangkap (FileNotFoundException fnfe) { ; } } }
Poin kuncinya adalah kalimat ini:
coba { writer.addDocument(FileDocument.Document(file));}
Kode untuk membaca file harusnya ada di sini, lacak:
Dokumen Dokumen statis publik (File f) menampilkan java.io.FileNotFoundException, UnsupportedEncodingException { Dokumen doc = new Document(); Bidang baru("path", f.getPath(), Field.Store.YES, Bidang. Index.NOT_ANALYZED)); doc.add(Bidang baru("dimodifikasi", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); add(new Field("contents", FileReader(f))); // mengembalikan dokumen mengembalikan dokumen;} private FileDocument() {}}
Ini adalah kelas internal Lucene. Fungsinya untuk mendapatkan konten dari file teks. Dokumen yang dihasilkan memiliki tiga bidang secara default: jalur, diubah, konten, dan konten adalah konten teks file. f), Ada yang salah dengan fungsi ini. Tidak ada pengkodean khusus yang digunakan untuk membaca, jadi saya cukup memodifikasinya di sini.
FileInputStream fis=new FileInputStream(f);//Ubah aliran byte menjadi aliran karakter sesuai dengan pengkodean UTF-8 InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//Dapatkan teks dari aliran karakter dan buffering BufferedReader br=new BufferedReader(isr); doc.add(Bidang baru("isi", br));
Sedangkan untuk "Unicode", dapat diubah ke semua pengkodean yang didukung. Ketika saya mengubahnya menjadi "utf-8", dapat digunakan secara normal.
3. Beberapa tebakan:
Saat mengindeks file di Lucene, pengkodean tidak menjadi masalah selama ditentukan dengan benar, file output dapat diambil secara normal, dengan kata lain, hasil setelah mengindeks file pengkodean yang berbeda adalah sama (verifikasi).