> > It looks like things have changed a bit since this subject was last
> > brought
> > up here.  I see that there are support in Solr/Lucene for indexing
> > payload
> > data (DelimitedPayloadTokenFilterFactory and
> > DelimitedPayloadTokenFilter).
> > Overriding the Similarity class is straight forward.  So the last
> > piece of
> > the puzzle is to use a BoostingTermQuery when searching.  I think
> > all I need
> > to do is to subclass Solr's LuceneQParserPlugin uses SolrQueryParser
> > under
> > the cover.  I think all I need to do is to write my own query parser
> > plugin
> > that uses a custom query parser, with the only difference being in
> the
> > getFieldQuery() method where a BoostingTermQuery is used instead of a
> > TermQuery.
>
> The BTQ is now deprecated in favor of the BoostingFunctionTermQuery,
> which gives some more flexibility in terms of how the spans in a
> single document are scored.
>
> >
> > Am I on the right track?
>
> Yes.
>
> > Has anyone done something like this already?
>

I wrote a QParserPlugin that seems to do the trick.  This is minimally tested - 
we're not actually using it at the moment, but should get you going.  Also, as 
Grant suggested, you may want to sub BFTQ for BTQ below:

package com.zoominfo.solr.analysis;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.search.*;
import org.apache.lucene.search.payloads.BoostingTermQuery;
import org.apache.solr.common.params.*;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.*;

public class BoostingTermQParserPlugin extends QParserPlugin {
  public static String NAME = "zoom";

  public void init(NamedList args) {
  }

  public QParser createParser(String qstr, SolrParams localParams, SolrParams 
params, SolrQueryRequest req) {
        System.out.print("BoostingTermQParserPlugin::createParser\n");
    return new BoostingTermQParser(qstr, localParams, params, req);
  }
}

class BoostingTermQueryParser extends QueryParser {

        public BoostingTermQueryParser(String f, Analyzer a) {
                super(f, a);
                
System.out.print("BoostingTermQueryParser::BoostingTermQueryParser\n");
        }

    @Override
        protected Query newTermQuery(Term term){
                System.out.print("BoostingTermQueryParser::newTermQuery\n");
            return new BoostingTermQuery(term);
        }
}

class BoostingTermQParser extends QParser {
  String sortStr;
  QueryParser lparser;

  public BoostingTermQParser(String qstr, SolrParams localParams, SolrParams 
params, SolrQueryRequest req) {
    super(qstr, localParams, params, req);
        System.out.print("BoostingTermQParser::BoostingTermQParser\n");
  }


  public Query parse() throws ParseException {
        System.out.print("BoostingTermQParser::parse\n");
    String qstr = getString();

    String defaultField = getParam(CommonParams.DF);
    if (defaultField==null) {
      defaultField = getReq().getSchema().getSolrQueryParser(null).getField();
    }

    lparser = new BoostingTermQueryParser(defaultField, 
getReq().getSchema().getQueryAnalyzer());

    // these could either be checked & set here, or in the SolrQueryParser 
constructor
    String opParam = getParam(QueryParsing.OP);
    if (opParam != null) {
      lparser.setDefaultOperator("AND".equals(opParam) ? 
QueryParser.Operator.AND : QueryParser.Operator.OR);
    } else {
      // try to get default operator from schema
      
lparser.setDefaultOperator(getReq().getSchema().getSolrQueryParser(null).getDefaultOperator());
    }

    return lparser.parse(qstr);
  }


  public String[] getDefaultHighlightFields() {
    return new String[]{lparser.getField()};
  }

}

Reply via email to