Oops, forgot to include the class I mentioned. Here it is:

public class QueryTermBoostingQuery extends CustomScoreQuery {
  private Map<String, Float> queryTermWeights;
  private float bias;
  private IndexReader indexReader;

  public QueryTermBoostingQuery( Query q, Map<String, Float> termWeights,
IndexReader indexReader, float bias) {
    super( q );
    this.indexReader = indexReader;
    if (bias < 0 || bias > 1) {
      throw new IllegalArgumentException( "Bias must be between 0 and 1" );
    }
    this.bias = bias;
    queryTermWeights = termWeights;
  }

  @Override
  public float customScore( int doc, float subQueryScore, float valSrcScore
) {
    Document document;
    try {
      document = indexReader.document( doc );
    } catch (IOException e) {
      throw new SearchException( e );
    }
    float termWeightedScore = 0;

    for (String field : queryTermWeights.keySet()) {
      String docFieldValue = document.get( field );
      if (docFieldValue != null) {
        Float weight = queryTermWeights.get( field );
        if (weight != null) {
          termWeightedScore += weight * Float.parseFloat( docFieldValue );
        }
      }
    }
    return bias * subQueryScore + (1 - bias) * termWeightedScore;
  }
}

On Thu, Oct 8, 2009 at 7:54 AM, scott w <scottbl...@gmail.com> wrote:

> I am trying to come up with a performant query that will allow me to use a
> custom score where the custom score is a sum-product over a set of query
> time weights where each weight gets applied only if the query time term
> exists in the document . So for example if I have a doc with three fields:
> company=Microsoft, city=Redmond, and size=large, I may want to score that
> document according to the following function: city==Microsoft ? .3 : 0 *
> size ==large ? 0.5 : 0 to get a score of 0.8. Attached is a subclass I have
> tested that implements this with one extra component which is that it allow
> the relevance score to be combined in.
>
> The problem is this custom score is not performant at all. For example, on
> a small index of 5 million documents with 10 weights passed in it does 0.01
> req/sec.
>
> Are there ways to make to compute the same custom score but in a much more
> performant way?
>
> thanks,
> Scott
>

Reply via email to