Hibernate Search e Lucene

2 respostas
C

Fala galera,

Estou tendo um problema com o uso de Lucene e Hibernate Search.
Os indices de procura sao criados,inclusive atraves do Luke consigo fazer uma pesquisa.
Porem,ao tentar executar uma pesquisa com uma implementacao no Java,e lancada a seguinte excecao:

Exception in thread main java.lang.NullPointerException

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at org.hibernate.annotations.common.util.ReflectHelper.classForName(ReflectHelper.java:66)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.getDocumentClass(DocumentBuilderIndexedEntity.java:551)

at org.hibernate.search.engine.DocumentExtractor.extract(DocumentExtractor.java:68)

at org.hibernate.search.engine.DocumentExtractor.extract(DocumentExtractor.java:88)

at org.hibernate.search.query.FullTextQueryImpl.list(FullTextQueryImpl.java:304)

at pubcult.pesquisa.bean.AgentePesquisadorBean.realizarPesquisa(AgentePesquisadorBean.java:44)

at pubcult.negocio.bean.AgentePesquisaBean.realizarPesquisa(AgentePesquisaBean.java:22)

at main.GeraTabelas.main(GeraTabelas.java:19)

Segue o codigo da pesquisa:

Session session = SessionFactoryUtil.getFactory().getCurrentSession();

session.beginTransaction().begin();

FullTextSession fSession = Search.getFullTextSession(session);

fSession.beginTransaction();

QueryParser parser = new QueryParser(textoLivro,

new BrazilianAnalyzer(Version.LUCENE_29));

Query lucenceQuery = null;

try {

lucenceQuery = parser.parse(“textoLivro: + palavraChave);
} catch (ParseException e) {
		throw new RuntimeException("Nao rolou a pesquisa", e);
	} // execute the query
	List<Livro> livros = fSession.createFullTextQuery(lucenceQuery,
			Livro.class).list();
	return livros;

O codigo da classe Livro:

@Entity
@Indexed(index = “Livro”)
@Table(name = “LIVRO”)

public class Livro implements Serializable {

private static final long serialVersionUID = -3537691503173267644L;

public Livro() {

}

public Livro(String referenciaLivro , List<Autor> listaAutores, List<Editora> listaEditoras,
		String tituloLivro, List<Categoria> categorias, String textoLivro) {
	
	setListaAutores();
	setEditorasLivro();
	setCategorias();
	for(Autor autor:listaAutores){
		System.out.println(autor.getNomeAutor());
		addAutor(autor);
	}
	for(Editora editora:listaEditoras){
		System.out.println(editora.getNomeEditora());
		addEditora(editora);
	}
	for(Categoria categoria:categorias){
		System.out.println(categoria.getTipoCategoria());
		addCategoria(categoria);
	}
	setTituloLivro(tituloLivro);
	setTextoLivro(textoLivro);
	setReferenciaLivro(referenciaLivro);

}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idLivro")
private int idLivro;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="AUTOR_LIVRO" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idAutor"))
private List<Autor> listaAutores;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="LIVRO_EDITORA" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idEditora"))
private List<Editora> editorasLivro;

@Column(name = "tituloLivro")
private String tituloLivro;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="LIVRO_CATEGORIA" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idCategoria"))
private List<Categoria> categorias;

@Column(name = "referenciaLivro")
private String referenciaLivro;

@Field(index = Index.TOKENIZED, store = Store.YES)
@Analyzer(impl=BrazilianAnalyzer.class)
@Column(name = "textoLivro")
@Lob
private String textoLivro;

E pra finalizar,o codigo de criacao de indexacao:

Directory fsDirectory = FSDirectory.open(new File("./Indices/Livro"));

Analyzer brazilianAnalyzer = new BrazilianAnalyzer(

Version.LUCENE_29, BrazilianAnalyzer.BRAZILIAN_STOP_WORDS);

IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy();

indexWriter = new IndexWriter(fsDirectory, brazilianAnalyzer,

deletionPolicy, IndexWriter.MaxFieldLength.UNLIMITED);

String textoLivro = livro.getTextoLivro();
Field textoLivroField = new Field("textoLivro", textoLivro,
				Field.Store.YES, Field.Index.ANALYZED);

		Document doc = new Document();
		doc.add(textoLivroField);

