Commit 295bd6686b4d6449efd661f0a9cf7c14d56e68b1

Authored by Andrew Kane
1 parent f36fbf83

Added rough version of highlight for #51

README.md
... ... @@ -342,6 +342,32 @@ Advanced
342 342 Product.search "2% Milk", facets: {store_id: {where: {in_stock: true}, limit: 10}}
343 343 ```
344 344  
  345 +### Highlight [master - subject to change]
  346 +
  347 +Highlight the search query in the results.
  348 +
  349 +```ruby
  350 +bands = Band.search "cinema", fields: [:name], highlight: true
  351 +```
  352 +
  353 +**Note:** The `fields` option is required.
  354 +
  355 +View the highlighted fields with:
  356 +
  357 +```ruby
  358 +bands.each_with_hit do |band, hit|
  359 + puts hit["highlight"]["name.analyzed"].first # "Two Door <em>Cinema</em> Club"
  360 +end
  361 +```
  362 +
  363 +**Note:** A simpler interface coming before the next release.
  364 +
  365 +To change the tag, use:
  366 +
  367 +```ruby
  368 +Band.search "cinema", fields: [:name], highlight: {tag: "<strong>"}
  369 +```
  370 +
345 371 ### Similar Items
346 372  
347 373 Find similar items.
... ...
lib/searchkick/reindex.rb
... ... @@ -202,7 +202,9 @@ module Searchkick
202 202 type: "multi_field",
203 203 fields: {
204 204 field => {type: "string", index: "not_analyzed"},
205   - "analyzed" => {type: "string", index: "analyzed"}
  205 + "analyzed" => {type: "string", index: "analyzed", term_vector: "with_positions_offsets"}
  206 + # term_vector for fast / correct highlighting
  207 + # http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-highlighting.html#_fast_vector_highlighter
206 208 }
207 209 }
208 210 if autocomplete.include?(field)
... ...
lib/searchkick/search.rb
... ... @@ -288,6 +288,17 @@ module Searchkick
288 288 end
289 289 end
290 290  
  291 + # highlight
  292 + if options[:highlight]
  293 + payload[:highlight] = {
  294 + fields: Hash[ fields.map{|f| [f, {}] } ]
  295 + }
  296 + if options[:highlight].is_a?(Hash) and tag = options[:highlight][:tag]
  297 + payload[:highlight][:pre_tags] = [tag]
  298 + payload[:highlight][:post_tags] = [tag.to_s.gsub(/\A</, "</")]
  299 + end
  300 + end
  301 +
291 302 # An empty array will cause only the _id and _type for each hit to be returned
292 303 # http://www.elasticsearch.org/guide/reference/api/search/fields/
293 304 payload[:fields] = [] if load
... ...