msearch.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. package elastic
  5. import (
  6. "context"
  7. "encoding/json"
  8. "fmt"
  9. "net/url"
  10. "strings"
  11. )
  12. // MultiSearch executes one or more searches in one roundtrip.
  13. type MultiSearchService struct {
  14. client *Client
  15. requests []*SearchRequest
  16. indices []string
  17. pretty bool
  18. routing string
  19. preference string
  20. }
  21. func NewMultiSearchService(client *Client) *MultiSearchService {
  22. builder := &MultiSearchService{
  23. client: client,
  24. requests: make([]*SearchRequest, 0),
  25. indices: make([]string, 0),
  26. }
  27. return builder
  28. }
  29. func (s *MultiSearchService) Add(requests ...*SearchRequest) *MultiSearchService {
  30. s.requests = append(s.requests, requests...)
  31. return s
  32. }
  33. func (s *MultiSearchService) Index(indices ...string) *MultiSearchService {
  34. s.indices = append(s.indices, indices...)
  35. return s
  36. }
  37. func (s *MultiSearchService) Pretty(pretty bool) *MultiSearchService {
  38. s.pretty = pretty
  39. return s
  40. }
  41. func (s *MultiSearchService) Do(ctx context.Context) (*MultiSearchResult, error) {
  42. // Build url
  43. path := "/_msearch"
  44. // Parameters
  45. params := make(url.Values)
  46. if s.pretty {
  47. params.Set("pretty", fmt.Sprintf("%v", s.pretty))
  48. }
  49. // Set body
  50. var lines []string
  51. for _, sr := range s.requests {
  52. // Set default indices if not specified in the request
  53. if !sr.HasIndices() && len(s.indices) > 0 {
  54. sr = sr.Index(s.indices...)
  55. }
  56. header, err := json.Marshal(sr.header())
  57. if err != nil {
  58. return nil, err
  59. }
  60. body, err := json.Marshal(sr.body())
  61. if err != nil {
  62. return nil, err
  63. }
  64. lines = append(lines, string(header))
  65. lines = append(lines, string(body))
  66. }
  67. body := strings.Join(lines, "\n") + "\n" // Don't forget trailing \n
  68. // Get response
  69. res, err := s.client.PerformRequest(ctx, "GET", path, params, body)
  70. if err != nil {
  71. return nil, err
  72. }
  73. // Return result
  74. ret := new(MultiSearchResult)
  75. if err := s.client.decoder.Decode(res.Body, ret); err != nil {
  76. return nil, err
  77. }
  78. return ret, nil
  79. }
  80. type MultiSearchResult struct {
  81. Responses []*SearchResult `json:"responses,omitempty"`
  82. }