Hi list
For the record I have found a way to implement my requirement.
I have implemented my own CustomScoreQuery using that to check when there’s a
match bewteen my query and the specific field (f3). When there’s a match I
multiply with my boost score.
The implementation looks like this:
public class MatchedFieldBoostingQuery extends CustomScoreQuery {
String matchField;
Query q;
public MatchedFieldBoostingQuery(Query q, String matchField) {
super(q);
this.matchField = matchField;
this.q = q;
}
private class MatchedField extends CustomScoreProvider {
final BinaryDocValues matchFieldValue;
public MatchedField(AtomicReaderContext context) throws IOException {
super(context);
matchFieldValue = FieldCache.DEFAULT.getTerms(context.reader(),
matchField, false);
}
public float customScore(int doc, float subQueryScore, float
valSrcScore) {
float returnValue = subQueryScore;
HashSet<Term> terms = new HashSet<Term>();
q.extractTerms(terms);
Iterator iter = terms.iterator();
while (iter.hasNext()) {
Term term = (Term) iter.next();
if (term.field().equalsIgnoreCase(matchField)) {
BytesRef value = new BytesRef();
matchFieldValue.get(doc, value);
if (value.utf8ToString().length() > 0) {
if
(value.utf8ToString().equalsIgnoreCase(term.bytes().utf8ToString())) {
returnValue = (float) (subQueryScore * 1.3);
} else {
returnValue = (float) (subQueryScore * 0.7);
}
}
}
}
return returnValue;
}
}
public CustomScoreProvider getCustomScoreProvider(AtomicReaderContext
context) throws IOException {
return new MatchedField(context);
}
}
Den 11/04/2014 kl. 16.41 skrev Rune Stilling <[email protected]>:
> Hi list
>
> Normally when I search with multiple terms using a BooleanQuery the
> calculated weights of each term are added/summed together to give a document
> the final score. Lets say thats fine for most fields in my index. I’ll name
> these fields F1 and F2. So a weight is calculated likes this:
>
> doc weight = f1_weight + f2_weight
>
> Now I add a third field (F3) for which I want a different score calculation.
> If theres a match in this field I would like to multiply this field weight
> with the sum of the other weights, like this:
>
> doc weight = (f1_weight + f2_weight) * f3_weight
>
> This is a kind of query dependent document boost.
>
> I can’t find out where to determine/control this behavior in Lucene i.e.. how
> the document weight is calculated from each term weight.
>
> With regards,
> Rune Stilling
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]