1. Моя оригинальная программа
На самом деле моя исходная программа была довольно простой, полностью модифицированной из SearchFiles и IndexFiles из демо-версии. Единственное отличие заключалось в том, что она ссылалась на токенизатор SmartCN.
Я опубликую код, который изменил этот момент.
IndexhChinese.java:
Дата начала = новая дата (); попробуйте {IndexWriter Writer = новый IndexWriter (FSDirectory.open (INDEX_DIR), новый SmartChineseAnalyzer (Version.LUCENE_CURRENT), правда, IndexWriter.MaxFieldLength.LIMITED); indexDocs (писатель, docDir System.out); .println("Индексирование в каталог '" +INDEX_DIR+ "'..."); System.out.println("Оптимизация..."); //writer.optimize(); Date end = new Date(); System.out.println(end.getTime() - start.getTime() + "всего миллисекунд" }
ПоискChinese.java
Анализатор анализатора = новый SmartChineseAnalyzer (Version.LUCENE_CURRENT); , "ГБК"));}
Здесь я указываю, что входной запрос закодирован в GBK.
Затем я с уверенностью запустил его... и обнаружил, что китайский язык не может быть получен, а поиск английского языка внутри был нормальным.
2. Найдите проблему.
Поэтому я впал в депрессию. Поскольку я был слишком хорошо знаком с Java и Lucene, а дискуссий за пределами используемой мной версии 3.0.0 было не так много, я немного повозился и обнаружил, что могу получить файл, если его сохранить. в формате ansi. Он на китайском языке (раньше это был UTF-8). Похоже, это проблема с кодировкой файла. После некоторого поиска я нашел следующий код в indexChinese.java:
static void indexDocs(IndexWriter Writer, File file) выдает 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("добавление " + file); try {writer.addDocument(FileDocument.Document(file) } // по крайней мере в Windows, некоторые временные файлы вызывают это исключение с " сообщение «доступ запрещен» // проверка возможности чтения файла не помогает отловить (FileNotFoundException fnfe) { ; } } }
Ключевым моментом является эта фраза:
попробуйте {writer.addDocument(FileDocument.Document(файл));}
Код чтения файла должен быть здесь, проследите его:
public static Document 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(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 = новый BufferedReader (isr.add (новое поле («содержимое», br));
Что касается «Юникода», его можно изменить на все поддерживаемые кодировки. Когда я изменил его на «utf-8», его можно было использовать в обычном режиме.
3. Некоторые предположения:
При индексировании файлов в Lucene кодировка не имеет значения. Если она указана правильно, выходные файлы можно получить обычным образом. Другими словами, результаты после индексации файлов с разными кодировками одинаковы (проверка).