multi_get.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. import (
  6. "encoding/json"
  7. "fmt"
  8. "net/url"
  9. )
  10. type MultiGetService struct {
  11. client *Client
  12. preference string
  13. realtime *bool
  14. refresh *bool
  15. items []*MultiGetItem
  16. }
  17. func NewMultiGetService(client *Client) *MultiGetService {
  18. builder := &MultiGetService{
  19. client: client,
  20. items: make([]*MultiGetItem, 0),
  21. }
  22. return builder
  23. }
  24. func (b *MultiGetService) Preference(preference string) *MultiGetService {
  25. b.preference = preference
  26. return b
  27. }
  28. func (b *MultiGetService) Refresh(refresh bool) *MultiGetService {
  29. b.refresh = &refresh
  30. return b
  31. }
  32. func (b *MultiGetService) Realtime(realtime bool) *MultiGetService {
  33. b.realtime = &realtime
  34. return b
  35. }
  36. func (b *MultiGetService) Add(items ...*MultiGetItem) *MultiGetService {
  37. b.items = append(b.items, items...)
  38. return b
  39. }
  40. func (b *MultiGetService) Source() interface{} {
  41. source := make(map[string]interface{})
  42. items := make([]interface{}, len(b.items))
  43. for i, item := range b.items {
  44. items[i] = item.Source()
  45. }
  46. source["docs"] = items
  47. return source
  48. }
  49. func (b *MultiGetService) Do() (*MultiGetResult, error) {
  50. // Build url
  51. path := "/_mget"
  52. params := make(url.Values)
  53. if b.realtime != nil {
  54. params.Add("realtime", fmt.Sprintf("%v", *b.realtime))
  55. }
  56. if b.preference != "" {
  57. params.Add("preference", b.preference)
  58. }
  59. if b.refresh != nil {
  60. params.Add("refresh", fmt.Sprintf("%v", *b.refresh))
  61. }
  62. // Set body
  63. body := b.Source()
  64. // Get response
  65. res, err := b.client.PerformRequest("GET", path, params, body)
  66. if err != nil {
  67. return nil, err
  68. }
  69. // Return result
  70. ret := new(MultiGetResult)
  71. if err := json.Unmarshal(res.Body, ret); err != nil {
  72. return nil, err
  73. }
  74. return ret, nil
  75. }
  76. // -- Multi Get Item --
  77. // MultiGetItem is a single document to retrieve via the MultiGetService.
  78. type MultiGetItem struct {
  79. index string
  80. typ string
  81. id string
  82. routing string
  83. fields []string
  84. version *int64 // see org.elasticsearch.common.lucene.uid.Versions
  85. versionType string // see org.elasticsearch.index.VersionType
  86. fsc *FetchSourceContext
  87. }
  88. func NewMultiGetItem() *MultiGetItem {
  89. return &MultiGetItem{}
  90. }
  91. func (item *MultiGetItem) Index(index string) *MultiGetItem {
  92. item.index = index
  93. return item
  94. }
  95. func (item *MultiGetItem) Type(typ string) *MultiGetItem {
  96. item.typ = typ
  97. return item
  98. }
  99. func (item *MultiGetItem) Id(id string) *MultiGetItem {
  100. item.id = id
  101. return item
  102. }
  103. func (item *MultiGetItem) Routing(routing string) *MultiGetItem {
  104. item.routing = routing
  105. return item
  106. }
  107. func (item *MultiGetItem) Fields(fields ...string) *MultiGetItem {
  108. if item.fields == nil {
  109. item.fields = make([]string, 0)
  110. }
  111. item.fields = append(item.fields, fields...)
  112. return item
  113. }
  114. // Version can be MatchAny (-3), MatchAnyPre120 (0), NotFound (-1),
  115. // or NotSet (-2). These are specified in org.elasticsearch.common.lucene.uid.Versions.
  116. // The default in Elasticsearch is MatchAny (-3).
  117. func (item *MultiGetItem) Version(version int64) *MultiGetItem {
  118. item.version = &version
  119. return item
  120. }
  121. // VersionType can be "internal", "external", "external_gt", "external_gte",
  122. // or "force". See org.elasticsearch.index.VersionType in Elasticsearch source.
  123. // It is "internal" by default.
  124. func (item *MultiGetItem) VersionType(versionType string) *MultiGetItem {
  125. item.versionType = versionType
  126. return item
  127. }
  128. func (item *MultiGetItem) FetchSource(fetchSourceContext *FetchSourceContext) *MultiGetItem {
  129. item.fsc = fetchSourceContext
  130. return item
  131. }
  132. // Source returns the serialized JSON to be sent to Elasticsearch as
  133. // part of a MultiGet search.
  134. func (item *MultiGetItem) Source() interface{} {
  135. source := make(map[string]interface{})
  136. source["_id"] = item.id
  137. if item.index != "" {
  138. source["_index"] = item.index
  139. }
  140. if item.typ != "" {
  141. source["_type"] = item.typ
  142. }
  143. if item.fsc != nil {
  144. source["_source"] = item.fsc.Source()
  145. }
  146. if item.fields != nil {
  147. source["_fields"] = item.fields
  148. }
  149. if item.routing != "" {
  150. source["_routing"] = item.routing
  151. }
  152. if item.version != nil {
  153. source["version"] = fmt.Sprintf("%d", *item.version)
  154. }
  155. if item.versionType != "" {
  156. source["version_type"] = item.versionType
  157. }
  158. return source
  159. }
  160. // -- Result of a Multi Get request.
  161. type MultiGetResult struct {
  162. Docs []*GetResult `json:"docs,omitempty"`
  163. }