blacklight_iiif_search 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +3 -1
  3. data/app/controllers/concerns/blacklight_iiif_search/controller.rb +7 -3
  4. data/app/models/blacklight_iiif_search/iiif_search.rb +2 -0
  5. data/app/models/blacklight_iiif_search/iiif_search_annotation.rb +4 -0
  6. data/app/models/blacklight_iiif_search/iiif_search_response.rb +2 -0
  7. data/app/models/blacklight_iiif_search/iiif_suggest_response.rb +2 -0
  8. data/app/models/blacklight_iiif_search/iiif_suggest_search.rb +4 -0
  9. data/app/models/concerns/blacklight_iiif_search/annotation_behavior.rb +2 -0
  10. data/app/models/concerns/blacklight_iiif_search/ignored.rb +2 -0
  11. data/app/models/concerns/blacklight_iiif_search/search_behavior.rb +2 -0
  12. data/lib/blacklight_iiif_search.rb +2 -0
  13. data/lib/blacklight_iiif_search/engine.rb +2 -0
  14. data/lib/blacklight_iiif_search/routes.rb +2 -0
  15. data/lib/blacklight_iiif_search/version.rb +3 -1
  16. data/lib/generators/blacklight_iiif_search/controller_generator.rb +4 -2
  17. data/lib/generators/blacklight_iiif_search/install_generator.rb +3 -2
  18. data/lib/generators/blacklight_iiif_search/model_generator.rb +2 -0
  19. data/lib/generators/blacklight_iiif_search/routes_generator.rb +12 -10
  20. data/lib/generators/blacklight_iiif_search/solr_generator.rb +24 -22
  21. data/lib/generators/blacklight_iiif_search/templates/iiif_search_builder.rb +2 -0
  22. data/lib/railties/blacklight_iiif_search.rake +2 -0
  23. data/spec/controllers/catalog_controller_spec.rb +13 -11
  24. data/spec/fixtures/sample_solr_documents.yml +116 -116
  25. data/spec/iiif_search_shared.rb +4 -2
  26. data/spec/models/blacklight_iiif_search/iiif_search_annotation_spec.rb +10 -8
  27. data/spec/models/blacklight_iiif_search/iiif_search_response_spec.rb +23 -19
  28. data/spec/models/blacklight_iiif_search/iiif_search_spec.rb +2 -0
  29. data/spec/models/blacklight_iiif_search/iiif_suggest_response_spec.rb +14 -12
  30. data/spec/models/blacklight_iiif_search/iiif_suggest_search_spec.rb +8 -6
  31. data/spec/models/concerns/blacklight_iiif_search/annotation_behavior_spec.rb +5 -6
  32. data/spec/models/concerns/blacklight_iiif_search/ignored_spec.rb +2 -0
  33. data/spec/models/concerns/blacklight_iiif_search/search_behavior_spec.rb +5 -3
  34. data/spec/spec_helper.rb +2 -0
  35. data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -0
  36. metadata +16 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 879ed21ad9e68168ae6444ef8dcd712dfdb898cf
4
- data.tar.gz: 232275f5045f1bbb1eb7db47094554267fd8196e
2
+ SHA256:
3
+ metadata.gz: 4358a1b34fd697ba1970f5f01026283f406abbc8a3e6e6da9bbac1d9366db87a
4
+ data.tar.gz: b52ca7666a8fbe3e374a55d4e553f53a31ec9eca46d864d85c553d0b22936092
5
5
  SHA512:
6
- metadata.gz: 950611c765800d3c024eb1a698638393187967a5cc36587d790af2e4b02c97c7ecff4f0e9a7e99dd61ac902fc5af295d13f84e294a6909e3befae797c0622786
7
- data.tar.gz: cd323e5edebd3b74a429cf41123f3244c29a82867c27ebe40abec2970c4cda82399c92c52d998fccd4012416d3b4c28704a3be440cfcb91ae70b7a2f707c35a2
6
+ metadata.gz: 5f47bf0ea3f7b869a1d279d8e17129a0a7dffa967781842a63526eb6d61bd37343d151be2a0fc80eca3461300efa7dca77dcaf2dc582748008eff5f9f7700901
7
+ data.tar.gz: 9db3d2c71682e95d8a31b10340de5c70d47302346b666f01cda4301afb447d57469069e12d84d30732e64813c0cfb81b7194b182bf461050c97de1f26cfa448c
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
@@ -32,7 +34,7 @@ require 'rubocop/rake_task'
32
34
  RuboCop::RakeTask.new(:rubocop)
33
35
 
34
36
  desc 'Run test suite'
35
- task ci: ['engine_cart:generate'] do # TODO: add rubocop
37
+ task ci: [:rubocop, 'engine_cart:generate'] do
36
38
  SolrWrapper.wrap do |solr|