		indexWriter.addDocument(doc);
		indexWriter.optimize();
		indexWriter.close();

Alguem pode dar uma ajuda nisso:
Valew pela ajuda!

2 Respostas

von.juliano

Pra te ajudar, primeiro você precisa nos ajudar a te ajudar, então leia esse tópico, melhore seu post, e ae te ajudamos! :smiley:

Flw! :thumbup:

C

Opa,malz ae...é a pressa,Projeto Final bombando...

entao segue agora certo:

Estou tendo um problema com o uso de Lucene e Hibernate Search.
Os índices de procura são criados,inclusive através do Luke consigo fazer uma pesquisa.
Porém,ao tentar executar uma pesquisa com uma implementação no Java,e lancada a seguinte exceção:

Exception in thread "main" java.lang.NullPointerException 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.hibernate.annotations.common.util.ReflectHelper.classForName(ReflectHelper.java:66) 
at org.hibernate.search.engine.DocumentBuilderIndexedEntity.getDocumentClass(DocumentBuilderIndexedEntity.java:551) 
at org.hibernate.search.engine.DocumentExtractor.extract(DocumentExtractor.java:6 
at org.hibernate.search.engine.DocumentExtractor.extract(DocumentExtractor.java:8 
at org.hibernate.search.query.FullTextQueryImpl.list(FullTextQueryImpl.java:304) 
at pubcult.pesquisa.bean.AgentePesquisadorBean.realizarPesquisa(AgentePesquisadorBean.java:44) 
at pubcult.negocio.bean.AgentePesquisaBean.realizarPesquisa(AgentePesquisaBean.java:22) 
at main.GeraTabelas.main(GeraTabelas.java:19)

O código que deveria realizar a pesquisa:

Session session = SessionFactoryUtil.getFactory().getCurrentSession(); 
session.beginTransaction().begin(); 
FullTextSession fSession = Search.getFullTextSession(session); 
fSession.beginTransaction(); 
QueryParser parser = new QueryParser("textoLivro", 
                  new BrazilianAnalyzer(Version.LUCENE_29)); 
Query lucenceQuery = null; 
try { 
          lucenceQuery = parser.parse("textoLivro:" + palavraChave); 

      }catch (ParseException e) { 
          throw new RuntimeException("Nao rolou a pesquisa", e); 
} 
// execute the query 
List<Livro> livros = fSession.createFullTextQuery(lucenceQuery, 
Livro.class).list(); 
return livros;

O código da classe Livro:

@Entity 
@Indexed(index = "Livro") 
@Table(name = "LIVRO") 

public class Livro implements Serializable { 

private static final long serialVersionUID = -3537691503173267644L; 

public Livro() { 

} 

public Livro(String referenciaLivro , List<Autor> listaAutores, List<Editora> listaEditoras, 
String tituloLivro, List<Categoria> categorias, String textoLivro) { 

           setListaAutores(); 
           setEditorasLivro(); 
           setCategorias(); 
           for(Autor autor:listaAutores){ 
                  System.out.println(autor.getNomeAutor()); 
                  addAutor(autor); 
           } 
           for(Editora editora:listaEditoras){ 
                  System.out.println(editora.getNomeEditora()); 
                  addEditora(editora); 
           } 
           for(Categoria categoria:categorias){ 
                  System.out.println(categoria.getTipoCategoria()); 
                  addCategoria(categoria); 
           } 
           setTituloLivro(tituloLivro); 
           setTextoLivro(textoLivro); 
           setReferenciaLivro(referenciaLivro); 

} 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "idLivro") 
private int idLivro; 

@ManyToMany 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinTable(name="AUTOR_LIVRO" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idAutor")) 
private List<Autor> listaAutores; 

@ManyToMany 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinTable(name="LIVRO_EDITORA" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idEditora")) 
private List<Editora> editorasLivro; 

@Column(name = "tituloLivro") 
private String tituloLivro; 

@ManyToMany 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinTable(name="LIVRO_CATEGORIA" , joinColumns=@JoinColumn(name="idLivro") , inverseJoinColumns=@JoinColumn(name="idCategoria")) 
private List<Categoria> categorias; 

@Column(name = "referenciaLivro") 
private String referenciaLivro; 

@Field(index = Index.TOKENIZED, store = Store.YES) 
@Analyzer(impl=BrazilianAnalyzer.class) 
@Column(name = "textoLivro") 
@Lob 
private String textoLivro;

E pra finalizar,o codigo de criacao de indexação:

Directory fsDirectory = FSDirectory.open(new File("./Indices/Livro")); 
Analyzer brazilianAnalyzer = new BrazilianAnalyzer( 
Version.LUCENE_29, BrazilianAnalyzer.BRAZILIAN_STOP_WORDS); 
IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy(); 
indexWriter = new IndexWriter(fsDirectory, brazilianAnalyzer, 
deletionPolicy, IndexWriter.MaxFieldLength.UNLIMITED); 
String textoLivro = livro.getTextoLivro(); 

Field textoLivroField = new Field("textoLivro", textoLivro, 
Field.Store.YES, Field.Index.ANALYZED); 

Document doc = new Document(); 
doc.add(textoLivroField); 

indexWriter.addDocument(doc); 
indexWriter.optimize(); 
indexWriter.close();

Valew pela dica e pela ajuda tmb!

Criado 4 de outubro de 2010
Ultima resposta 5 de out. de 2010
Respostas 2
Participantes 2