suggester_phrase_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. "testing"
  8. )
  9. func TestPhraseSuggesterSource(t *testing.T) {
  10. s := NewPhraseSuggester("name").
  11. Text("Xor the Got-Jewel").
  12. Analyzer("body").
  13. Field("bigram").
  14. Size(1).
  15. RealWordErrorLikelihood(0.95).
  16. MaxErrors(0.5).
  17. GramSize(2).
  18. Highlight("<em>", "</em>")
  19. data, err := json.Marshal(s.Source(true))
  20. if err != nil {
  21. t.Fatalf("marshaling to JSON failed: %v", err)
  22. }
  23. got := string(data)
  24. expected := `{"name":{"text":"Xor the Got-Jewel","phrase":{"analyzer":"body","field":"bigram","gram_size":2,"highlight":{"post_tag":"\u003c/em\u003e","pre_tag":"\u003cem\u003e"},"max_errors":0.5,"real_word_error_likelihood":0.95,"size":1}}}`
  25. if got != expected {
  26. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  27. }
  28. }
  29. func TestPhraseSuggesterSourceWithContextQuery(t *testing.T) {
  30. geomapQ := NewSuggesterGeoMapping("location").
  31. Precision("1km", "5m").
  32. Neighbors(true).
  33. FieldName("pin").
  34. DefaultLocations(GeoPointFromLatLon(0.0, 0.0))
  35. s := NewPhraseSuggester("name").
  36. Text("Xor the Got-Jewel").
  37. Analyzer("body").
  38. Field("bigram").
  39. Size(1).
  40. RealWordErrorLikelihood(0.95).
  41. MaxErrors(0.5).
  42. GramSize(2).
  43. Highlight("<em>", "</em>").
  44. ContextQuery(geomapQ)
  45. data, err := json.Marshal(s.Source(true))
  46. if err != nil {
  47. t.Fatalf("marshaling to JSON failed: %v", err)
  48. }
  49. got := string(data)
  50. expected := `{"name":{"text":"Xor the Got-Jewel","phrase":{"analyzer":"body","context":{"location":{"default":{"lat":0,"lon":0},"neighbors":true,"path":"pin","precision":["1km","5m"],"type":"geo"}},"field":"bigram","gram_size":2,"highlight":{"post_tag":"\u003c/em\u003e","pre_tag":"\u003cem\u003e"},"max_errors":0.5,"real_word_error_likelihood":0.95,"size":1}}}`
  51. if got != expected {
  52. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  53. }
  54. }
  55. func TestPhraseSuggesterComplexSource(t *testing.T) {
  56. g1 := NewDirectCandidateGenerator("body").
  57. SuggestMode("always").
  58. MinWordLength(1)
  59. g2 := NewDirectCandidateGenerator("reverse").
  60. SuggestMode("always").
  61. MinWordLength(1).
  62. PreFilter("reverse").
  63. PostFilter("reverse")
  64. s := NewPhraseSuggester("simple_phrase").
  65. Text("Xor the Got-Jewel").
  66. Analyzer("body").
  67. Field("bigram").
  68. Size(4).
  69. RealWordErrorLikelihood(0.95).
  70. Confidence(2.0).
  71. GramSize(2).
  72. CandidateGenerators(g1, g2).
  73. CollateQuery(`"match":{"{{field_name}}" : "{{suggestion}}"}`).
  74. CollateParams(map[string]interface{}{"field_name": "title"}).
  75. CollatePreference("_primary").
  76. CollatePrune(true)
  77. data, err := json.Marshal(s.Source(true))
  78. if err != nil {
  79. t.Fatalf("marshaling to JSON failed: %v", err)
  80. }
  81. got := string(data)
  82. expected := `{"simple_phrase":{"text":"Xor the Got-Jewel","phrase":{"analyzer":"body","collate":{"params":{"field_name":"title"},"preference":"_primary","prune":true,"query":"\"match\":{\"{{field_name}}\" : \"{{suggestion}}\"}"},"confidence":2,"direct_generator":[{"field":"body","min_word_length":1,"suggest_mode":"always"},{"field":"reverse","min_word_length":1,"post_filter":"reverse","pre_filter":"reverse","suggest_mode":"always"}],"field":"bigram","gram_size":2,"real_word_error_likelihood":0.95,"size":4}}}`
  83. if got != expected {
  84. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  85. }
  86. }
  87. func TestPhraseStupidBackoffSmoothingModel(t *testing.T) {
  88. s := NewStupidBackoffSmoothingModel(0.42)
  89. data, err := json.Marshal(s.Source())
  90. if err != nil {
  91. t.Fatalf("marshaling to JSON failed: %v", err)
  92. }
  93. got := string(data)
  94. // The source does NOT include the smoothing model type!
  95. expected := `{"discount":0.42}`
  96. if got != expected {
  97. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  98. }
  99. if s.Type() != "stupid_backoff" {
  100. t.Errorf("expected %q, got: %q", "stupid_backoff", s.Type())
  101. }
  102. }
  103. func TestPhraseLaplaceSmoothingModel(t *testing.T) {
  104. s := NewLaplaceSmoothingModel(0.63)
  105. data, err := json.Marshal(s.Source())
  106. if err != nil {
  107. t.Fatalf("marshaling to JSON failed: %v", err)
  108. }
  109. got := string(data)
  110. // The source does NOT include the smoothing model type!
  111. expected := `{"alpha":0.63}`
  112. if got != expected {
  113. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  114. }
  115. if s.Type() != "laplace" {
  116. t.Errorf("expected %q, got: %q", "laplace", s.Type())
  117. }
  118. }
  119. func TestLinearInterpolationSmoothingModel(t *testing.T) {
  120. s := NewLinearInterpolationSmoothingModel(0.3, 0.2, 0.05)
  121. data, err := json.Marshal(s.Source())
  122. if err != nil {
  123. t.Fatalf("marshaling to JSON failed: %v", err)
  124. }
  125. got := string(data)
  126. // The source does NOT include the smoothing model type!
  127. expected := `{"bigram_lambda":0.2,"trigram_lambda":0.3,"unigram_lambda":0.05}`
  128. if got != expected {
  129. t.Errorf("expected\n%s\n,got:\n%s", expected, got)
  130. }
  131. if s.Type() != "linear_interpolation" {
  132. t.Errorf("expected %q, got: %q", "linear_interpolation", s.Type())
  133. }
  134. }