msearch_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. _ "net/http"
  9. "testing"
  10. )
  11. func TestMultiSearch(t *testing.T) {
  12. client := setupTestClientAndCreateIndex(t)
  13. tweet1 := tweet{
  14. User: "olivere",
  15. Message: "Welcome to Golang and Elasticsearch.",
  16. Tags: []string{"golang", "elasticsearch"},
  17. }
  18. tweet2 := tweet{
  19. User: "olivere",
  20. Message: "Another unrelated topic.",
  21. Tags: []string{"golang"},
  22. }
  23. tweet3 := tweet{
  24. User: "sandrae",
  25. Message: "Cycling is fun.",
  26. Tags: []string{"sports", "cycling"},
  27. }
  28. // Add all documents
  29. _, err := client.Index().Index(testIndexName).Type("tweet").Id("1").BodyJson(&tweet1).Do(context.TODO())
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. _, err = client.Index().Index(testIndexName).Type("tweet").Id("2").BodyJson(&tweet2).Do(context.TODO())
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. _, err = client.Index().Index(testIndexName).Type("tweet").Id("3").BodyJson(&tweet3).Do(context.TODO())
  38. if err != nil {
  39. t.Fatal(err)
  40. }
  41. _, err = client.Flush().Index(testIndexName).Do(context.TODO())
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. // Spawn two search queries with one roundtrip
  46. q1 := NewMatchAllQuery()
  47. q2 := NewTermQuery("tags", "golang")
  48. sreq1 := NewSearchRequest().Index(testIndexName, testIndexName2).
  49. Source(NewSearchSource().Query(q1).Size(10))
  50. sreq2 := NewSearchRequest().Index(testIndexName).Type("tweet").
  51. Source(NewSearchSource().Query(q2))
  52. searchResult, err := client.MultiSearch().
  53. Add(sreq1, sreq2).
  54. Do(context.TODO())
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if searchResult.Responses == nil {
  59. t.Fatal("expected responses != nil; got nil")
  60. }
  61. if len(searchResult.Responses) != 2 {
  62. t.Fatalf("expected 2 responses; got %d", len(searchResult.Responses))
  63. }
  64. sres := searchResult.Responses[0]
  65. if sres.Hits == nil {
  66. t.Errorf("expected Hits != nil; got nil")
  67. }
  68. if sres.Hits.TotalHits != 3 {
  69. t.Errorf("expected Hits.TotalHits = %d; got %d", 3, sres.Hits.TotalHits)
  70. }
  71. if len(sres.Hits.Hits) != 3 {
  72. t.Errorf("expected len(Hits.Hits) = %d; got %d", 3, len(sres.Hits.Hits))
  73. }
  74. for _, hit := range sres.Hits.Hits {
  75. if hit.Index != testIndexName {
  76. t.Errorf("expected Hits.Hit.Index = %q; got %q", testIndexName, hit.Index)
  77. }
  78. item := make(map[string]interface{})
  79. err := json.Unmarshal(*hit.Source, &item)
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. }
  84. sres = searchResult.Responses[1]
  85. if sres.Hits == nil {
  86. t.Errorf("expected Hits != nil; got nil")
  87. }
  88. if sres.Hits.TotalHits != 2 {
  89. t.Errorf("expected Hits.TotalHits = %d; got %d", 2, sres.Hits.TotalHits)
  90. }
  91. if len(sres.Hits.Hits) != 2 {
  92. t.Errorf("expected len(Hits.Hits) = %d; got %d", 2, len(sres.Hits.Hits))
  93. }
  94. for _, hit := range sres.Hits.Hits {
  95. if hit.Index != testIndexName {
  96. t.Errorf("expected Hits.Hit.Index = %q; got %q", testIndexName, hit.Index)
  97. }
  98. item := make(map[string]interface{})
  99. err := json.Unmarshal(*hit.Source, &item)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. }
  104. }
  105. func TestMultiSearchWithOneRequest(t *testing.T) {
  106. client := setupTestClientAndCreateIndex(t)
  107. tweet1 := tweet{
  108. User: "olivere",
  109. Message: "Welcome to Golang and Elasticsearch.",
  110. Tags: []string{"golang", "elasticsearch"},
  111. }
  112. tweet2 := tweet{
  113. User: "olivere",
  114. Message: "Another unrelated topic.",
  115. Tags: []string{"golang"},
  116. }
  117. tweet3 := tweet{
  118. User: "sandrae",
  119. Message: "Cycling is fun.",
  120. Tags: []string{"sports", "cycling"},
  121. }
  122. // Add all documents
  123. _, err := client.Index().Index(testIndexName).Type("tweet").Id("1").BodyJson(&tweet1).Do(context.TODO())
  124. if err != nil {
  125. t.Fatal(err)
  126. }
  127. _, err = client.Index().Index(testIndexName).Type("tweet").Id("2").BodyJson(&tweet2).Do(context.TODO())
  128. if err != nil {
  129. t.Fatal(err)
  130. }
  131. _, err = client.Index().Index(testIndexName).Type("tweet").Id("3").BodyJson(&tweet3).Do(context.TODO())
  132. if err != nil {
  133. t.Fatal(err)
  134. }
  135. _, err = client.Flush().Index(testIndexName).Do(context.TODO())
  136. if err != nil {
  137. t.Fatal(err)
  138. }
  139. // Spawn two search queries with one roundtrip
  140. query := NewMatchAllQuery()
  141. source := NewSearchSource().Query(query).Size(10)
  142. sreq := NewSearchRequest().Source(source)
  143. searchResult, err := client.MultiSearch().
  144. Index(testIndexName).
  145. Add(sreq).
  146. Do(context.TODO())
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. if searchResult.Responses == nil {
  151. t.Fatal("expected responses != nil; got nil")
  152. }
  153. if len(searchResult.Responses) != 1 {
  154. t.Fatalf("expected 1 responses; got %d", len(searchResult.Responses))
  155. }
  156. sres := searchResult.Responses[0]
  157. if sres.Hits == nil {
  158. t.Errorf("expected Hits != nil; got nil")
  159. }
  160. if sres.Hits.TotalHits != 3 {
  161. t.Errorf("expected Hits.TotalHits = %d; got %d", 3, sres.Hits.TotalHits)
  162. }
  163. if len(sres.Hits.Hits) != 3 {
  164. t.Errorf("expected len(Hits.Hits) = %d; got %d", 3, len(sres.Hits.Hits))
  165. }
  166. for _, hit := range sres.Hits.Hits {
  167. if hit.Index != testIndexName {
  168. t.Errorf("expected Hits.Hit.Index = %q; got %q", testIndexName, hit.Index)
  169. }
  170. item := make(map[string]interface{})
  171. err := json.Unmarshal(*hit.Source, &item)
  172. if err != nil {
  173. t.Fatal(err)
  174. }
  175. }
  176. }