1. โปรแกรมดั้งเดิมของฉัน
อันที่จริง โปรแกรมดั้งเดิมของฉันค่อนข้างเรียบง่าย โดยได้รับการแก้ไขอย่างสมบูรณ์จาก SearchFiles และ IndexFiles ในการสาธิต
ฉันจะโพสต์รหัสที่แก้ไขจุดนั้น
Indexh Chinese.java:
วันที่เริ่มต้น = วันที่ใหม่ (); ลอง { ผู้เขียน IndexWriter = ใหม่ IndexWriter (FSDirectory.open (INDEX_DIR), Smart ChineseAnalyzer ใหม่ (Version.LUCENE_CURRENT), จริง, IndexWriter.MaxFieldLength.LIMITED); .println("การจัดทำดัชนีไปยังไดเรกทอรี '" +INDEX_DIR+ "'..."); System.out.println("การเพิ่มประสิทธิภาพ..."); //writer.optimize(); วันที่สิ้นสุด = วันที่ใหม่(); System.out.println(end.getTime() - start.getTime() + " รวมมิลลิวินาที");
ค้นหาภาษาจีน.java
ตัววิเคราะห์ = 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"));}
ที่นี่ ฉันระบุว่าแบบสอบถามอินพุตถูกเข้ารหัสเป็น GBK
จากนั้นฉันก็วิ่งด้วยความมั่นใจ... และพบว่าไม่สามารถเรียกภาษาจีนได้ และการดึงข้อมูลภาษาอังกฤษภายในก็เป็นเรื่องปกติ
2. ค้นหาปัญหา
ดังนั้นฉันจึงรู้สึกหดหู่ เนื่องจากฉันคุ้นเคยกับ Java และ Lucene มากเกินไป และไม่มีการพูดคุยกันมากนักนอกเหนือจากเวอร์ชัน 3.0.0 ที่ฉันใช้ ฉันจึงเล่นซออยู่พักหนึ่งและพบว่าฉันสามารถดึงไฟล์กลับคืนมาได้หากฉันบันทึกไว้ ในรูปแบบ ansi มันเป็นภาษาจีน (เคยเป็น UTF-8) ดูเหมือนว่าจะมีปัญหาในการเข้ารหัสไฟล์ หลังจากค้นหา ฉันพบโค้ดต่อไปนี้ใน indexChinese.java:
static void indexDocs(ตัวเขียน IndexWriter, ไฟล์ไฟล์) ส่ง IOException { // อย่าพยายามสร้างดัชนีไฟล์ที่ไม่สามารถอ่านได้ if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // ข้อผิดพลาด IO อาจเกิดขึ้นได้หาก (files != null) { for (int i = 0; i < files.length; i++) { indexDocs(writer, new File(file, files[i])) ; } } } else { System.out.println("adding " + file); ลอง {writer.addDocument(FileDocument.Document(file)) } // อย่างน้อยบน windows ไฟล์ชั่วคราวบางไฟล์ทำให้เกิดข้อยกเว้นนี้ การเข้าถึงถูกปฏิเสธ" ข้อความ // การตรวจสอบว่าไฟล์สามารถอ่านได้หรือไม่ไม่ได้ช่วยตรวจจับ (FileNotFoundException fnfe) { ; } } }
ประเด็นสำคัญคือประโยคนี้:
ลอง {writer.addDocument(FileDocument.Document(file));}
รหัสสำหรับอ่านไฟล์ควรอยู่ที่นี่ ติดตามมัน:
เอกสารเอกสารสาธารณะแบบคงที่ (ไฟล์ f) พ่น java.io.FileNotFoundException, UnsupportedEncodingException { Document doc = new Document(); doc.add(new Field("path", f.getPath(), Field.Store.YES, Field. Index.NOT_ANALYZED)); doc.add(ฟิลด์ใหม่ ("แก้ไข", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); เพิ่ม (ฟิลด์ใหม่ ("เนื้อหา", FileReader (f))); // ส่งคืนเอกสาร return doc;} private FileDocument () {}}
นี่คือคลาสภายในของ Lucene หน้าที่ของมันคือการรับเนื้อหาจากไฟล์ข้อความโดยค่าเริ่มต้นจะมีสามฟิลด์: พาธ, แก้ไข, เนื้อหา และเนื้อหาเป็นเนื้อหาข้อความของไฟล์ f) มีบางอย่างผิดปกติกับฟังก์ชันนี้ ไม่มีการเข้ารหัสเฉพาะเพื่อใช้ในการอ่าน ดังนั้นฉันจึงแก้ไขมันที่นี่
FileInputStream fis=new FileInputStream(f);//แปลงไบต์สตรีมเป็นสตรีมอักขระตามการเข้ารหัส UTF-8 InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//รับข้อความจากสตรีมอักขระและบัฟเฟอร์ BufferedReader br=new BufferedReader(isr); doc.add(ฟิลด์ใหม่("เนื้อหา", br));
ส่วน "Unicode" สามารถเปลี่ยนเป็นการเข้ารหัสที่รองรับทั้งหมดได้ เมื่อเปลี่ยนเป็น "utf-8" ก็สามารถใช้งานได้ตามปกติ
3. การคาดเดาบางประการ:
เมื่อสร้างดัชนีไฟล์ใน Lucene การเข้ารหัสก็ไม่สำคัญ ตราบใดที่มีการระบุอย่างถูกต้อง ไฟล์เอาต์พุตก็สามารถดึงข้อมูลได้ตามปกติ กล่าวอีกนัยหนึ่ง ผลลัพธ์หลังจากการจัดทำดัชนีไฟล์การเข้ารหัสต่างๆ จะเหมือนกัน (การตรวจสอบ)