Esse é o exemplo da classe que estou tratando.
**Dentro do método “TopDocs”, estou tentando através da variável “indexSeacher”, pegar qual é o conteúdo que está no índice. É conteúdo de texto. **
Preciso saber como fica o texto após ser analisado, ter sido retirado os stopWords, stemming, e etc… Como ele fica dentro do índice.
package lucene;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.CharArraySet;
import org.apache.lucene.analysis.pt.PortugueseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.MultiReader;
import org.apache.lucene.index.StoredFieldVisitor;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryCache;
import org.apache.lucene.search.QueryCachingPolicy;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.Weight;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import util.Funcoes;
public class SearchFiles {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
Analyzer analyzer;
LeafReader reader;
DirectoryReader diretorio;
public SearchFiles(String indexDirectoryPath) throws IOException {
Path path = Paths.get(indexDirectoryPath);
Directory directory = FSDirectory.open(path); // FSDirectory, pegando os índices que tão na pasta do computador.
IndexReader indexReader = DirectoryReader.open(directory); // Acessa o índice que foi criado.
indexSearcher = new IndexSearcher(indexReader); // A CLASSE LeafReader é que irá ler o índice.
Funcoes f = new Funcoes();
ArrayList<String> stopWords = f.getStopWords();
final CharArraySet stopSet = new CharArraySet(stopWords, false);
analyzer = new PortugueseAnalyzer(stopSet);
queryParser = new QueryParser("contents", analyzer);
}
public String buscarSinonimo(String palavra) throws IOException{
String linha = "";
BufferedReader br = new BufferedReader(new FileReader("si.txt"));
while(br.ready()){
linha = br.readLine();
palavra = palavra.toLowerCase(); // Convertendo para minusculo pra facilicar a busca
linha = linha.toLowerCase();
if(palavra.equals(linha)){
System.out.println("quem é a linha encontrada? : " + linha);
br.ready();
linha = br.readLine();
palavra = linha; // Esse que vai ser indexado.
System.out.println("quem é a linha para ser indexada? : " + linha);
}
}
return palavra;
}
public TopDocs search(String searchQuery) throws IOException, ParseException {
String busca = buscarSinonimo(searchQuery);
query = queryParser.parse(busca);
//Explanation explanation = indexSearcher.explain(query, 6);
//System.out.println("----------");
///Document doc = indexSearcher.doc(6);
//System.out.println("Resultado:"+explanation.toString());
return indexSearcher.search(query, 10);
}
public TopDocs search(Query query) throws IOException, ParseException {
return indexSearcher.search(query, 10);
}
public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
}
Essa é a classe indexFiles, onde ele faz a indexação dos documentos…
package lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.CharArraySet;
import org.apache.lucene.analysis.pt.PortugueseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.store.RAMFile;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import com.ibm.icu.impl.InvalidFormatException;
import util.Funcoes;
public class IndexFiles {
private IndexWriter writer; // Um indexWrite, ele cria ou mantem um índice.
private Path p;
//PREPAROU O INDICE
public IndexFiles(String indexDirectoryPath) throws IOException {
Directory indexDirectory = FSDirectory.open(Paths.get(indexDirectoryPath));
Funcoes f = new Funcoes();
ArrayList<String> stopWords = f.getStopWords();
final CharArraySet stopSet = new CharArraySet(stopWords, false);
Analyzer analyzer = new PortugueseAnalyzer(stopSet);
IndexWriterConfig iwc = new IndexWriterConfig(analyzer); //Retém toda a configuração que é usada para criar um IndexWriter.
//Especifica o modo aberto para IndexWriter... O iwc tem toda a configuração para criação do índice.
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); //Cria um novo índice se não existir, caso contrário, ele abrirá o índice e os documentos serão anexados.
// O processo de criação do índice é com os documentos não com a consulta.
// Eu crio o índice com base nos documentos;
// A consulta é uma string que vai lá no índice e vai ver quais documentos são mais relevantes para aquela consulta..
// Isso tem todo um tratameno de pontuação e tudo mais. O trabalho do analyzer.
writer = new IndexWriter(indexDirectory, iwc); // Recebe o diretorio dos índices, e o cara que tem a configuração do indice
p = Paths.get(indexDirectoryPath);
}
private void indexTXTFile(File file) throws IOException { // indexou; blz. ta no índice. tem que fazer o tratamento ainda.
System.out.println("Indexing " + file.getName());
Document document = getDocument(file, p);
if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
writer.addDocument(document);
} else {
writer.updateDocument(new Term("filepath", file.toString()), document);
}
}
//CRIOU O INDICE.. ESCREVEU NO ÍNDICE
public int createIndex(String dataDirPath, FileFilter filter) throws IOException, InvalidFormatException {
// obter todos os arquivos no diretorio de dados e cria indice para eles.
File[] files = new File(dataDirPath).listFiles(); // 1 - pega o documento lá no text.
for (File file : files) {
if (!file.isDirectory() && !file.isHidden() && file.exists() && file.canRead() && filter.accept(file)) {
if (file.getName().endsWith(".txt")) { //
indexTXTFile(file); // 2 - manda pra cá, pra indexar.
} else if (file.getName().endsWith(".pdf")) {
IndexPDFFile(file);
} else if (file.getName().endsWith(".docx")) {
IndexDOCXFile(file);
}
}
}
return writer.numDocs(); // numero de documentos que foram indexados.
}
private void IndexDOCXFile(File file) throws FileNotFoundException, IOException {
System.out.println("Indexing " + file.getName());
XWPFDocument doc = new XWPFDocument(new FileInputStream(file.getPath()));
XWPFWordExtractor we = new XWPFWordExtractor(doc);
String content = we.getText();
Document document = new Document();
// indexa o documento lá no índice.
Field contentField = new TextField(“contents”, content, Field.Store.YES); // Field, campo // Content, conteudo.
// indexa o titulo/nome do arquivo
Field fileNameField = new StringField(“filename”, file.getName(), Field.Store.YES);
// indexa o caminho para a pasta do arquivo
Field filePathField = new StringField(“filepath”, file.getCanonicalPath(), Field.Store.YES);
// indexa a ultima vez que a pasta do arquivo foi modificada
Field filemodified = new LongPoint(“modified”, Files.getLastModifiedTime§.toMillis());
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
document.add(filemodified);
if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
writer.addDocument(document);
} else {
writer.updateDocument(new Term("filepath", file.toString()), document);
}
}
private void IndexPDFFile(File file) throws IOException {
System.out.println("Indexing " + file.getName());
PDDocument pddDocument = PDDocument.load(file);
String content = new PDFTextStripper().getText(pddDocument);
pddDocument.close();
Document document = new Document();
Field contentField = new TextField("contents", content, Field.Store.YES);
// indexa o titulo/nome do arquivo
Field fileNameField = new StringField("filename", file.getName(), Field.Store.YES);
// indexa o caminho para a pasta do arquivo
Field filePathField = new StringField("filepath", file.getCanonicalPath(), Field.Store.YES);
// indexa a ultima vez que a pasta do arquivo foi modificada
Field filemodified = new LongPoint("modified",
Files.getLastModifiedTime(p).toMillis());
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
document.add(filemodified);
if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
writer.addDocument(document); // Incluir esse documento no Indice do Lucene.
} else {
writer.updateDocument(new Term("filepath", file.toString()), document); //Atualiza.
}
}
private Document getDocument(File file, Path path) throws IOException {
// é a unidade de pesquisa e Ãndice, onde é armazenado os pares
// campo-valor para identificar os dados indexados
Document document = new Document();
// Field são os campos a serem indexado com suas chaves/campo-valor
// indexa o conteudo do arquivo
Field contentField = new TextField("contents", new FileReader(file));
// indexa o titulo/nome do arquivo
Field fileNameField = new StringField("filename", file.getName(), Field.Store.YES);
// indexa o caminho para a pasta do arquivo
Field filePathField = new StringField("filepath", file.getCanonicalPath(), Field.Store.YES);
// indexa a ultima vez que a pasta do arquivo foi modificada
Field filemodified = new LongPoint("modified", Files.getLastModifiedTime(path).toMillis());
// Documents são conjuntos de campos agrupados.
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
document.add(filemodified);
return document;
}
// Finaliza a indexação
public void close() throws CorruptIndexException, IOException {
writer.close();
}
}