1. Meu programa original
Na verdade, meu programa original era bastante simples, completamente modificado do SearchFiles e IndexFiles da Demo. A única diferença era que ele fazia referência ao tokenizer SmartCN.
Vou postar o código que modificou esse ponto.
IndexhChinese.java:
Data de início = new Date();tente { IndexWriter escritor = novo IndexWriter(FSDirectory.open(INDEX_DIR), novo SmartChineseAnalyzer(Version.LUCENE_CURRENT), verdadeiro, IndexWriter.MaxFieldLength.LIMITED); .println("Indexando para o diretório '" +INDEX_DIR+ "'..."); System.out.println("Otimizando..."); new Date(); System.out.println(end.getTime() - start.getTime() + "total de milissegundos");
SearchChinese.java
Analisador analisador = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = null;if (consultas! = null) { in = new BufferedReader(new FileReader(queries));} else { in = new BufferedReader(new InputStreamReader(System.in , "GBK"));}
Aqui, especifico que a consulta de entrada é codificada em GBK.
Então executei-o com confiança... e descobri que o chinês não poderia ser recuperado e a recuperação do inglês dentro dele estava normal.
2. Encontre o problema.
Então fiquei deprimido. Como estava muito familiarizado com Java e Lucene e não havia muitas discussões fora da versão 3.0.0 que eu estava usando, brinquei um pouco e descobri que poderia recuperar o arquivo se o salvasse. no formato ansi. Está em chinês (costumava ser UTF-8. Parece ser um problema de codificação de arquivo).
static void indexDocs(IndexWriter Writer, File file) throws IOException { // não tente indexar arquivos que não podem ser lidos if (file.canRead()) { if (file.isDirectory()) { String[] files = file. list(); // um erro de IO pode ocorrer if (files != null) { for (int i = 0; i < files.length; i++) { indexDocs(writer, new File(file, files[i])) ; } } } else { System.out.println("adding " + file); try {writer.addDocument(FileDocument.Document(file) } // pelo menos no Windows, alguns arquivos temporários geram esta exceção com um " mensagem de acesso negado" // verificar se o arquivo pode ser lido não ajuda a capturar (FileNotFoundException fnfe) { ; } } }
O ponto chave é esta frase:
tente {writer.addDocument(FileDocument.Document(file));}
O código para leitura do arquivo deve estar aqui, trace-o:
documento estático público Documento (Arquivo f) lança java.io.FileNotFoundException, UnsupportedEncodingException { Documento doc = new Documento(); Index.NOT_ANALYZED)); doc.add(new Field("modificado", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED doc. add(new Field("contents", FileReader(f))); // retorna o documento return doc;} private FileDocument() {}}
Esta é uma classe interna do Lucene. Sua função é obter conteúdo de um arquivo de texto. O Documento gerado possui três campos por padrão: caminho, modificado, conteúdo e conteúdo é o conteúdo de texto do arquivo. f), Havia algo errado com esta função. Não havia codificação especificada para usar na leitura, então simplesmente modifiquei aqui.
FileInputStream fis=new FileInputStream(f);//Converte o fluxo de bytes em um fluxo de caracteres de acordo com a codificação UTF-8 InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//Obtém texto do fluxo de caracteres e armazena-o em buffer BufferedReader br=new BufferedReader(isr); doc.add(new Field("conteúdo", br));
Quanto a "Unicode", ele pode ser alterado para todas as codificações suportadas. Quando mudei para "utf-8", ele pode ser usado normalmente.
3. Algumas suposições:
Ao indexar arquivos no Lucene, a codificação não importa, desde que seja especificada corretamente, os arquivos de saída podem ser recuperados normalmente, ou seja, os resultados após a indexação de diferentes arquivos de codificação são os mesmos (verificação).