1// Copyright 2012-2015 Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package elastic
6
7type Rescorer interface {
8	Name() string
9	Source() (interface{}, error)
10}
11
12// -- Query Rescorer --
13
14type QueryRescorer struct {
15	query              Query
16	rescoreQueryWeight *float64
17	queryWeight        *float64
18	scoreMode          string
19}
20
21func NewQueryRescorer(query Query) *QueryRescorer {
22	return &QueryRescorer{
23		query: query,
24	}
25}
26
27func (r *QueryRescorer) Name() string {
28	return "query"
29}
30
31func (r *QueryRescorer) RescoreQueryWeight(rescoreQueryWeight float64) *QueryRescorer {
32	r.rescoreQueryWeight = &rescoreQueryWeight
33	return r
34}
35
36func (r *QueryRescorer) QueryWeight(queryWeight float64) *QueryRescorer {
37	r.queryWeight = &queryWeight
38	return r
39}
40
41func (r *QueryRescorer) ScoreMode(scoreMode string) *QueryRescorer {
42	r.scoreMode = scoreMode
43	return r
44}
45
46func (r *QueryRescorer) Source() (interface{}, error) {
47	rescoreQuery, err := r.query.Source()
48	if err != nil {
49		return nil, err
50	}
51
52	source := make(map[string]interface{})
53	source["rescore_query"] = rescoreQuery
54	if r.queryWeight != nil {
55		source["query_weight"] = *r.queryWeight
56	}
57	if r.rescoreQueryWeight != nil {
58		source["rescore_query_weight"] = *r.rescoreQueryWeight
59	}
60	if r.scoreMode != "" {
61		source["score_mode"] = r.scoreMode
62	}
63	return source, nil
64}
65