multi_search_test.go 5.0 KB

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