highlight_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 TestHighlighterField(t *testing.T) {
  11. field := NewHighlighterField("grade")
  12. data, err := json.Marshal(field.Source())
  13. if err != nil {
  14. t.Fatalf("marshaling to JSON failed: %v", err)
  15. }
  16. got := string(data)
  17. expected := `{}`
  18. if got != expected {
  19. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  20. }
  21. }
  22. func TestHighlighterFieldWithOptions(t *testing.T) {
  23. field := NewHighlighterField("grade").FragmentSize(2).NumOfFragments(1)
  24. data, err := json.Marshal(field.Source())
  25. if err != nil {
  26. t.Fatalf("marshaling to JSON failed: %v", err)
  27. }
  28. got := string(data)
  29. expected := `{"fragment_size":2,"number_of_fragments":1}`
  30. if got != expected {
  31. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  32. }
  33. }
  34. func TestHighlightWithStringField(t *testing.T) {
  35. builder := NewHighlight().Field("grade")
  36. data, err := json.Marshal(builder.Source())
  37. if err != nil {
  38. t.Fatalf("marshaling to JSON failed: %v", err)
  39. }
  40. got := string(data)
  41. expected := `{"fields":{"grade":{}}}`
  42. if got != expected {
  43. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  44. }
  45. }
  46. func TestHighlightWithFields(t *testing.T) {
  47. gradeField := NewHighlighterField("grade")
  48. builder := NewHighlight().Fields(gradeField)
  49. data, err := json.Marshal(builder.Source())
  50. if err != nil {
  51. t.Fatalf("marshaling to JSON failed: %v", err)
  52. }
  53. got := string(data)
  54. expected := `{"fields":{"grade":{}}}`
  55. if got != expected {
  56. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  57. }
  58. }
  59. func TestHighlightWithMultipleFields(t *testing.T) {
  60. gradeField := NewHighlighterField("grade")
  61. colorField := NewHighlighterField("color")
  62. builder := NewHighlight().Fields(gradeField, colorField)
  63. data, err := json.Marshal(builder.Source())
  64. if err != nil {
  65. t.Fatalf("marshaling to JSON failed: %v", err)
  66. }
  67. got := string(data)
  68. expected := `{"fields":{"color":{},"grade":{}}}`
  69. if got != expected {
  70. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  71. }
  72. }
  73. func TestHighlighterWithExplicitFieldOrder(t *testing.T) {
  74. gradeField := NewHighlighterField("grade").FragmentSize(2)
  75. colorField := NewHighlighterField("color").FragmentSize(2).NumOfFragments(1)
  76. builder := NewHighlight().Fields(gradeField, colorField).UseExplicitFieldOrder(true)
  77. data, err := json.Marshal(builder.Source())
  78. if err != nil {
  79. t.Fatalf("marshaling to JSON failed: %v", err)
  80. }
  81. got := string(data)
  82. expected := `{"fields":[{"grade":{"fragment_size":2}},{"color":{"fragment_size":2,"number_of_fragments":1}}]}`
  83. if got != expected {
  84. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  85. }
  86. }
  87. func TestHighlightWithTermQuery(t *testing.T) {
  88. client := setupTestClientAndCreateIndex(t)
  89. tweet1 := tweet{User: "olivere", Message: "Welcome to Golang and Elasticsearch."}
  90. tweet2 := tweet{User: "olivere", Message: "Another unrelated topic."}
  91. tweet3 := tweet{User: "sandrae", Message: "Cycling is fun to do."}
  92. // Add all documents
  93. _, err := client.Index().Index(testIndexName).Type("tweet").Id("1").BodyJson(&tweet1).Do()
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. _, err = client.Index().Index(testIndexName).Type("tweet").Id("2").BodyJson(&tweet2).Do()
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. _, err = client.Index().Index(testIndexName).Type("tweet").Id("3").BodyJson(&tweet3).Do()
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. _, err = client.Flush().Index(testIndexName).Do()
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. // Specify highlighter
  110. hl := NewHighlight()
  111. hl = hl.Fields(NewHighlighterField("message"))
  112. hl = hl.PreTags("<em>").PostTags("</em>")
  113. // Match all should return all documents
  114. query := NewPrefixQuery("message", "golang")
  115. searchResult, err := client.Search().
  116. Index(testIndexName).
  117. Highlight(hl).
  118. Query(&query).
  119. Do()
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. if searchResult.Hits == nil {
  124. t.Fatalf("expected SearchResult.Hits != nil; got nil")
  125. }
  126. if searchResult.Hits.TotalHits != 1 {
  127. t.Fatalf("expected SearchResult.Hits.TotalHits = %d; got %d", 1, searchResult.Hits.TotalHits)
  128. }
  129. if len(searchResult.Hits.Hits) != 1 {
  130. t.Fatalf("expected len(SearchResult.Hits.Hits) = %d; got %d", 1, len(searchResult.Hits.Hits))
  131. }
  132. hit := searchResult.Hits.Hits[0]
  133. var tw tweet
  134. if err := json.Unmarshal(*hit.Source, &tw); err != nil {
  135. t.Fatal(err)
  136. }
  137. if hit.Highlight == nil || len(hit.Highlight) == 0 {
  138. t.Fatal("expected hit to have a highlight; got nil")
  139. }
  140. if hl, found := hit.Highlight["message"]; found {
  141. if len(hl) != 1 {
  142. t.Fatalf("expected to have one highlight for field \"message\"; got %d", len(hl))
  143. }
  144. expected := "Welcome to <em>Golang</em> and Elasticsearch."
  145. if hl[0] != expected {
  146. t.Errorf("expected to have highlight \"%s\"; got \"%s\"", expected, hl[0])
  147. }
  148. } else {
  149. t.Fatal("expected to have a highlight on field \"message\"; got none")
  150. }
  151. }