suggester_completion.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. // CompletionSuggester is a fast suggester for e.g. type-ahead completion.
  6. // See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html
  7. // for more details.
  8. type CompletionSuggester struct {
  9. Suggester
  10. name string
  11. text string
  12. field string
  13. analyzer string
  14. size *int
  15. shardSize *int
  16. contextQueries []SuggesterContextQuery
  17. }
  18. // Creates a new completion suggester.
  19. func NewCompletionSuggester(name string) CompletionSuggester {
  20. return CompletionSuggester{
  21. name: name,
  22. contextQueries: make([]SuggesterContextQuery, 0),
  23. }
  24. }
  25. func (q CompletionSuggester) Name() string {
  26. return q.name
  27. }
  28. func (q CompletionSuggester) Text(text string) CompletionSuggester {
  29. q.text = text
  30. return q
  31. }
  32. func (q CompletionSuggester) Field(field string) CompletionSuggester {
  33. q.field = field
  34. return q
  35. }
  36. func (q CompletionSuggester) Analyzer(analyzer string) CompletionSuggester {
  37. q.analyzer = analyzer
  38. return q
  39. }
  40. func (q CompletionSuggester) Size(size int) CompletionSuggester {
  41. q.size = &size
  42. return q
  43. }
  44. func (q CompletionSuggester) ShardSize(shardSize int) CompletionSuggester {
  45. q.shardSize = &shardSize
  46. return q
  47. }
  48. func (q CompletionSuggester) ContextQuery(query SuggesterContextQuery) CompletionSuggester {
  49. q.contextQueries = append(q.contextQueries, query)
  50. return q
  51. }
  52. func (q CompletionSuggester) ContextQueries(queries ...SuggesterContextQuery) CompletionSuggester {
  53. q.contextQueries = append(q.contextQueries, queries...)
  54. return q
  55. }
  56. // completionSuggesterRequest is necessary because the order in which
  57. // the JSON elements are routed to Elasticsearch is relevant.
  58. // We got into trouble when using plain maps because the text element
  59. // needs to go before the completion element.
  60. type completionSuggesterRequest struct {
  61. Text string `json:"text"`
  62. Completion interface{} `json:"completion"`
  63. }
  64. // Creates the source for the completion suggester.
  65. func (q CompletionSuggester) Source(includeName bool) interface{} {
  66. cs := &completionSuggesterRequest{}
  67. if q.text != "" {
  68. cs.Text = q.text
  69. }
  70. suggester := make(map[string]interface{})
  71. cs.Completion = suggester
  72. if q.analyzer != "" {
  73. suggester["analyzer"] = q.analyzer
  74. }
  75. if q.field != "" {
  76. suggester["field"] = q.field
  77. }
  78. if q.size != nil {
  79. suggester["size"] = *q.size
  80. }
  81. if q.shardSize != nil {
  82. suggester["shard_size"] = *q.shardSize
  83. }
  84. switch len(q.contextQueries) {
  85. case 0:
  86. case 1:
  87. suggester["context"] = q.contextQueries[0].Source()
  88. default:
  89. ctxq := make([]interface{}, 0)
  90. for _, query := range q.contextQueries {
  91. ctxq = append(ctxq, query.Source())
  92. }
  93. suggester["context"] = ctxq
  94. }
  95. // TODO(oe) Add competion-suggester specific parameters here
  96. if !includeName {
  97. return cs
  98. }
  99. source := make(map[string]interface{})
  100. source[q.name] = cs
  101. return source
  102. }