org.apache.lucene.misc

## Class SweetSpotSimilarity

- java.lang.Object
- - org.apache.lucene.search.similarities.Similarity
  - - org.apache.lucene.search.similarities.TFIDFSimilarity
    - - org.apache.lucene.search.similarities.DefaultSimilarity
      - - org.apache.lucene.misc.SweetSpotSimilarity

    public class SweetSpotSimilarity
    extends DefaultSimilarity

A similarity with a lengthNorm that provides for a "plateau" of equally good lengths, and tf helper functions.

For lengthNorm, A min/max can be specified to define the plateau of lengths that should all have a norm of 1.0. Below the min, and above the max the lengthNorm drops off in a sqrt function.

For tf, baselineTf and hyperbolicTf functions are provided, which subclasses can choose between.

See Also:
  A Gnuplot file used to generate some of the visualizations refrenced from each function.

### Nested Class Summary

### Nested classes/interfaces inherited from class org.apache.lucene.search.similarities.Similarity

`Similarity.ExactSimScorer, Similarity.SimWeight, Similarity.SloppySimScorer`

### Field Summary

### Fields inherited from class org.apache.lucene.search.similarities.DefaultSimilarity

`discountOverlaps`

### Constructor Summary

Constructors
Constructor and Description
`SweetSpotSimilarity()`

### Method Summary

Methods
`float` `baselineTf(float freq)` Implemented as: `(x <= min) ? base : sqrt(x+(base**2)-min)` ...but with a special case check for 0.
`float` `computeLengthNorm(int numTerms)` Implemented as: `1/sqrt( steepness * (abs(x-min) + abs(x-max) - (max-min)) + 1 )` .
`float` `hyperbolicTf(float freq)` Uses a hyperbolic tangent function that allows for a hard max...
`float` `lengthNorm(FieldInvertState state)` Implemented as `state.getBoost() * computeLengthNorm(numTokens)` where numTokens does not count overlap tokens if discountOverlaps is true by default or true for this specific field.
`void` `setBaselineTfFactors(float base, float min)` Sets the baseline and minimum function variables for baselineTf
`void` `setHyperbolicTfFactors(float min, float max, double base, float xoffset)` Sets the function variables for the hyperbolicTf functions
`void` `setLengthNormFactors(int min, int max, float steepness, boolean discountOverlaps)` Sets the default function variables used by lengthNorm when no field specific variables have been set.
`float` `tf(int freq)` Delegates to baselineTf

### Methods inherited from class org.apache.lucene.search.similarities.DefaultSimilarity

`coord, getDiscountOverlaps, idf, queryNorm, scorePayload, setDiscountOverlaps, sloppyFreq, tf, toString`

### Methods inherited from class org.apache.lucene.search.similarities.TFIDFSimilarity

`computeNorm, computeWeight, decodeNormValue, encodeNormValue, exactSimScorer, idfExplain, idfExplain, sloppySimScorer`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Constructor Detail

#### SweetSpotSimilarity

    public SweetSpotSimilarity()

### Method Detail

#### setBaselineTfFactors

    public void setBaselineTfFactors(float base,
                            float min)

Sets the baseline and minimum function variables for baselineTf

See Also:
  `baselineTf(float)`

#### setHyperbolicTfFactors

    public void setHyperbolicTfFactors(float min,
                              float max,
                              double base,
                              float xoffset)

Sets the function variables for the hyperbolicTf functions

Parameters:
  `min` - the minimum tf value to ever be returned (default: 0.0)
  `max` - the maximum tf value to ever be returned (default: 2.0)
  `base` - the base value to be used in the exponential for the hyperbolic function (default: 1.3)
  `xoffset` - the midpoint of the hyperbolic function (default: 10.0)
See Also:
  `hyperbolicTf(float)`

#### setLengthNormFactors

    public void setLengthNormFactors(int min,
                            int max,
                            float steepness,
                            boolean discountOverlaps)

Sets the default function variables used by lengthNorm when no field specific variables have been set.

See Also:
  `computeLengthNorm(int)`

#### lengthNorm

    public float lengthNorm(FieldInvertState state)

Implemented as `state.getBoost() * computeLengthNorm(numTokens)` where numTokens does not count overlap tokens if discountOverlaps is true by default or true for this specific field.

Overrides:
  `lengthNorm` in class `DefaultSimilarity`

#### computeLengthNorm

    public float computeLengthNorm(int numTerms)

Implemented as: `1/sqrt( steepness * (abs(x-min) + abs(x-max) - (max-min)) + 1 )` .

This degrades to `1/sqrt(x)` when min and max are both 1 and steepness is 0.5

:TODO: potential optimization is to just flat out return 1.0f if numTerms is between min and max.

See Also:
  `setLengthNormFactors(int, int, float, boolean)`, An SVG visualization of this function

#### tf

    public float tf(int freq)

Delegates to baselineTf

Overrides:
  `tf` in class `TFIDFSimilarity`
See Also:
  `baselineTf(float)`

#### baselineTf

    public float baselineTf(float freq)

Implemented as: `(x <= min) ? base : sqrt(x+(base**2)-min)` ...but with a special case check for 0.

This degrates to `sqrt(x)` when min and base are both 0

See Also:
  `setBaselineTfFactors(float, float)`, An SVG visualization of this function

#### hyperbolicTf

    public float hyperbolicTf(float freq)

Uses a hyperbolic tangent function that allows for a hard max... `tf(x)=min+(max-min)/2*(((base**(x-xoffset)-base**-(x-xoffset))/(base**(x-xoffset)+base**-(x-xoffset)))+1)`

This code is provided as a convenience for subclasses that want to use a hyperbolic tf function.

See Also:
  `setHyperbolicTfFactors(float, float, double, float)`, An SVG visualization of this function