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