Re: Solr Highlighting not working with PayloadTermQueries

2012-02-22 Thread Koji Sekiguchi

(12/02/22 7:53), Nitin Arora wrote:

Hi,

I'm using SOLR and Lucene in my application for search.

I'm facing an issue of highlighting using FastVectorHighlighter not working
when I use PayloadTermQueries as clauses of a BooleanQuery.

After Debugging I found that In DefaultSolrHighlighter.Java,
fvh.getFieldQuery does not return any term in the termMap.

FastVectorHighlighter fvh = new FastVectorHighlighter(
 // FVH cannot process hl.usePhraseHighlighter parameter per-field
basis
 params.getBool( HighlightParams.USE_PHRASE_HIGHLIGHTER, true ),
 // FVH cannot process hl.requireFieldMatch parameter per-field basis
 params.getBool( HighlightParams.FIELD_MATCH, false ) );

FieldQuery fieldQuery = fvh.getFieldQuery( query );

The reason of empty termmap is, PayloadTermQuery is discarded while
constructing the FieldQuery.

void flatten( Query sourceQuery, CollectionQuery  flatQueries ){
 if( sourceQuery instanceof BooleanQuery ){
   BooleanQuery bq = (BooleanQuery)sourceQuery;
   for( BooleanClause clause : bq.getClauses() ){
 if( !clause.isProhibited() )
   flatten( clause.getQuery(), flatQueries );
   }
 }
 else if( sourceQuery instanceof DisjunctionMaxQuery ){
   DisjunctionMaxQuery dmq = (DisjunctionMaxQuery)sourceQuery;
   for( Query query : dmq ){
 flatten( query, flatQueries );
   }
 }
 else if( sourceQuery instanceof TermQuery ){
   if( !flatQueries.contains( sourceQuery ) )
 flatQueries.add( sourceQuery );
 }
 else if( sourceQuery instanceof PhraseQuery ){
   if( !flatQueries.contains( sourceQuery ) ){
 PhraseQuery pq = (PhraseQuery)sourceQuery;
 if( pq.getTerms().length  1 )
   flatQueries.add( pq );
 else if( pq.getTerms().length == 1 ){
   flatQueries.add( new TermQuery( pq.getTerms()[0] ) );
 }
   }
 }
 // else discard queries
   }

What is the best way to get highlighting working with Payload Term Queries?


Hi Nitin,

Thank you for reporting this problem! Your assumption is correct.
FVH discards PayloadTermQueries in flatten() method.

Though I'm not familiar with SpanQueries so much, but looks like SpanTermQuery 
which is
the super class of PayloadTermQuery, has getTerm() method. Do you think if 
flatten()
can recognize SpanTermQuery and then add the term to flatQueries, it solves 
your problem?

If so, please open a jira ticket. And if you can, attach a patch would help a 
lot!

koji
--
Query Log Visualizer for Apache Solr
http://soleami.com/


Solr Highlighting not working with PayloadTermQueries

2012-02-21 Thread Nitin Arora
Hi, 

I'm using SOLR and Lucene in my application for search. 

I'm facing an issue of highlighting using FastVectorHighlighter not working
when I use PayloadTermQueries as clauses of a BooleanQuery. 

After Debugging I found that In DefaultSolrHighlighter.Java,
fvh.getFieldQuery does not return any term in the termMap. 

FastVectorHighlighter fvh = new FastVectorHighlighter( 
// FVH cannot process hl.usePhraseHighlighter parameter per-field
basis 
params.getBool( HighlightParams.USE_PHRASE_HIGHLIGHTER, true ), 
// FVH cannot process hl.requireFieldMatch parameter per-field basis 
params.getBool( HighlightParams.FIELD_MATCH, false ) ); 

FieldQuery fieldQuery = fvh.getFieldQuery( query );

The reason of empty termmap is, PayloadTermQuery is discarded while
constructing the FieldQuery. 

void flatten( Query sourceQuery, CollectionQuery flatQueries ){ 
if( sourceQuery instanceof BooleanQuery ){ 
  BooleanQuery bq = (BooleanQuery)sourceQuery; 
  for( BooleanClause clause : bq.getClauses() ){ 
if( !clause.isProhibited() ) 
  flatten( clause.getQuery(), flatQueries ); 
  } 
} 
else if( sourceQuery instanceof DisjunctionMaxQuery ){ 
  DisjunctionMaxQuery dmq = (DisjunctionMaxQuery)sourceQuery; 
  for( Query query : dmq ){ 
flatten( query, flatQueries ); 
  } 
} 
else if( sourceQuery instanceof TermQuery ){ 
  if( !flatQueries.contains( sourceQuery ) ) 
flatQueries.add( sourceQuery ); 
} 
else if( sourceQuery instanceof PhraseQuery ){ 
  if( !flatQueries.contains( sourceQuery ) ){ 
PhraseQuery pq = (PhraseQuery)sourceQuery; 
if( pq.getTerms().length  1 ) 
  flatQueries.add( pq ); 
else if( pq.getTerms().length == 1 ){ 
  flatQueries.add( new TermQuery( pq.getTerms()[0] ) ); 
} 
  } 
} 
// else discard queries 
  } 

What is the best way to get highlighting working with Payload Term Queries? 

Thanks 
Nitin

--
View this message in context: 
http://lucene.472066.n3.nabble.com/Solr-Highlighting-not-working-with-PayloadTermQueries-tp3765093p3765093.html
Sent from the Solr - User mailing list archive at Nabble.com.