1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// Copyright 2012-2015 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 elastic
// The function_score allows you to modify the score of documents that
// are retrieved by a query. This can be useful if, for example,
// a score function is computationally expensive and it is sufficient
// to compute the score on a filtered set of documents.
// For more details, see
// http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
type FunctionScoreQuery struct {
query Query
filter Filter
boost *float32
maxBoost *float32
scoreMode string
boostMode string
filters []Filter
scoreFuncs []ScoreFunction
minScore *float32
weight *float64
}
// NewFunctionScoreQuery creates a new function score query.
func NewFunctionScoreQuery() FunctionScoreQuery {
return FunctionScoreQuery{
filters: make([]Filter, 0),
scoreFuncs: make([]ScoreFunction, 0),
}
}
func (q FunctionScoreQuery) Query(query Query) FunctionScoreQuery {
q.query = query
q.filter = nil
return q
}
func (q FunctionScoreQuery) Filter(filter Filter) FunctionScoreQuery {
q.query = nil
q.filter = filter
return q
}
func (q FunctionScoreQuery) Add(filter Filter, scoreFunc ScoreFunction) FunctionScoreQuery {
q.filters = append(q.filters, filter)
q.scoreFuncs = append(q.scoreFuncs, scoreFunc)
return q
}
func (q FunctionScoreQuery) AddScoreFunc(scoreFunc ScoreFunction) FunctionScoreQuery {
q.filters = append(q.filters, nil)
q.scoreFuncs = append(q.scoreFuncs, scoreFunc)
return q
}
func (q FunctionScoreQuery) ScoreMode(scoreMode string) FunctionScoreQuery {
q.scoreMode = scoreMode
return q
}
func (q FunctionScoreQuery) BoostMode(boostMode string) FunctionScoreQuery {
q.boostMode = boostMode
return q
}
func (q FunctionScoreQuery) MaxBoost(maxBoost float32) FunctionScoreQuery {
q.maxBoost = &maxBoost
return q
}
func (q FunctionScoreQuery) Boost(boost float32) FunctionScoreQuery {
q.boost = &boost
return q
}
func (q FunctionScoreQuery) MinScore(minScore float32) FunctionScoreQuery {
q.minScore = &minScore
return q
}
// Source returns JSON for the function score query.
func (q FunctionScoreQuery) Source() interface{} {
source := make(map[string]interface{})
query := make(map[string]interface{})
source["function_score"] = query
if q.query != nil {
query["query"] = q.query.Source()
} else if q.filter != nil {
query["filter"] = q.filter.Source()
}
if len(q.filters) == 1 && q.filters[0] == nil {
// Weight needs to be serialized on this level.
if weight := q.scoreFuncs[0].GetWeight(); weight != nil {
query["weight"] = weight
}
// Serialize the score function
query[q.scoreFuncs[0].Name()] = q.scoreFuncs[0].Source()
} else {
funcs := make([]interface{}, len(q.filters))
for i, filter := range q.filters {
hsh := make(map[string]interface{})
if filter != nil {
hsh["filter"] = filter.Source()
}
// Weight needs to be serialized on this level.
if weight := q.scoreFuncs[i].GetWeight(); weight != nil {
hsh["weight"] = weight
}
// Serialize the score function
hsh[q.scoreFuncs[i].Name()] = q.scoreFuncs[i].Source()
funcs[i] = hsh
}
query["functions"] = funcs
}
if q.scoreMode != "" {
query["score_mode"] = q.scoreMode
}
if q.boostMode != "" {
query["boost_mode"] = q.boostMode
}
if q.maxBoost != nil {
query["max_boost"] = *q.maxBoost
}
if q.boost != nil {
query["boost"] = *q.boost
}
if q.minScore != nil {
query["min_score"] = *q.minScore
}
return source
}
|