1// Copyright 2012-present 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 7import ( 8 "encoding/json" 9 "testing" 10) 11 12func TestFunctionScoreQuery(t *testing.T) { 13 q := NewFunctionScoreQuery(). 14 Query(NewTermQuery("name.last", "banon")). 15 Add(NewTermQuery("name.last", "banon"), NewWeightFactorFunction(1.5)). 16 AddScoreFunc(NewWeightFactorFunction(3)). 17 AddScoreFunc(NewRandomFunction()). 18 Boost(3). 19 MaxBoost(10). 20 ScoreMode("avg") 21 src, err := q.Source() 22 if err != nil { 23 t.Fatal(err) 24 } 25 data, err := json.Marshal(src) 26 if err != nil { 27 t.Fatalf("marshaling to JSON failed: %v", err) 28 } 29 got := string(data) 30 expected := `{"function_score":{"boost":3,"functions":[{"filter":{"term":{"name.last":"banon"}},"weight":1.5},{"weight":3},{"random_score":{}}],"max_boost":10,"query":{"term":{"name.last":"banon"}},"score_mode":"avg"}}` 31 if got != expected { 32 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 33 } 34} 35 36func TestFunctionScoreQueryWithNilFilter(t *testing.T) { 37 q := NewFunctionScoreQuery(). 38 Query(NewTermQuery("tag", "wow")). 39 AddScoreFunc(NewRandomFunction()). 40 Boost(2.0). 41 MaxBoost(12.0). 42 BoostMode("multiply"). 43 ScoreMode("max") 44 src, err := q.Source() 45 if err != nil { 46 t.Fatal(err) 47 } 48 data, err := json.Marshal(src) 49 if err != nil { 50 t.Fatalf("marshaling to JSON failed: %v", err) 51 } 52 got := string(data) 53 expected := `{"function_score":{"boost":2,"boost_mode":"multiply","max_boost":12,"query":{"term":{"tag":"wow"}},"random_score":{},"score_mode":"max"}}` 54 if got != expected { 55 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 56 } 57} 58 59func TestFieldValueFactor(t *testing.T) { 60 q := NewFunctionScoreQuery(). 61 Query(NewTermQuery("name.last", "banon")). 62 AddScoreFunc(NewFieldValueFactorFunction().Modifier("sqrt").Factor(2).Field("income")). 63 Boost(2.0). 64 MaxBoost(12.0). 65 BoostMode("multiply"). 66 ScoreMode("max") 67 src, err := q.Source() 68 if err != nil { 69 t.Fatal(err) 70 } 71 data, err := json.Marshal(src) 72 if err != nil { 73 t.Fatalf("marshaling to JSON failed: %v", err) 74 } 75 got := string(data) 76 expected := `{"function_score":{"boost":2,"boost_mode":"multiply","field_value_factor":{"factor":2,"field":"income","modifier":"sqrt"},"max_boost":12,"query":{"term":{"name.last":"banon"}},"score_mode":"max"}}` 77 if got != expected { 78 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 79 } 80} 81 82func TestFieldValueFactorWithWeight(t *testing.T) { 83 q := NewFunctionScoreQuery(). 84 Query(NewTermQuery("name.last", "banon")). 85 AddScoreFunc(NewFieldValueFactorFunction().Modifier("sqrt").Factor(2).Field("income").Weight(2.5)). 86 Boost(2.0). 87 MaxBoost(12.0). 88 BoostMode("multiply"). 89 ScoreMode("max") 90 src, err := q.Source() 91 if err != nil { 92 t.Fatal(err) 93 } 94 data, err := json.Marshal(src) 95 if err != nil { 96 t.Fatalf("marshaling to JSON failed: %v", err) 97 } 98 got := string(data) 99 expected := `{"function_score":{"boost":2,"boost_mode":"multiply","field_value_factor":{"factor":2,"field":"income","modifier":"sqrt"},"max_boost":12,"query":{"term":{"name.last":"banon"}},"score_mode":"max","weight":2.5}}` 100 if got != expected { 101 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 102 } 103} 104 105func TestFieldValueFactorWithMultipleScoreFuncsAndWeights(t *testing.T) { 106 q := NewFunctionScoreQuery(). 107 Query(NewTermQuery("name.last", "banon")). 108 AddScoreFunc(NewFieldValueFactorFunction().Modifier("sqrt").Factor(2).Field("income").Weight(2.5)). 109 AddScoreFunc(NewScriptFunction(NewScript("_score * doc['my_numeric_field'].value")).Weight(1.25)). 110 AddScoreFunc(NewWeightFactorFunction(0.5)). 111 Boost(2.0). 112 MaxBoost(12.0). 113 BoostMode("multiply"). 114 ScoreMode("max") 115 src, err := q.Source() 116 if err != nil { 117 t.Fatal(err) 118 } 119 data, err := json.Marshal(src) 120 if err != nil { 121 t.Fatalf("marshaling to JSON failed: %v", err) 122 } 123 got := string(data) 124 expected := `{"function_score":{"boost":2,"boost_mode":"multiply","functions":[{"field_value_factor":{"factor":2,"field":"income","modifier":"sqrt"},"weight":2.5},{"script_score":{"script":{"inline":"_score * doc['my_numeric_field'].value"}},"weight":1.25},{"weight":0.5}],"max_boost":12,"query":{"term":{"name.last":"banon"}},"score_mode":"max"}}` 125 if got != expected { 126 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 127 } 128} 129 130func TestFunctionScoreQueryWithGaussScoreFunc(t *testing.T) { 131 q := NewFunctionScoreQuery(). 132 Query(NewTermQuery("name.last", "banon")). 133 AddScoreFunc(NewGaussDecayFunction().FieldName("pin.location").Origin("11, 12").Scale("2km").Offset("0km").Decay(0.33)) 134 src, err := q.Source() 135 if err != nil { 136 t.Fatal(err) 137 } 138 data, err := json.Marshal(src) 139 if err != nil { 140 t.Fatalf("marshaling to JSON failed: %v", err) 141 } 142 got := string(data) 143 expected := `{"function_score":{"gauss":{"pin.location":{"decay":0.33,"offset":"0km","origin":"11, 12","scale":"2km"}},"query":{"term":{"name.last":"banon"}}}}` 144 if got != expected { 145 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 146 } 147} 148 149func TestFunctionScoreQueryWithGaussScoreFuncAndMultiValueMode(t *testing.T) { 150 q := NewFunctionScoreQuery(). 151 Query(NewTermQuery("name.last", "banon")). 152 AddScoreFunc(NewGaussDecayFunction().FieldName("pin.location").Origin("11, 12").Scale("2km").Offset("0km").Decay(0.33).MultiValueMode("avg")) 153 src, err := q.Source() 154 if err != nil { 155 t.Fatal(err) 156 } 157 data, err := json.Marshal(src) 158 if err != nil { 159 t.Fatalf("marshaling to JSON failed: %v", err) 160 } 161 got := string(data) 162 expected := `{"function_score":{"gauss":{"multi_value_mode":"avg","pin.location":{"decay":0.33,"offset":"0km","origin":"11, 12","scale":"2km"}},"query":{"term":{"name.last":"banon"}}}}` 163 if got != expected { 164 t.Errorf("expected\n%s\n,got:\n%s", expected, got) 165 } 166} 167