You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
6.2 KiB
214 lines
6.2 KiB
2 years ago
|
// Copyright 2012-present Oliver Eilhard. All rights reserved.
|
||
|
// Use of this source code is governed by a MIT-license.
|
||
|
// See http://olivere.mit-license.org/license.txt for details.
|
||
|
|
||
|
package es
|
||
|
|
||
|
// RankFeatureQuery boosts the relevance score of documents based on the
|
||
|
// numeric value of a rank_feature or rank_features field.
|
||
|
//
|
||
|
// The RankFeatureQuery is typically used in the should clause of a BoolQuery
|
||
|
// so its relevance scores are added to other scores from the BoolQuery.
|
||
|
//
|
||
|
// For more details, see:
|
||
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-rank-feature-query.html
|
||
|
type RankFeatureQuery struct {
|
||
|
field string
|
||
|
scoreFunc RankFeatureScoreFunction
|
||
|
boost *float64
|
||
|
queryName string
|
||
|
}
|
||
|
|
||
|
// NewRankFeatureQuery creates and initializes a new RankFeatureQuery.
|
||
|
func NewRankFeatureQuery(field string) *RankFeatureQuery {
|
||
|
return &RankFeatureQuery{
|
||
|
field: field,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Field name.
|
||
|
func (q *RankFeatureQuery) Field(field string) *RankFeatureQuery {
|
||
|
q.field = field
|
||
|
return q
|
||
|
}
|
||
|
|
||
|
// ScoreFunction specifies the score function for the RankFeatureQuery.
|
||
|
func (q *RankFeatureQuery) ScoreFunction(f RankFeatureScoreFunction) *RankFeatureQuery {
|
||
|
q.scoreFunc = f
|
||
|
return q
|
||
|
}
|
||
|
|
||
|
// Boost sets the boost for this query.
|
||
|
func (q *RankFeatureQuery) Boost(boost float64) *RankFeatureQuery {
|
||
|
q.boost = &boost
|
||
|
return q
|
||
|
}
|
||
|
|
||
|
// QueryName sets the query name for the filter that can be used when
|
||
|
// searching for matched_filters per hit.
|
||
|
func (q *RankFeatureQuery) QueryName(queryName string) *RankFeatureQuery {
|
||
|
q.queryName = queryName
|
||
|
return q
|
||
|
}
|
||
|
|
||
|
// Source returns the JSON serializable content for this query.
|
||
|
func (q *RankFeatureQuery) Source() (interface{}, error) {
|
||
|
// {
|
||
|
// "rank_feature": {
|
||
|
// "field": "pagerank",
|
||
|
// "saturation": {
|
||
|
// "pivot": 8
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
query := make(map[string]interface{})
|
||
|
params := make(map[string]interface{})
|
||
|
query["rank_feature"] = params
|
||
|
params["field"] = q.field
|
||
|
if q.scoreFunc != nil {
|
||
|
src, err := q.scoreFunc.Source()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
params[q.scoreFunc.Name()] = src
|
||
|
}
|
||
|
if q.boost != nil {
|
||
|
params["boost"] = *q.boost
|
||
|
}
|
||
|
if q.queryName != "" {
|
||
|
params["_name"] = q.queryName
|
||
|
}
|
||
|
|
||
|
return query, nil
|
||
|
}
|
||
|
|
||
|
// -- Score functions --
|
||
|
|
||
|
// RankFeatureScoreFunction specifies the interface for score functions
|
||
|
// in the context of a RankFeatureQuery.
|
||
|
type RankFeatureScoreFunction interface {
|
||
|
Name() string
|
||
|
Source() (interface{}, error)
|
||
|
}
|
||
|
|
||
|
// -- Log score function --
|
||
|
|
||
|
// RankFeatureLogScoreFunction represents a Logarithmic score function for a
|
||
|
// RankFeatureQuery.
|
||
|
//
|
||
|
// See here for details:
|
||
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-rank-feature-query.html#rank-feature-query-logarithm
|
||
|
type RankFeatureLogScoreFunction struct {
|
||
|
scalingFactor float64
|
||
|
}
|
||
|
|
||
|
// NewRankFeatureLogScoreFunction returns a new RankFeatureLogScoreFunction
|
||
|
// with the given scaling factor.
|
||
|
func NewRankFeatureLogScoreFunction(scalingFactor float64) *RankFeatureLogScoreFunction {
|
||
|
return &RankFeatureLogScoreFunction{
|
||
|
scalingFactor: scalingFactor,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Name of the score function.
|
||
|
func (f *RankFeatureLogScoreFunction) Name() string { return "log" }
|
||
|
|
||
|
// Source returns a serializable JSON object for building the query.
|
||
|
func (f *RankFeatureLogScoreFunction) Source() (interface{}, error) {
|
||
|
return map[string]interface{}{
|
||
|
"scaling_factor": f.scalingFactor,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// -- Saturation score function --
|
||
|
|
||
|
// RankFeatureSaturationScoreFunction represents a Log score function for a
|
||
|
// RankFeatureQuery.
|
||
|
//
|
||
|
// See here for details:
|
||
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-rank-feature-query.html#rank-feature-query-saturation
|
||
|
type RankFeatureSaturationScoreFunction struct {
|
||
|
pivot *float64
|
||
|
}
|
||
|
|
||
|
// NewRankFeatureSaturationScoreFunction initializes a new
|
||
|
// RankFeatureSaturationScoreFunction.
|
||
|
func NewRankFeatureSaturationScoreFunction() *RankFeatureSaturationScoreFunction {
|
||
|
return &RankFeatureSaturationScoreFunction{}
|
||
|
}
|
||
|
|
||
|
// Pivot specifies the pivot to use.
|
||
|
func (f *RankFeatureSaturationScoreFunction) Pivot(pivot float64) *RankFeatureSaturationScoreFunction {
|
||
|
f.pivot = &pivot
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
// Name of the score function.
|
||
|
func (f *RankFeatureSaturationScoreFunction) Name() string { return "saturation" }
|
||
|
|
||
|
// Source returns a serializable JSON object for building the query.
|
||
|
func (f *RankFeatureSaturationScoreFunction) Source() (interface{}, error) {
|
||
|
m := make(map[string]interface{})
|
||
|
if f.pivot != nil {
|
||
|
m["pivot"] = *f.pivot
|
||
|
}
|
||
|
return m, nil
|
||
|
}
|
||
|
|
||
|
// -- Sigmoid score function --
|
||
|
|
||
|
// RankFeatureSigmoidScoreFunction represents a Sigmoid score function for a
|
||
|
// RankFeatureQuery.
|
||
|
//
|
||
|
// See here for details:
|
||
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-rank-feature-query.html#rank-feature-query-sigmoid
|
||
|
type RankFeatureSigmoidScoreFunction struct {
|
||
|
pivot float64
|
||
|
exponent float64
|
||
|
}
|
||
|
|
||
|
// NewRankFeatureSigmoidScoreFunction returns a new RankFeatureSigmoidScoreFunction
|
||
|
// with the given scaling factor.
|
||
|
func NewRankFeatureSigmoidScoreFunction(pivot, exponent float64) *RankFeatureSigmoidScoreFunction {
|
||
|
return &RankFeatureSigmoidScoreFunction{
|
||
|
pivot: pivot,
|
||
|
exponent: exponent,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Name of the score function.
|
||
|
func (f *RankFeatureSigmoidScoreFunction) Name() string { return "sigmoid" }
|
||
|
|
||
|
// Source returns a serializable JSON object for building the query.
|
||
|
func (f *RankFeatureSigmoidScoreFunction) Source() (interface{}, error) {
|
||
|
return map[string]interface{}{
|
||
|
"pivot": f.pivot,
|
||
|
"exponent": f.exponent,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// -- Linear score function --
|
||
|
|
||
|
// RankFeatureLinearScoreFunction represents a Linear score function for a
|
||
|
// RankFeatureQuery.
|
||
|
//
|
||
|
// See here for details:
|
||
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-rank-feature-query.html#rank-feature-query-linear
|
||
|
type RankFeatureLinearScoreFunction struct {
|
||
|
}
|
||
|
|
||
|
// NewRankFeatureLinearScoreFunction initializes a new
|
||
|
// RankFeatureLinearScoreFunction.
|
||
|
func NewRankFeatureLinearScoreFunction() *RankFeatureLinearScoreFunction {
|
||
|
return &RankFeatureLinearScoreFunction{}
|
||
|
}
|
||
|
|
||
|
// Name of the score function.
|
||
|
func (f *RankFeatureLinearScoreFunction) Name() string { return "linear" }
|
||
|
|
||
|
// Source returns a serializable JSON object for building the query.
|
||
|
func (f *RankFeatureLinearScoreFunction) Source() (interface{}, error) {
|
||
|
return map[string]interface{}{}, nil
|
||
|
}
|