37
39
  FileUtils.cp File.join(__dir__, 'lib', 'generators', 'blacklight_iiif_search', 'templates', 'solr', 'lib', 'tokenizing-suggest-v1.0.1.jar'),
38
40
  File.join(solr.instance_dir, 'contrib')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # return a IIIF Content Search response
2
4
  module BlacklightIiifSearch
3
5
  module Controller
@@ -9,10 +11,12 @@ module BlacklightIiifSearch
9
11
  end
10
12
 
11
13
  def iiif_search
12
- _parent_response, @parent_document = fetch(params[:solr_document_id])
14
+ _parent_response, @parent_document = search_service.fetch(params[:solr_document_id])
13
15
  iiif_search = IiifSearch.new(iiif_search_params, iiif_search_config,
14
16
  @parent_document)
15
- @response, _document_list = search_results(iiif_search.solr_params)
17
+ iiif_search_service = search_service_class.new(config: blacklight_config,
18
+ user_params: iiif_search.solr_params)
19
+ @response, _document_list = iiif_search_service.search_results
16
20
  iiif_search_response = IiifSearchResponse.new(@response,
17
21
  @parent_document,
18
22
  self)
@@ -21,7 +25,7 @@ module BlacklightIiifSearch
21
25
  end
22
26
 
23
27
  def iiif_suggest
24
- suggest_search = IiifSuggestSearch.new(params, repository, self)
28
+ suggest_search = IiifSuggestSearch.new(params, Blacklight.default_index, self)
25
29
  render json: suggest_search.response,
26
30
  content_type: 'application/json'
27
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # IiifSearch
2
4
  module BlacklightIiifSearch
3
5
  class IiifSearch
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # corresponds to IIIF Annotation resource
2
4
  module BlacklightIiifSearch
3
5
  class IiifSearchAnnotation
@@ -14,6 +16,7 @@ module BlacklightIiifSearch
14
16
  # @param [String] snippet
15
17
  # @param [CatalogController] controller
16
18
  # @param [SolrDocument] parent_document
19
+ # rubocop:disable Metrics/ParameterLists
17
20
  def initialize(document, query, hl_index, snippet, controller, parent_document)
18
21
  @document = document
19
22
  @query = query
@@ -22,6 +25,7 @@ module BlacklightIiifSearch
22
25
  @controller = controller
23
26
  @parent_document = parent_document
24
27
  end
28
+ # rubocop:enable Metrics/ParameterLists
25
29
 
26
30
  ##
27
31
  # @return [IIIF::Presentation::Annotation]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # corresponds to a IIIF Annotation List
2
4
  module BlacklightIiifSearch
3
5
  class IiifSearchResponse
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # corresponds to a IIIF search:TermList
2
4
  module BlacklightIiifSearch
3
5
  class IiifSuggestResponse
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # IiifSuggestSearch
2
4
  module BlacklightIiifSearch
3
5
  class IiifSuggestSearch
@@ -28,10 +30,12 @@ module BlacklightIiifSearch
28
30
  ##
29
31
  # Query the suggest handler
30
32
  # @return [RSolr::HashWithResponse]
33
+ # rubocop:disable Style/HashSyntax
31
34
  def suggest_results
32
35
  suggest_params = { q: query, :'suggest.cfq' => document_id }
33
36
  repository.connection.send_and_receive(iiif_config[:autocomplete_handler],
34
37
  params: suggest_params)
35
38
  end
39
+ # rubocop:enable Style/HashSyntax
36
40
  end
37
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # customizable behavior for IiifSearchAnnotation
2
4
  module BlacklightIiifSearch
3
5
  module AnnotationBehavior
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # returns ignored params
2
4
  module BlacklightIiifSearch
3
5
  module Ignored
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # customizable behavior for IiifSearch
2
4
  module BlacklightIiifSearch
3
5
  module SearchBehavior
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # BlacklightIiifSearch
2
4
  module BlacklightIiifSearch
3
5
  require 'blacklight_iiif_search/version'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BlacklightIiifSearch
2
4
  class Engine < ::Rails::Engine
3
5
  isolate_namespace BlacklightIiifSearch
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BlacklightIiifSearch
2
4
  class Routes
3
5
  def initialize(defaults = {})
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BlacklightIiifSearch
2
- VERSION = '1.0.0'.freeze
4
+ VERSION = '2.0.0'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # adds controller-scope behavior to the implementing application
2
4
  require 'rails/generators'
3
5
 
@@ -24,8 +26,8 @@ module BlacklightIiifSearch
24
26
  inject_into_file "app/controllers/#{controller_name}_controller.rb", after: marker do
