PDA

View Full Version : Lucene-moreLikeThis


redsky1982
14-07-2008, 14:21
Salve a tutti,
mi sono appena iscritta !!!
Vorrei chiedervi un consiglio: per un progetto all'uni devo fare delle ricerche per documenti simili e pensavo di utilizzare la classe di Lucene MoreLikeThis
Però non mi funziona affatto!
Posto il codice, magari qualcuno saprà darmi una risposta!
Io sono disperata sono 4 giorni che cerco in rete :mc:

public void searchBySimilarity(Searcher searcher, int oid) throws Exception {
FSDirectory dx = FSDirectory.getDirectory(new File("C:/repository.dx"));
FSDirectory rs = FSDirectory.getDirectory(new File("C:/repositorySearched.dx"));
IndexReader ir = IndexReader.open(dx);
IndexReader isc = IndexReader.open(rs);
IndexSearcher is = new IndexSearcher(dx);
MoreLikeThis morelt = new MoreLikeThis(isc);

RicettaFacade ricettaFacade = new RicettaFacade();
Ricetta ricetta = ricettaFacade.getRicetta(oid);
//creo il documento con la ricetta che ho
Document doc = new Document();

IndexWriter writer = new IndexWriter(rs, new MyAnalyzer(), true);
System.out.println(ricetta.getNome());
doc.add(new Field("nome", ricetta.getNome(), Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("descrizione", ricetta.getDescrizione(), Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("portata", ricetta.getPortata().toString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.add(new Field("costo", Double.toString(ricetta.getCosto()), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.add(new Field("voto", Integer.toString(ricetta.getVoto()), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.add(new Field("calorie", Integer.toString(ricetta.getCalorie()), Field.Store.YES, Field.Index.UN_TOKENIZED));

int id = ricetta.getOid();

IngredientiRicettaFacade getIngred = new IngredientiRicettaFacade();
ArrayList<IngredientiRicetta> ingredienti = getIngred.getIngredientiRicetta(id);

if (ingredienti != null) {
ListIterator it1 = ingredienti.listIterator();
while (it1.hasNext()) {
IngredientiRicetta ingrRic = (IngredientiRicetta) it1.next();
doc.add(new Field("ingrediente", ingrRic.getTipoingrediente(), Field.Store.YES, Field.Index.UN_TOKENIZED));
}
}
writer.addDocument(doc);
writer.close();
//fine creazione del documento

// lo ricerco con la ricerca per nome
searcher = new IndexSearcher(rs);
Hits hitsin= this.searchByNome(searcher, ricetta.getNome());
int idDoc = hitsin.id(0);
System.out.println("id documento: "+idDoc);

// Reader target = new StringReader("pasta");

Query query = morelt.like(idDoc);
morelt.setFieldNames(new String[]{"name","descrizione"});
morelt.setMinWordLen(1);
morelt.setAnalyzer(new MyAnalyzer());
morelt.setBoost(false);


System.out.println("la query è : "+query.toString());

Hits hits = searcher.search(query);
///////////////////
int trovati = hits.length();
if (trovati == 0) {
System.out.println("Nessun risultato per \"" + "pasta" + "\"");
}
else

{
System.out.println("Trovati risultati per \"" + "pasta" + "\" :");

for (int i = 0; i < trovati; i++) {
doc = hits.doc(i);
System.out.println(" " + (i + 1) + ". " + doc.get("nome"));
}
}


}

banryu79
14-07-2008, 16:45
Non conosco Lucene, volevo solo consigliarti di editare il tuo post per racchiudere tra i tag [CODE] il codice sorgente e identarlo: in questo modo non perdi l'identazione e ai lettori risulta più semplice leggere il tuo codice (io per esempio se vedo codice non racchiuso tra i suddetti tag non lo guardo neanche).

Ciao e in bocca al lupo per il tuo progetto :)

Oceans11
15-07-2008, 00:07
eh già... i tag code....magari se fai una modifica al post qualcuno può pure aiutarti.

Cmq neanch'io conosco lucene, ma se forse spieghi il problema qualcuno potrebbe anche suggerirti una via alternativa.