search_queries_fsq.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. package elastic
  5. // The function_score allows you to modify the score of documents that
  6. // are retrieved by a query. This can be useful if, for example,
  7. // a score function is computationally expensive and it is sufficient
  8. // to compute the score on a filtered set of documents.
  9. // For more details, see
  10. // http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
  11. type FunctionScoreQuery struct {
  12. query Query
  13. filter Filter
  14. boost *float32
  15. maxBoost *float32
  16. scoreMode string
  17. boostMode string
  18. filters []Filter
  19. scoreFuncs []ScoreFunction
  20. }
  21. // NewFunctionScoreQuery creates a new function score query.
  22. func NewFunctionScoreQuery() FunctionScoreQuery {
  23. return FunctionScoreQuery{
  24. filters: make([]Filter, 0),
  25. scoreFuncs: make([]ScoreFunction, 0),
  26. }
  27. }
  28. func (q FunctionScoreQuery) Query(query Query) FunctionScoreQuery {
  29. q.query = query
  30. q.filter = nil
  31. return q
  32. }
  33. func (q FunctionScoreQuery) Filter(filter Filter) FunctionScoreQuery {
  34. q.query = nil
  35. q.filter = filter
  36. return q
  37. }
  38. func (q FunctionScoreQuery) Add(filter Filter, scoreFunc ScoreFunction) FunctionScoreQuery {
  39. q.filters = append(q.filters, filter)
  40. q.scoreFuncs = append(q.scoreFuncs, scoreFunc)
  41. return q
  42. }
  43. func (q FunctionScoreQuery) AddScoreFunc(scoreFunc ScoreFunction) FunctionScoreQuery {
  44. q.filters = append(q.filters, nil)
  45. q.scoreFuncs = append(q.scoreFuncs, scoreFunc)
  46. return q
  47. }
  48. func (q FunctionScoreQuery) ScoreMode(scoreMode string) FunctionScoreQuery {
  49. q.scoreMode = scoreMode
  50. return q
  51. }
  52. func (q FunctionScoreQuery) BoostMode(boostMode string) FunctionScoreQuery {
  53. q.boostMode = boostMode
  54. return q
  55. }
  56. func (q FunctionScoreQuery) MaxBoost(maxBoost float32) FunctionScoreQuery {
  57. q.maxBoost = &maxBoost
  58. return q
  59. }
  60. func (q FunctionScoreQuery) Boost(boost float32) FunctionScoreQuery {
  61. q.boost = &boost
  62. return q
  63. }
  64. // Source returns JSON for the function score query.
  65. func (q FunctionScoreQuery) Source() interface{} {
  66. source := make(map[string]interface{})
  67. query := make(map[string]interface{})
  68. source["function_score"] = query
  69. if q.query != nil {
  70. query["query"] = q.query.Source()
  71. } else if q.filter != nil {
  72. query["filter"] = q.filter.Source()
  73. }
  74. if len(q.filters) == 1 && q.filters[0] == nil {
  75. query[q.scoreFuncs[0].Name()] = q.scoreFuncs[0].Source()
  76. } else {
  77. funcs := make([]interface{}, len(q.filters))
  78. for i, filter := range q.filters {
  79. hsh := make(map[string]interface{})
  80. if filter != nil {
  81. hsh["filter"] = filter.Source()
  82. }
  83. hsh[q.scoreFuncs[i].Name()] = q.scoreFuncs[i].Source()
  84. funcs[i] = hsh
  85. }
  86. query["functions"] = funcs
  87. }
  88. if q.scoreMode != "" {
  89. query["score_mode"] = q.scoreMode
  90. }
  91. if q.boostMode != "" {
  92. query["boost_mode"] = q.boostMode
  93. }
  94. if q.maxBoost != nil {
  95. query["max_boost"] = *q.maxBoost
  96. }
  97. if q.boost != nil {
  98. query["boost"] = *q.boost
  99. }
  100. return source
  101. }