25
27
  "\n\n # configuration for Blacklight IIIF Content Search
26
28
  config.iiif_search = {
27
- full_text_field: 'text',
28
- object_relation_field: 'is_page_of_s',
29
+ full_text_field: 'all_text_timv',
30
+ object_relation_field: 'is_page_of_ssi',
29
31
  supported_params: %w[q page],
30
32
  autocomplete_handler: 'iiif_suggest',
31
33
  suggester_name: 'iiifSuggester'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # install BlacklightIiifSearch behavior into implementing application
2
4
  require 'rails/generators'
3
5
 
@@ -8,8 +10,7 @@ module BlacklightIiifSearch
8
10
  argument :search_builder_name, type: :string, default: 'search_builder'
9
11
  argument :controller_name, type: :string, default: 'catalog'
10
12
 
11
- class_option :'skip-solr', type: :boolean,
12
- default: false, desc: 'Skip generating Solr configurations.'
13
+ class_option :'skip-solr', type: :boolean, default: false, desc: 'Skip generating Solr configurations.'
13
14
 
14
15
  desc <<-EOS
15
16
  Install generator for Blacklight IIIF Search
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # add the SearchBuilder to the implementing application
2
4
  require 'rails/generators'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # insert routing for IIIF Content Search
2
4
  require 'rails/generators'
3
5
 
@@ -10,16 +12,16 @@ module BlacklightIiifSearch
10
12
 
11
13
  # Add CommonwealthVlrEngine to the routes
12
14
  def inject_iiif_search_routes
13
- unless IO.read('config/routes.rb').include?('BlacklightIiifSearch::Routes')
14
- marker = 'Rails.application.routes.draw do'
15
- inject_into_file 'config/routes.rb', after: marker do
16
- "\n\n concern :iiif_search, BlacklightIiifSearch::Routes.new"
17
- end
18
- # for blacklight_range_limit
19
- bl_routes_marker = /resources :solr_documents[\S\s]*controller: 'catalog' do[\s]*concerns :exportable.*$/
20
- inject_into_file 'config/routes.rb', after: bl_routes_marker do
21
- "\n concerns :iiif_search"
22
- end
15
+ return if IO.read('config/routes.rb').include?('BlacklightIiifSearch::Routes')
16
+
17
+ marker = 'Rails.application.routes.draw do'
18
+ inject_into_file 'config/routes.rb', after: marker do
19
+ "\n\n concern :iiif_search, BlacklightIiifSearch::Routes.new"
20
+ end
21
+ # for blacklight_range_limit
22
+ bl_routes_marker = /resources :solr_documents[\S\s]*controller: 'catalog' do[\s]*concerns :exportable.*$/
23
+ inject_into_file 'config/routes.rb', after: bl_routes_marker do
24
+ "\n concerns :iiif_search"
23
25
  end
24
26
  end
25
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # adds iiif_suggest configuration to Solr solrconfig.xml and schema.xml
2
4
  # to allow for suggestions limited by a contextField
3
5
  require 'rails/generators'
@@ -9,10 +11,11 @@ module BlacklightIiifSearch
9
11
  desc 'Adds iiif_suggest configuration to Solr solrconfig.xml and schema.xml'
10
12
 
11
13
  def inject_iiif_suggest_solrconfig
12
- unless IO.read('solr/conf/solrconfig.xml').include?('iiif_suggest')
13
- marker = '</config>'
14
- inject_into_file 'solr/conf/solrconfig.xml', before: marker do
15
- " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
14
+ return if IO.read('solr/conf/solrconfig.xml').include?('iiif_suggest')
15
+
16
+ marker = '</config>'
17
+ inject_into_file 'solr/conf/solrconfig.xml', before: marker do
18
+ " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
16
19
  <!-- solr-tokenizing_suggester is necessary to return single terms from the suggester -->
17
20
  <lib dir=\"${solr.install.dir:../../../..}/contrib\" regex=\"tokenizing-suggest-v1.0.1.jar\" />\n
18
21
  <searchComponent name=\"iiif_suggest\" class=\"solr.SuggestComponent\">
@@ -22,7 +25,7 @@ module BlacklightIiifSearch
22
25
  <str name=\"dictionaryImpl\">DocumentDictionaryFactory</str>
23
26
  <str name=\"suggestAnalyzerFieldType\">textSuggest</str>
24
27
  <str name=\"suggestTokenizingAnalyzerFieldType\">textSuggestTokenizer</str>
25
- <str name=\"contextField\">is_page_of_s</str>
28
+ <str name=\"contextField\">is_page_of_ssi</str>
26
29
  <str name=\"buildOnCommit\">true</str>
27
30
  <str name=\"field\">iiif_suggest</str>
28
31
  </lst>
@@ -38,16 +41,16 @@ module BlacklightIiifSearch
38
41
  </arr>
39
42
  </requestHandler>
40
43
  <!-- END Blacklight IIIF Search autocomplete config -->\n\n"
41
- end
42
44
  end
43
45
  end
44
46
 
45
47
  def inject_iiif_suggest_schema
46
48
  filepath = 'solr/conf/schema.xml'
47
- unless IO.read(filepath).include?('iiif_suggest')
48
- field_type_marker = '</types>'
49
- inject_into_file filepath, before: field_type_marker do
50
- "\n <!-- BEGIN Blacklight IIIF Search autocomplete config -->
49
+ return if IO.read(filepath).include?('iiif_suggest')
50
+
51
+ field_type_marker = '</types>'
52
+ inject_into_file filepath, before: field_type_marker do
53
+ "\n <!-- BEGIN Blacklight IIIF Search autocomplete config -->
51
54
  <fieldType name=\"textSuggestTokenizer\" class=\"solr.TextField\" positionIncrementGap=\"100\">
52
55
  <analyzer>
53
56
  <tokenizer class=\"solr.WhitespaceTokenizerFactory\"/>
@@ -61,27 +64,26 @@ module BlacklightIiifSearch
61
64
  </analyzer>
62
65
  </fieldType>
63
66
  <!-- END Blacklight IIIF Search autocomplete config -->\n\n"
64
- end
67
+ end
65
68
 
66
- fields_marker = '</fields>'
67
- inject_into_file filepath, before: fields_marker do
68
- " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
69
+ fields_marker = '</fields>'
70
+ inject_into_file filepath, before: fields_marker do
71
+ " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
69
72
  <field name=\"iiif_suggest\" type=\"textSuggest\" indexed=\"true\" stored=\"true\" multiValued=\"true\" />
70
73
  <!-- END Blacklight IIIF Search autocomplete config -->\n\n"
71
- end
74
+ end
72
75
 
73
- copy_marker = '</schema>'
74
- inject_into_file filepath, before: copy_marker do
75
- " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
76
- <copyField source=\"text\" dest=\"iiif_suggest\"/>
76
+ copy_marker = '</schema>'
77
+ inject_into_file filepath, before: copy_marker do
78
+ " <!-- BEGIN Blacklight IIIF Search autocomplete config -->
79
+ <copyField source=\"all_text_timv\" dest=\"iiif_suggest\"/>
77
80
  <!-- END Blacklight IIIF Search autocomplete config -->\n\n"
78
- end
79
81
  end
80
82
  end
81
83
 
82
84
  def copy_suggester_library
83
- copy_file 'solr/lib/solr-tokenizing_suggester-7.x.jar',
84
- 'solr/lib/solr-tokenizing_suggester-7.x.jar'
85
+ copy_file 'solr/lib/tokenizing-suggest-v1.0.1.jar',
86
+ 'solr/lib/tokenizing-suggest-v1.0.1.jar'
85
87
  end
86
88
  end
87
89
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # SearchBuilder for full-text searches with highlighting and snippets
2
4
  class IiifSearchBuilder < Blacklight::SearchBuilder
3
5
  include Blacklight::Solr::SearchBuilderBehavior
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :blacklight_iiif_search do
2
4
  namespace :index do
3
5
  desc 'Put sample data into solr'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'iiif_search_shared'
2
4
  RSpec.describe CatalogController do
3
5
  include_context 'iiif_search_shared'
@@ -18,11 +20,11 @@ RSpec.describe CatalogController do
18
20
  end
19
21
 
20
22
  describe '#iiif_search_config' do
21
- subject { controller.iiif_search_config }
23
+ subject(:iiif_search_config) { controller.iiif_search_config }
22
24
  it 'returns the iiif_search config' do
23
- expect(subject[:full_text_field]).to_not be_falsey
24
- expect(subject[:object_relation_field]).to_not be_falsey
25
- expect(subject[:supported_params]).to_not be_empty
25
+ expect(iiif_search_config[:full_text_field]).not_to be_falsey
26
+ expect(iiif_search_config[:object_relation_field]).not_to be_falsey
27
+ expect(iiif_search_config[:supported_params]).not_to be_empty
26
28
  end
27
29
  end
28
30
 
@@ -31,10 +33,10 @@ RSpec.describe CatalogController do
31
33
  controller.params = { q: query_term, foo: 'bar' }
32
34
  end
33
35
 
34
- subject { controller.iiif_search_params }
36
+ subject(:iiif_search_params) { controller.iiif_search_params }
35
37
  it 'only returns the permitted params' do
36
- expect(subject.include?(:q)).to be_truthy
37
- expect(subject.include?(:foo)).to be_falsey
38
+ expect(iiif_search_params.include?(:q)).to be_truthy
39
+ expect(iiif_search_params.include?(:foo)).to be_falsey
38
40
  end
39
41
  end
40
42
 
@@ -45,13 +47,13 @@ RSpec.describe CatalogController do
45
47
  end
46
48
 
47
49
  describe '#set_search_builder' do
48
- it 'should use IiifSearchBuilder' do
50
+ it 'uses IiifSearchBuilder' do
49
51
  expect(controller.blacklight_config.search_builder_class).to eq(IiifSearchBuilder)
50
52
  end
51
53
  end
52
54
 
53
55
  describe '#set_access_headers' do
54
- it 'should set the access control header' do
56
+ it 'sets the access control header' do
55
57
  expect(response.headers['Access-Control-Allow-Origin']).to eq('*')
56
58
  end
57
59
  end
@@ -67,7 +69,7 @@ RSpec.describe CatalogController do
67
69
  let(:json) { JSON.parse(response.body) }
68
70
 
69
71
  it 'returns a response' do
70
- expect(response).to be_success
72
+ expect(response.code).to eq '200'
71
73
  end
72
74
 
73
75
  it 'returns a IIIF AnnotationList' do
@@ -86,7 +88,7 @@ RSpec.describe CatalogController do
86
88
  let(:json) { JSON.parse(response.body) }
87
89
 
88
90
  it 'returns a response' do
89
- expect(response).to be_success
91
+ expect(response.code).to eq '200'
90
92
  end
91
93
 
92
94
  it 'returns a IIIF TermList' do
@@ -1,272 +1,272 @@
1
1
  # Sample Solr docs for full-text search, representing book and pages.
2
- # We duplicate full text in isbn_t field since this is the only text field
3
- # that is indexed and stored in schema.xml AND searched by default
4
- # requestHandler in solrconfig.xml in out-of-box Blacklight 6.* Solr config,
2
+ # We duplicate full text in alternative_title_tsim field since this field
3
+ # is indexed and stored in schema.xml AND searched by default
4
+ # requestHandler in solrconfig.xml in out-of-box Blacklight 7.* Solr config,
5
5
  # which allows us to test highlighting and snippets.
6
6
  ---
7
- - object_model_s:
7
+ - object_model_ssi:
8
8
  - Book
9
9
  id:
10
10
  - 7s75dn48d
11
- label_s:
11
+ label_ssi:
12
12
  - Raw denim raclette hexagon
13
- title_t:
13
+ title_tsim:
14
14
  - Raw denim raclette hexagon
15
- title_display: Raw denim raclette hexagon
16
- author_t:
15
+ title_ss: Raw denim raclette hexagon
16
+ author_tsim:
17
17
  - Doe, Jane
18
- author_display: Jane Doe
19
- has_searchable_text_b:
18
+ author_ss: Jane Doe
19
+ has_searchable_text_bsi:
20
20
  - true
21
- text_direction_s:
21
+ text_direction_ssi:
22
22
  - ltr
23
23
  timestamp:
24
24
  - '2015-11-18T21:22:14.23Z'
25
- - object_model_s:
25
+ - object_model_ssi:
26
26
  - ImageFile
27
27
  id:
28
28
  - 7s75dn59x
29
- is_file_of_s:
29
+ is_file_of_ssi:
30
30
  - 7s75dn48d
31
- is_following_page_of_s:
31
+ is_following_page_of_ssi:
32
32
  - 7s75dn58n
33
- is_page_of_s:
33
+ is_page_of_ssi:
34
34
  - 7s75dn48d
35
- is_preceding_page_of_s:
35
+ is_preceding_page_of_ssi:
36
36
  - 7s75dn60x
37
- page_type_s:
37
+ page_type_ssi:
38
38
  - Normal
39
- hand_side_s:
39
+ hand_side_ssi:
40
40
  - RIGHT
41
- page_num_label_s:
41
+ page_num_label_ssi:
42
42
  - 5
43
- page_num_label_type_s:
43
+ page_num_label_type_ssi:
44
44
  - original
45
- text:
45
+ all_text_timv:
46
46
  - In selecting sugar the confectioner must bear in mind that it is the foundation of all confectionery, and can not expect to manufacture iirst-class goods except from first-class material; hence, select only sugar that is perfectly dry and of uniform quality, and in white, hard, sparkling crystals; only such sugar will give satisfaction.
47
- isbn_t:
47
+ alternative_title_tsim:
48
48
  - In selecting sugar the confectioner must bear in mind that it is the foundation of all confectionery, and can not expect to manufacture iirst-class goods except from first-class material; hence, select only sugar that is perfectly dry and of uniform quality, and in white, hard, sparkling crystals; only such sugar will give satisfaction.
49
49
  timestamp:
50
50
  - '2015-11-18T21:09:44.574Z'
51
- - object_model_s:
51
+ - object_model_ssi:
52
52
  - Book
53
53
  id:
54
54
  - 3j334603p
55
- label_s:
55
+ label_ssi:
56
56
  - Quinoa gastropub snackwave
57
- title_t:
57
+ title_tsim:
58
58
  - Quinoa gastropub snackwave
59
- title_display: Quinoa gastropub snackwave
60
- author_t:
59
+ title_ss: Quinoa gastropub snackwave
60
+ author_tsim:
61
61
  - Doe, John
62
- author_display: John Doe
63
- has_searchable_text_b:
62
+ author_ss: John Doe
63
+ has_searchable_text_bsi:
64
64
  - true
65
- text_direction_s:
65
+ text_direction_ssi:
66
66
  - ltr
67
67
  timestamp:
68
68
  - '2015-11-18T19:32:49.014Z'
69
- - object_model_s:
69
+ - object_model_ssi:
70
70
  - ImageFile
71
71
  id:
72
72
  - 3j334628j
73
- is_file_of_s:
73
+ is_file_of_ssi:
74
74
  - 3j334603p
75
- is_page_of_s:
75
+ is_page_of_ssi:
76
76
  - 3j334603p
77
- page_type_s:
77
+ page_type_ssi:
78
78
  - Normal
79
- hand_side_s:
79
+ hand_side_ssi:
80
80
  - RIGHT
81
- page_num_label_s:
81
+ page_num_label_ssi:
82
82
  - 1
83
- page_num_label_type_s:
83
+ page_num_label_type_ssi:
84
84
  - original
85
- text:
85
+ all_text_timv:
86
86
  - In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change when exposed to the light. Second, they must not be easily affected by acids or alkalies; hence, it has been difficult to produce colors that are reasonably permanent and at the same time harmless. Yet the following will be found as near perfect as any yet produced.
87
- isbn_t:
87
+ alternative_title_tsim:
88
88
  - In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change when exposed to the light. Second, they must not be easily affected by acids or alkalies; hence, it has been difficult to produce colors that are reasonably permanent and at the same time harmless. Yet the following will be found as near perfect as any yet produced.
89
89
  timestamp:
90
90
  - '2015-11-18T17:27:35.361Z'
91
- - object_model_s:
91
+ - object_model_ssi:
92
92
  - ImageFile
93
93
  id:
94
94
  - 7s75dn58n
95
- is_file_of_s:
95
+ is_file_of_ssi:
96
96
  - 7s75dn48d
97
- # is_following_page_of_s:
97
+ # is_following_page_of_ssi:
98
98
  # - 7s75dn57c
99
- is_page_of_s:
99
+ is_page_of_ssi:
100
100
  - 7s75dn48d
101
- is_preceding_page_of_s:
101
+ is_preceding_page_of_ssi:
102
102
  - 7s75dn59x
103
- page_type_s:
103
+ page_type_ssi:
104
104
  - Normal
105
- hand_side_s:
105
+ hand_side_ssi:
106
106
  - LEFT
107
- page_num_label_s:
107
+ page_num_label_ssi:
108
108
  - 4
109
- page_num_label_type_s:
109
+ page_num_label_type_ssi:
110
110
  - original
111
- text:
111
+ all_text_timv:
112
112
  - Twelve pounds of sugar, two quarts of water, stir until dissolved, then add one full teaspoon of cream of tartar, (or if you wish to use glucose, add three pounds of same, do this when you are weighing your sugar, by hollowing out a place in the center of the sugar and pouring in the glucose). Now put on the steamer and let it remain until the batch begins to cook, then remove; in this way all the grains of sugar adhereing to the sides of the basin are washed down.
113
- isbn_t:
113
+ alternative_title_tsim:
114
114
  - Twelve pounds of sugar, two quarts of water, stir until dissolved, then add one full teaspoon of cream of tartar, (or if you wish to use glucose, add three pounds of same, do this when you are weighing your sugar, by hollowing out a place in the center of the sugar and pouring in the glucose). Now put on the steamer and let it remain until the batch begins to cook, then remove; in this way all the grains of sugar adhereing to the sides of the basin are washed down.
115
115
  timestamp:
116
116
  - '2015-11-18T21:09:30.2Z'
117
- - object_model_s:
117
+ - object_model_ssi:
118
118
  - ImageFile
119
119
  id:
120
120
  - 7s75dn60x
121
- is_file_of_s:
121
+ is_file_of_ssi:
122
122
  - 7s75dn48d
123
- is_following_page_of_s:
123
+ is_following_page_of_ssi:
124
124
  - 7s75dn59x
125
- is_page_of_s:
125
+ is_page_of_ssi:
126
126
  - 7s75dn48d
127
- is_preceding_page_of_s:
127
+ is_preceding_page_of_ssi:
128
128
  - 7s75dn61x
129
- page_type_s:
129
+ page_type_ssi:
130
130
  - Normal
131
- hand_side_s:
131
+ hand_side_ssi:
132
132
  - LEFT
133
- page_num_label_s:
133
+ page_num_label_ssi:
134
134
  - 6
135
- page_num_label_type_s:
135
+ page_num_label_type_ssi:
136
136
  - original
137
- text:
137
+ all_text_timv:
138
138
  - when it begins to boil, add six pounds of Almond Nuts, after haying picked out all shells and dusted the nuts thoroughly; stir slowly, keeping the sides of the basin well washed, until nuts are as brown as wished, and slide off the spatula easily when raised up
139
- isbn_t:
139
+ alternative_title_tsim:
140
140
  - when it begins to boil, add six pounds of Almond Nuts, after haying picked out all shells and dusted the nuts thoroughly; stir slowly, keeping the sides of the basin well washed, until nuts are as brown as wished, and slide off the spatula easily when raised up
141
141
  timestamp:
142
142
  - '2015-11-19T21:09:44.574Z'
143
- - object_model_s:
143
+ - object_model_ssi:
144
144
  - ImageFile
145
145
  id:
146
146
  - 7s75dn61x
147
- is_file_of_s:
147
+ is_file_of_ssi:
148
148
  - 7s75dn48d
149
- is_following_page_of_s:
149
+ is_following_page_of_ssi:
150
150
  - 7s75dn60x
151
- is_page_of_s:
151
+ is_page_of_ssi:
152
152
  - 7s75dn48d
153
- is_preceding_page_of_s:
153
+ is_preceding_page_of_ssi:
154
154
  - 7s75dn62x
155
- page_type_s:
155
+ page_type_ssi:
156
156
  - Normal
157
- hand_side_s:
157
+ hand_side_ssi:
158
158
  - RIGHT
159
- page_num_label_s:
159
+ page_num_label_ssi:
160
160
  - 7
161
- page_num_label_type_s:
161
+ page_num_label_type_ssi:
162
162
  - original
163
- text:
163
+ all_text_timv:
164
164
  - These Caramel receipts are the best in the worlds and the author questions the ability of any one to produce a Caramel that will excell them in any particular. After once making by either one of the following formulas, no other will be used, as they are worth a dozen times the price of this book, to any one wishing to give his trade a fine Caramel.
165
- isbn_t:
165
+ alternative_title_tsim:
166
166
  - These Caramel receipts are the best in the worlds and the author questions the ability of any one to produce a Caramel that will excell them in any particular. After once making by either one of the following formulas, no other will be used, as they are worth a dozen times the price of this book, to any one wishing to give his trade a fine Caramel.
167
167
  timestamp:
168
168
  - '2015-11-20T21:09:44.574Z'
169
- - object_model_s:
169
+ - object_model_ssi:
170
170
  - ImageFile
171
171
  id:
172
172
  - 7s75dn62x
173
- is_file_of_s:
173
+ is_file_of_ssi:
174
174
  - 7s75dn48d
175
- is_following_page_of_s:
175
+ is_following_page_of_ssi:
176
176
  - 7s75dn61x
177
- is_page_of_s:
177
+ is_page_of_ssi:
178
178
  - 7s75dn48d
179
- is_preceding_page_of_s:
179
+ is_preceding_page_of_ssi:
180
180
  - 7s75dn63x
181
- page_type_s:
181
+ page_type_ssi:
182
182
  - Normal
183
- hand_side_s:
183
+ hand_side_ssi:
184
184
  - LEFT
185
- page_num_label_s:
185
+ page_num_label_ssi:
186
186
  - 8
187
- page_num_label_type_s:
187
+ page_num_label_type_ssi:
188
188
  - original
189
- text:
189
+ all_text_timv:
190
190
  - Same as Hickory-nut Cups, except make a center of almond paste, colored light green; when on the slab, add to the clear batch a few drops of red color, some Nectar flavor, and fold all together, pull on the hook to a bright pink, and finish as before.
191
- isbn_t:
191
+ alternative_title_tsim:
192
192
  - Same as Hickory-nut Cups, except make a center of almond paste, colored light green; when on the slab, add to the clear batch a few drops of red color, some Nectar flavor, and fold all together, pull on the hook to a bright pink, and finish as before.
193
193
  timestamp:
194
194
  - '2015-11-21T21:09:44.574Z'
195
- - object_model_s:
195
+ - object_model_ssi:
196
196
  - ImageFile
197
197
  id:
198
198
  - 7s75dn63x
199
- is_file_of_s:
199
+ is_file_of_ssi:
200
200
  - 7s75dn48d
201
- is_following_page_of_s:
201
+ is_following_page_of_ssi:
202
202
  - 7s75dn62x
203
- is_page_of_s:
203
+ is_page_of_ssi:
204
204
  - 7s75dn48d
205
- is_preceding_page_of_s:
205
+ is_preceding_page_of_ssi:
206
206
  - 7s75dn64x
207
- page_type_s:
207
+ page_type_ssi:
208
208
  - Normal
209
- hand_side_s:
209
+ hand_side_ssi:
210
210
  - RIGHT
211
- page_num_label_s:
211
+ page_num_label_ssi:
212
212
  - 9
213
- page_num_label_type_s:
213
+ page_num_label_type_ssi:
214
214
  - original
215
- text:
215
+ all_text_timv:
216
216
  - as it looks cloudy, pour it out at once in a deep pan; this must be done quickly or it will become hard in the basin; when cold, remove it it from the pan in the same manner as the pan creams; mark it into bars or large squares for the counter.
217
- isbn_t:
217
+ alternative_title_tsim:
218
218
  - as it looks cloudy, pour it out at once in a deep pan; this must be done quickly or it will become hard in the basin; when cold, remove it it from the pan in the same manner as the pan creams; mark it into bars or large squares for the counter.
219
219
  timestamp:
220
220
  - '2015-11-22T21:09:44.574Z'
221
- - object_model_s:
221
+ - object_model_ssi:
222
222
  - ImageFile
223
223
  id:
224
224
  - 7s75dn64x
225
- is_file_of_s:
225
+ is_file_of_ssi:
226
226
  - 7s75dn48d
227
- is_following_page_of_s:
227
+ is_following_page_of_ssi:
228
228
  - 7s75dn63x
229
- is_page_of_s:
229
+ is_page_of_ssi:
230
230
  - 7s75dn48d
231
- is_preceding_page_of_s:
231
+ is_preceding_page_of_ssi:
232
232
  - 7s75dn65x
233
- page_type_s:
233
+ page_type_ssi:
234
234
  - Normal
235
- hand_side_s:
235
+ hand_side_ssi:
236
236
  - LEFT
237
- page_num_label_s:
237
+ page_num_label_ssi:
238
238
  - 10
239
- page_num_label_type_s:
239
+ page_num_label_type_ssi:
240
240
  - original
241
- text:
241
+ all_text_timv:
242
242
  - cut into small squares; cook just to a thread; remove and, with the spatula, work the syrup on the sides of the basin till it becomes cloudy; pour all on a wire sieve, having a pan under it to catch the syrup that drains from the Cocoanuts
243
- isbn_t:
243
+ alternative_title_tsim:
244
244
  - cut into small squares; cook just to a thread; remove and, with the spatula, work the syrup on the sides of the basin till it becomes cloudy; pour all on a wire sieve, having a pan under it to catch the syrup that drains from the Cocoanuts
245
245
  timestamp:
246
246
  - '2015-11-23T21:09:44.574Z'
247
- - object_model_s:
247
+ - object_model_ssi:
248
248
  - ImageFile
249
249
  id:
250
250
  - 7s75dn65x
251
- is_file_of_s:
251
+ is_file_of_ssi:
252
252
  - 7s75dn48d
253
- is_following_page_of_s:
253
+ is_following_page_of_ssi:
254
254
  - 7s75dn64x
255
- is_page_of_s:
255
+ is_page_of_ssi:
256
256
  - 7s75dn48d
257
- # is_preceding_page_of_s:
257
+ # is_preceding_page_of_ssi:
258
258
  # - 7s75dn65x
259
- page_type_s:
259
+ page_type_ssi:
260
260
  - Normal
261
- hand_side_s:
261
+ hand_side_ssi:
262
262
  - RIGHT
263
- page_num_label_s:
263
+ page_num_label_ssi:
264
264
  - 11
265
- page_num_label_type_s:
265
+ page_num_label_type_ssi:
266
266
  - original
267
- text:
267
+ all_text_timv:
268
268
  - Take of dipping Cream any number of pounds desired, say five; put it into a basin inside of another one containing water; place on the fire; stir the Cream until dissolved, but not thin; add a few drops of red color, and flavor Nectar or Strawberry
269
- isbn_t:
269
+ alternative_title_tsim:
270
270
  - Take of dipping Cream any number of pounds desired, say five; put it into a basin inside of another one containing water; place on the fire; stir the Cream until dissolved, but not thin; add a few drops of red color, and flavor Nectar or Strawberry
271
271
  timestamp:
272
272
  - '2015-11-24T21:09:44.574Z'