The document discusses using the SweetSpotSimilarity algorithm for Solr fulltext indexing. SweetSpotSimilarity scores documents differently based on document length, giving higher scores to documents with lengths within a specified "sweet spot" range, with scores decreasing more steeply the further outside the range. The document provides an example configuration for Solr that sets the minimum and maximum lengths of the sweet spot range to 1000 and 20,000 tokens respectively, with a steepness of 0.5.
Using SweetSpotSimilarity for Solr Fulltext Indexing
1. Using SweetSpotSimilarity for
Solr Fulltext Indexing
(A Public Service Message)
Jay Luker
SAO/NASA Astrophysics Data System
http://adsabs.harvard.edu/
3. norm(t,d)
Includes...
● Document boost - e.g. <doc boost="2.5">
● Field boost - e.g. <field boost="3.0">
and what we're concerned with...
● lengthNorm(field) - computed at index time based
on the number of tokens in the field of the input
document.
These factors, multiplied together, make up the norm(t,
d) for a given document
4. lengthNorm(String fieldName, int numTokens)
"Matches in longer fields are less precise, so implementations of
this method usually return smaller values when numTokens is
large, and larger values when numTokens is small."
Translation:
SHORTER DOCUMENTS SCORE HIGHER
from the javadoc:
5. changes this ...
to this ...
lengthNorm(L) =
1
sqrt(L)
SweetSpotSimilarity
lucene/contrib/misc/...
lengthNorm(L) =
1
sqrt(steepness*(|L-min|+|L-max|-(max-min))+1)
6. min/max = your "sweet spot" range. Lengths within
this range compute to a constant, i.e., 1.
steepness = controls the curve up to and down from
the sweet spot "plateau".
9. public class SweetSpotSimilarityFactory extends SimilarityFactory {
public static final Logger log =
LoggerFactory.getLogger(SolrResourceLoader.class);
@Override
public Similarity getSimilarity() {
SweetSpotSimilarity sim = new SweetSpotSimilarity();
int max = this.params.getInt("max");
int min = this.params.getInt("min");
float steepness = this.params.getFloat("steepness");
log.info("max: " + max);
log.info("min: " + min);
log.info("steepness: " + steepness);
// yuck! hardcoded field settings for now
sim.setLengthNormFactors("body", min, max, steepness, true);
return sim;
}
}
10.
11.
12. Thanks!
Further reading:
"Lucene and Juru at TREC 2007: 1-Million Queries Track"
http://trec.nist.gov/pubs/trec16/papers/ibm-haifa.mq.final.pdf
Also, check out our Blacklight beta search!
http://labs.adsabs.harvard.edu/fulltext