1. برنامجي الأصلي
في الواقع، كان برنامجي الأصلي بسيطًا جدًا، وتم تعديله بالكامل من ملفات البحث وملفات الفهرس في العرض التوضيحي، وكان الاختلاف الوحيد هو أنه أشار إلى رمز SmartCN.
سأقوم بنشر الكود الذي عدل هذه النقطة.
IndexhChinese.java:
تاريخ البدء = تاريخ جديد();try { IndexWriterwriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); .println("الفهرسة إلى الدليل '" +INDEX_DIR+ "'..."); System.out.println("التحسين..."); new Date(); System.out.println(end.getTime() - start.getTime() + "إجمالي المللي ثانية");
SearchChinese.java
محلل محلل = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); ، "GBK"))؛}
هنا أحدد أن استعلام الإدخال مشفر في GBK.
ثم قمت بتشغيله بكل ثقة...ووجدت أنه لا يمكن استرجاع اللغة الصينية، وكان استرجاع اللغة الإنجليزية بالداخل طبيعيًا.
2. ابحث عن المشكلة.
لذلك أصبحت مكتئبًا نظرًا لأنني كنت على دراية بـ Java وLucene، ولم يكن هناك الكثير من المناقشات خارج الإصدار 3.0.0 الذي كنت أستخدمه، فقد عبثت لفترة من الوقت ووجدت أنه يمكنني استرداد الملف إذا قمت بحفظه. بتنسيق ansi، وهو باللغة الصينية (كان يستخدم UTF-8). ويبدو أن هناك مشكلة في ترميز الملف. وبعد إجراء بعض البحث، وجدت الكود التالي في ملف IndexChinese.java:
static void IndexDocs(IndexWriterwriter, File file) throws IOException { // لا تحاول فهرسة الملفات التي لا يمكن قراءتها if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // يمكن أن يحدث خطأ في الإدخال/الإخراج if (files != null) { for (int i = 0; i < files.length; i++) { IndexDocs(writer, new File(file, files[i])) } } } else { System.out.println("adding " + file); حاول { write.addDocument(FileDocument(file) } // على الأقل في نظام التشغيل Windows، تثير بعض الملفات المؤقتة هذا الاستثناء بـ " تم رفض الوصول" رسالة // التحقق من إمكانية قراءة الملف لا يساعد في التقاط (FileNotFoundException fnfe) { ; } } }
النقطة المهمة هي هذه الجملة:
حاول {writer.addDocument(FileDocument.Document(file));}
يجب أن يكون رمز قراءة الملف هنا، قم بتتبعه:
مستند مستند عام ثابت (ملف f) يطرح java.io.FileNotFoundException, UnsupportedEncodingException { Document doc = new Document(); 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))); // إرجاع المستند return doc;} Private FileDocument() {}}
هذه فئة داخلية من Lucene، وتتمثل مهمتها في الحصول على المحتوى من ملف نصي. يحتوي المستند الذي تم إنشاؤه على ثلاثة حقول افتراضيًا: المسار، والتعديل، والمحتوى، والمحتوى هو محتوى النص للملف (. و)، كان هناك خطأ ما في هذه الوظيفة ولم يكن هناك ترميز محدد لاستخدامه في القراءة، لذلك قمت ببساطة بتعديله هنا.
FileInputStream fis=new FileInputStream(f);// تحويل دفق البايت إلى دفق أحرف وفقًا لترميز UTF-8 InputStreamReader isr=new InputStreamReader(fis,"UNICODE");// احصل على نص من دفق الأحرف وقم بتخزينه مؤقتًا BufferedReader br=new BufferedReader(isr);
أما "Unicode" فيمكن تغييره إلى جميع الترميزات المدعومة، وعندما قمت بتغييره إلى "utf-8"، يمكن استخدامه بشكل طبيعي.
3. بعض التخمينات:
عند فهرسة الملفات في Lucene، لا يهم التشفير طالما تم تحديده بشكل صحيح، يمكن استرجاع ملفات الإخراج بشكل طبيعي، وبعبارة أخرى، فإن النتائج بعد فهرسة ملفات التشفير المختلفة هي نفسها (التحقق).