this is what I tried so far.
Using the highlighter:
Code:
SearchFactory searchFactory = fullTextEntityManager.getSearchFactory();
IndexReaderAccessor indexReaderAccessor = searchFactory.getIndexReaderAccessor();
IndexReader indexReader = indexReaderAccessor.open(Record.class);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
TopDocs hits = null;
try {
hits = indexSearcher.search(luceneQuery, 10);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
if(hits.scoreDocs.length != 0) {
QueryScorer scorer = new QueryScorer(luceneQuery);
scorer.setExpandMultiTermQuery(true);
Formatter formatter = new SimpleHTMLFormatter();
Highlighter highlighter = new Highlighter(scorer);
Analyzer analyzer2 = new StandardAnalyzer(Version.LUCENE_34);
Document doc = null;
try {
doc = indexSearcher.doc(hits.scoreDocs[0].doc);
} catch (CorruptIndexException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
String title = doc.get("content");
TokenStream stream = null;
try {
stream = TokenSources.getAnyTokenStream(indexReader,
hits.scoreDocs[0].doc,
"content",
doc,
analyzer2);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
String fragment = "";
try {
fragment = highlighter.getBestFragment(analyzer2,"content", title);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidTokenOffsetsException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Fragment => " + fragment);
}
However, this does not give me the
term but the the fragment. This is not exactly what I'm looking for.
I tried to use the explain method as well:
Code:
for (int i = 0; i < hits.totalHits; i++) {
ScoreDoc match = hits.scoreDocs[i];
Explanation explanation = null;
try {
explanation = indexSearcher.explain(luceneQuery, match.doc);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("----------");
Document explainDoc = null;
try {
explainDoc = indexSearcher.doc(match.doc);
} catch (CorruptIndexException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(HibernateSearchManager.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(explainDoc.get("title"));
System.out.println(explanation.toString());
System.out.println(explanation.getDescription());
}
Unfortunately that does not work with fuzzy and wildcard searches, and I can't figure out how to get the actual term.
Any help very much appreciated - rico