Framework Lucene Apache

Estou fazendo um projeto usando o Lucene Apache, e preciso saber qual classe ou alguma maneira de mostrar o conteúdo do documento quando ele está dentro índice.(indexSeacher).

Eu estava pesquisando e achei uma classe chamada LeafReader. Porém não sei usá-la, e não tenho certeza se ele irá servir para esse tipo de problema.

O índice já está criado, o documento já foi passado pelo analisador, e o documento já está dentro do índice.
Agora eu só preciso saber como o documento fica quando ele está dentro do índice.

Me ajudem!!!

Seria melhor voce postar aqui parte do codigo e as classes ja implementadas para termos melhor ideia do seu problema.Por exemplo, que conteudo de documento estamos tratando?

1 curtida

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();
}

}