I wonder if anyone knows how Sphinx goes about constructing the snippets that are returned along with the matches to a search term. This page illustrates a wild variety of examples of how one search term can be interpreted:
https://oll.libertyfund.org/search/results?q=power+corrupts Note the first hit, from Alvis on Shakespeare. The exact phrase exists in the third line of the snippet (on a desktop screen, YMMV). It is not highlighted. In the third example, the result is from deep in the weeds of the footnotes, and hits on the word power, and actually highlights it. The fifth hit gets both power (twice) and corrupts, but misses the stem of corrupts in corrupt. The second-to-the-last hit on that page, in Liberty, Order, and Justice, goes on for several screens (208,135 words), with a single snippet that has grown to encompass 725 individual keyword hits in one "paragraph" of source text. I'm using Thinking Sphinx 3.1.2, and Sphinx is version 2.2.9 Here's the controller method that constructed this page: @results = ThinkingSphinx.search "\"#{ThinkingSphinx::Query.escape(params[:q].to_s)}\"", :page => params[:page], :star => true, :excerpts => { :limit => 1000, :around => 40, :force_all_words => true, :chunk_separator => '</li><li>' }.reject{ |r| r.class.to_s == 'NilClass' } rescue Kaminari::paginate_array [] @results.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane @hits = @results.total_entries rescue 0 And these results are from mostly titles, but some pages. Here's the definition for both: # titles_index.rb ThinkingSphinx::Index.define :title, :with => :active_record do set_property :group_concat_max_len => 10.megabytes indexes :title, :sortable => true indexes teaser indexes content.plain, :as => :plain_text indexes author_name, :sortable => true has roles(:person_id), :as => :people_ids has :id, :as => :title_id has author_id, created_at, updated_at has set, :as => :title_set where sanitize_sql(["publish", true]) end #pages_index.rb ThinkingSphinx::Index.define :page, :with => :active_record do indexes :title, :sortable => true indexes teaser indexes body has created_at, updated_at end In the view, I'm using this tortured bit of ERB: <%= content_tag( :ol, "<li>#{result.excerpts.plain_contents}</li>".gsub(/<li>\s*<\/li>/,'').html_safe ) if result.respond_to?(:plain_contents) %> And there's no way to explain why some results are wrapped in the <span class="match"> in the output from Sphinx, while others (nearby, in the same set of results) are not. Thanks in advance if anyone can enlighten me or point me toward documentation of this feature. This is all very old code, maybe 6 or 8 years since I last touched it. I've moved it to a newer server since I wrote all this, but nothing much changed when I did that. My client would like to know, and I don't have any good answers. Walter -- You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group. To unsubscribe from this group and stop receiving emails from it, send an email to thinking-sphinx+unsubscr...@googlegroups.com. To post to this group, send email to thinking-sphinx@googlegroups.com. Visit this group at https://groups.google.com/group/thinking-sphinx. To view this discussion on the web visit https://groups.google.com/d/msgid/thinking-sphinx/AAECECFD-619C-49AC-B4E7-63A6C87C2595%40wdstudio.com. For more options, visit https://groups.google.com/d/optout.