diff --git a/CHANGELOG.md b/CHANGELOG.md
index 127a008..7a2e98c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.1
+
+- Added `search_hit` and `search_highlights` methods to models
+
## 2.0.0
- Added support for `reindex` on associations
diff --git a/lib/searchkick/results.rb b/lib/searchkick/results.rb
index 530fe98..31bc68a 100644
--- a/lib/searchkick/results.rb
+++ b/lib/searchkick/results.rb
@@ -32,7 +32,22 @@ module Searchkick
# sort
hits.map do |hit|
- results[hit["_type"]][hit["_id"].to_s]
+ result = results[hit["_type"]][hit["_id"].to_s]
+ if result
+ unless result.respond_to?(:search_hit)
+ result.define_singleton_method(:search_hit) do
+ hit
+ end
+ end
+
+ if hit["highlight"] && !result.respond_to?(:search_highlights)
+ highlights = Hash[hit["highlight"].map { |k, v| [(options[:json] ? k : k.sub(/\.#{@options[:match_suffix]}\z/, "")).to_sym, v.first] }]
+ result.define_singleton_method(:search_highlights) do
+ highlights
+ end
+ end
+ end
+ result
end.compact
else
hits.map do |hit|
diff --git a/test/highlight_test.rb b/test/highlight_test.rb
index 456deec..2aa858d 100644
--- a/test/highlight_test.rb
+++ b/test/highlight_test.rb
@@ -3,42 +3,42 @@ require_relative "test_helper"
class HighlightTest < Minitest::Test
def test_basic
store_names ["Two Door Cinema Club"]
- assert_equal "Two Door Cinema Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
+ assert_equal "Two Door Cinema Club", Product.search("cinema", fields: [:name], highlight: true).first.search_highlights[:name]
end
def test_tag
store_names ["Two Door Cinema Club"]
- assert_equal "Two Door Cinema Club", Product.search("cinema", fields: [:name], highlight: {tag: ""}).with_details.first[1][:highlight][:name]
+ assert_equal "Two Door Cinema Club", Product.search("cinema", fields: [:name], highlight: {tag: ""}).first.search_highlights[:name]
end
def test_multiple_fields
store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
- highlight = Product.search("cinema", fields: [:name, :color], highlight: true).with_details.first[1][:highlight]
- assert_equal "Two Door Cinema Club", highlight[:name]
- assert_equal "Cinema Orange", highlight[:color]
+ highlights = Product.search("cinema", fields: [:name, :color], highlight: true).first.search_highlights
+ assert_equal "Two Door Cinema Club", highlights[:name]
+ assert_equal "Cinema Orange", highlights[:color]
end
def test_fields
store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
- highlight = Product.search("cinema", fields: [:name, :color], highlight: {fields: [:name]}).with_details.first[1][:highlight]
- assert_equal "Two Door Cinema Club", highlight[:name]
- assert_nil highlight[:color]
+ highlights = Product.search("cinema", fields: [:name, :color], highlight: {fields: [:name]}).first.search_highlights
+ assert_equal "Two Door Cinema Club", highlights[:name]
+ assert_nil highlights[:color]
end
def test_field_options
store_names ["Two Door Cinema Club are a Northern Irish indie rock band"]
fragment_size = ENV["MATCH"] == "word_start" ? 26 : 20
- assert_equal "Two Door Cinema Club are", Product.search("cinema", fields: [:name], highlight: {fields: {name: {fragment_size: fragment_size}}}).with_details.first[1][:highlight][:name]
+ assert_equal "Two Door Cinema Club are", Product.search("cinema", fields: [:name], highlight: {fields: {name: {fragment_size: fragment_size}}}).first.search_highlights[:name]
end
def test_multiple_words
store_names ["Hello World Hello"]
- assert_equal "Hello World Hello", Product.search("hello", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
+ assert_equal "Hello World Hello", Product.search("hello", fields: [:name], highlight: true).first.search_highlights[:name]
end
def test_encoder
store_names ["Hello"]
- assert_equal "<b>Hello</b>", Product.search("hello", fields: [:name], highlight: {encoder: "html"}, misspellings: false).with_details.first[1][:highlight][:name]
+ assert_equal "<b>Hello</b>", Product.search("hello", fields: [:name], highlight: {encoder: "html"}, misspellings: false).first.search_highlights[:name]
end
def test_body
@@ -58,6 +58,11 @@ class HighlightTest < Minitest::Test
}
}
}
- assert_equal "Two Door Cinema Club", Product.search(body: body).with_details.first[1][:highlight][:"name.analyzed"]
+ assert_equal "Two Door Cinema Club", Product.search(body: body).first.search_highlights[:"name.analyzed"]
+ end
+
+ def test_legacy
+ store_names ["Two Door Cinema Club"]
+ assert_equal "Two Door Cinema Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
end
end
--
libgit2 0.21.0