blacklight 3.0pre1 → 3.0pre2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +0 -6
- data/README.rdoc +94 -87
- data/blacklight.gemspec +1 -1
- data/config/routes.rb +1 -1
- data/lib/blacklight.rb +2 -2
- data/lib/blacklight/catalog.rb +10 -12
- data/lib/blacklight/controller.rb +2 -2
- data/lib/blacklight/engine.rb +5 -2
- data/lib/blacklight/solr/document.rb +1 -1
- data/lib/blacklight/solr/document/marc.rb +1 -16
- data/lib/blacklight/solr_helper.rb +43 -14
- data/lib/blacklight/version.rb +1 -1
- data/lib/generators/blacklight/assets_generator.rb +25 -0
- data/lib/generators/blacklight/blacklight_generator.rb +16 -1
- data/lib/generators/blacklight/jetty_generator.rb +101 -0
- data/lib/generators/blacklight/solr_conf_generator.rb +25 -0
- data/lib/generators/blacklight/templates/catalog_controller.rb +0 -1
- data/lib/generators/blacklight/templates/config/solr.yml +14 -2
- data/lib/generators/blacklight/templates/public/images/{blacklight/bg.png → bg.png} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/border.png → border.png} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/bul_sq_gry.gif → bul_sq_gry.gif} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/checkmark.gif → checkmark.gif} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/logo.png → logo.png} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/magnifying_glass.gif → magnifying_glass.gif} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/remove.gif → remove.gif} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/separator.gif → separator.gif} +0 -0
- data/lib/generators/blacklight/templates/public/images/{blacklight/start_over.gif → start_over.gif} +0 -0
- data/lib/generators/blacklight/templates/public/javascripts/blacklight.js +5 -0
- data/lib/generators/blacklight/templates/public/stylesheets/blacklight.css +9 -3
- data/lib/generators/blacklight/templates/solr_conf/schema.xml +339 -0
- data/lib/generators/blacklight/templates/solr_conf/solrconfig.xml +578 -0
- data/lib/railties/all_tests.rake +11 -0
- data/lib/railties/blacklight.rake +0 -52
- data/lib/railties/blacklight_cucumber.rake +125 -0
- data/lib/railties/blacklight_rspec.rake +128 -0
- data/lib/railties/{test_solr_server.rb → jetty_solr_server.rb} +22 -45
- data/lib/railties/solr_marc.rake +24 -5
- data/test_support/.rspec +1 -0
- data/test_support/data/test_data.utf8.mrc +1 -0
- data/test_support/features/bookmarks.feature +88 -0
- data/test_support/features/did_you_mean.feature +129 -0
- data/test_support/features/folder.feature +67 -0
- data/test_support/features/librarian_view.feature +17 -0
- data/test_support/features/record_view.feature +34 -0
- data/test_support/features/saved_searches.feature +49 -0
- data/test_support/features/search.feature +86 -0
- data/test_support/features/search_filters.feature +121 -0
- data/test_support/features/search_history.feature +95 -0
- data/test_support/features/search_results.feature +61 -0
- data/test_support/features/search_sort.feature +29 -0
- data/test_support/features/step_definitions/bookmarks_steps.rb +5 -0
- data/test_support/features/step_definitions/error_steps.rb +4 -0
- data/test_support/features/step_definitions/folder_steps.rb +26 -0
- data/test_support/features/step_definitions/general_steps.rb +49 -0
- data/test_support/features/step_definitions/record_view_steps.rb +11 -0
- data/test_support/features/step_definitions/saved_searches_steps.rb +21 -0
- data/test_support/features/step_definitions/search_facets_steps.rb +28 -0
- data/test_support/features/step_definitions/search_history_steps.rb +8 -0
- data/test_support/features/step_definitions/search_result_steps.rb +113 -0
- data/test_support/features/step_definitions/search_steps.rb +102 -0
- data/test_support/features/step_definitions/user_steps.rb +4 -0
- data/test_support/features/step_definitions/web_steps.rb +211 -0
- data/test_support/features/support/env.rb +49 -0
- data/test_support/features/support/paths.rb +55 -0
- data/test_support/features/support/selectors.rb +39 -0
- data/test_support/features/unapi.feature +30 -0
- data/test_support/spec/controllers/application_controller_spec.rb +22 -0
- data/test_support/spec/controllers/catalog_controller_spec.rb +480 -0
- data/test_support/spec/controllers/folder_controller_spec.rb +40 -0
- data/test_support/spec/controllers/search_history_controller_spec.rb +45 -0
- data/test_support/spec/data/sample_docs.yml +655 -0
- data/test_support/spec/data/test_data.utf8.mrc +1 -0
- data/test_support/spec/helpers/blacklight_helper_spec.rb +482 -0
- data/test_support/spec/helpers/hash_as_hidden_fields_spec.rb +23 -0
- data/test_support/spec/helpers/render_constraints_helper_spec.rb +64 -0
- data/test_support/spec/helpers/search_history_helper_spec.rb +11 -0
- data/test_support/spec/helpers/solr_helper_spec.rb +873 -0
- data/test_support/spec/lib/blacklight_email_spec.rb +23 -0
- data/test_support/spec/lib/blacklight_sms_spec.rb +23 -0
- data/test_support/spec/lib/blacklight_solr_document_dublin_core_spec.rb +41 -0
- data/test_support/spec/lib/blacklight_solr_document_marc_spec.rb +88 -0
- data/test_support/spec/lib/blacklight_solr_document_spec.rb +173 -0
- data/test_support/spec/lib/blacklight_spec.rb +39 -0
- data/test_support/spec/lib/configurable_spec.rb +97 -0
- data/test_support/spec/lib/facet_paginator_spec.rb +93 -0
- data/test_support/spec/lib/marc_export_spec.rb +444 -0
- data/test_support/spec/lib/search_fields_spec.rb +105 -0
- data/test_support/spec/lib/tasks/blacklight_task_spec.rb +21 -0
- data/test_support/spec/lib/tasks/solr_marc_task_spec.rb +59 -0
- data/test_support/spec/models/bookmark_spec.rb +37 -0
- data/test_support/spec/models/record_mailer_spec.rb +67 -0
- data/test_support/spec/models/search_spec.rb +55 -0
- data/test_support/spec/models/solr_docment_spec.rb +111 -0
- data/test_support/spec/rcov.opts +3 -0
- data/test_support/spec/spec.opts +4 -0
- data/test_support/spec/spec_helper.rb +38 -0
- data/test_support/spec/support/action_controller.rb +42 -0
- data/test_support/spec/support/assert_difference.rb +16 -0
- data/test_support/spec/support/include_text.rb +20 -0
- data/test_support/spec/views/catalog/_constraints_element.html.erb_spec.rb +59 -0
- data/test_support/spec/views/catalog/_document_list.html.erb_spec.rb +8 -0
- data/test_support/spec/views/catalog/_facets.html.erb_spec.rb +182 -0
- data/test_support/spec/views/catalog/_index_partials/_default.erb_spec.rb +70 -0
- data/test_support/spec/views/catalog/_show_partials/_default.html.erb_spec.rb +70 -0
- data/test_support/spec/views/catalog/index.atom.builder_spec.rb +141 -0
- data/test_support/spec/views/catalog/show.html.erb_spec.rb +100 -0
- data/test_support/spec/views/catalog/unapi.xml.builder_spec.rb +45 -0
- metadata +95 -98
- data/lib/blacklight/marc.rb +0 -46
- data/lib/blacklight/marc/citation.rb +0 -251
- data/lib/railties/cucumber.rake +0 -53
- data/lib/railties/rspec.rake +0 -188
- data/spec/helpers/catalog_helper_spec.rb +0 -111
- data/spec/views/catalog/_sms_form.html.erb_spec.rb +0 -19
data/lib/blacklight/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Copy Blacklight assets to public folder in current app.
|
2
|
+
# If you want to do this on application startup, you can
|
3
|
+
# add this next line to your one of your environment files --
|
4
|
+
# generally you'd only want to do this in 'development', and can
|
5
|
+
# add it to environments/development.rb:
|
6
|
+
# require File.join(Blacklight.root, "lib", "generators", "blacklight", "assets_generator.rb")
|
7
|
+
# Blacklight::AssetsGenerator.start(["--force", "--quiet"])
|
8
|
+
|
9
|
+
|
10
|
+
# Need the requires here so we can call the generator from environment.rb
|
11
|
+
# as suggested above.
|
12
|
+
require 'rails/generators'
|
13
|
+
require 'rails/generators/base'
|
14
|
+
module Blacklight
|
15
|
+
class AssetsGenerator < Rails::Generators::Base
|
16
|
+
source_root File.expand_path('../templates', __FILE__)
|
17
|
+
|
18
|
+
def assets
|
19
|
+
directory("public/images", "public/images/blacklight")
|
20
|
+
directory("public/stylesheets", "public/stylesheets/blacklight")
|
21
|
+
directory("public/javascripts", "public/javascripts/blacklight")
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -60,6 +60,18 @@ EOF
|
|
60
60
|
generate "devise:install"
|
61
61
|
generate "devise", model_name.classify
|
62
62
|
generate "devise:views"
|
63
|
+
|
64
|
+
# add the #to_s to the model.
|
65
|
+
insert_into_file("app/models/#{model_name}.rb", :before => /end(\n| )*$/) do
|
66
|
+
%{
|
67
|
+
# Method added by Blacklight; Blacklight uses #to_s on your
|
68
|
+
# user class to get a user-displayable login/identifier for
|
69
|
+
# the account.
|
70
|
+
def to_s
|
71
|
+
email
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
63
75
|
end
|
64
76
|
end
|
65
77
|
|
@@ -70,9 +82,12 @@ EOF
|
|
70
82
|
directory("config/SolrMarc")
|
71
83
|
end
|
72
84
|
|
85
|
+
require File.expand_path('../assets_generator.rb', __FILE__)
|
73
86
|
# Copy all files in templates/public/ directory to public/
|
87
|
+
# Call external generator in AssetsGenerator, so we can
|
88
|
+
# leave that callable seperately too.
|
74
89
|
def copy_public_assets
|
75
|
-
|
90
|
+
Blacklight::AssetsGenerator.start()
|
76
91
|
end
|
77
92
|
|
78
93
|
# Setup the database migrations
|
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
module Blacklight
|
3
|
+
class Jetty < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
|
7
|
+
argument :save_location, :type=>"string", :desc => "where to install the jetty", :default => "./jetty"
|
8
|
+
class_option :environment, :aliases => "-e", :type=>"string", :desc => "environment to use jetty with. Will insert into solr.yml, and also offer to index test data in test environment.", :default => Rails.env
|
9
|
+
# change this to a different download if you want to peg to a different
|
10
|
+
# tagged version of our known-good jetty/solr.
|
11
|
+
class_option :download_url, :aliases => "-u", :type=>"string", :default =>"https://github.com/projectblacklight/blacklight-jetty/zipball/v1.4.1-1" , :desc=>"location of zip file including a jetty with solr setup for blacklight."
|
12
|
+
class_option :downloaded_package, :aliases => "-d", :type=>"string", :desc => "manual download of BL-jetty zip file"
|
13
|
+
|
14
|
+
|
15
|
+
desc """
|
16
|
+
Installs a jetty container with a solr installed in it. A solr setup known
|
17
|
+
good with default blacklight setup, including solr conf files for out
|
18
|
+
of the box blacklight.
|
19
|
+
|
20
|
+
Also adds jetty_path key to solr.yml for selected environment, to refer
|
21
|
+
to this install.
|
22
|
+
|
23
|
+
Requires system('unzip... ') to work, probably won't work on Windows.
|
24
|
+
|
25
|
+
"""
|
26
|
+
|
27
|
+
def download_jetty
|
28
|
+
tmp_save_dir = File.join(Rails.root, "tmp", "jetty_generator")
|
29
|
+
empty_directory(tmp_save_dir)
|
30
|
+
|
31
|
+
begin
|
32
|
+
unless options[:downloaded_package]
|
33
|
+
begin
|
34
|
+
say_status("fetching", options[:download_url])
|
35
|
+
zip_file = File.join(tmp_save_dir, "bl_jetty.zip")
|
36
|
+
get(options[:download_url], zip_file)
|
37
|
+
rescue Exception => e
|
38
|
+
say_status("error", "Could not download #{options[:download_url]} : #{e}", :red)
|
39
|
+
raise Thor::Error.new("Try downloading manually and then using '-d' option?")
|
40
|
+
end
|
41
|
+
else
|
42
|
+
zip_file = options[:downloaded_package]
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
say_status("unzipping", zip_file)
|
47
|
+
"unzip -d #{tmp_save_dir} -qo #{zip_file}".tap do |command|
|
48
|
+
system(command) or raise Thor::Error.new("Error executing: #{command}")
|
49
|
+
end
|
50
|
+
# It unzips into a top_level directory we've got to find by name
|
51
|
+
# in the tmp dir, sadly.
|
52
|
+
expanded_dir = Dir[File.join(tmp_save_dir, "projectblacklight-blacklight-jetty-*")].first
|
53
|
+
|
54
|
+
if File.exists?( save_location ) && ! options[:force]
|
55
|
+
raise Thor::Error.new("cancelled by user") unless [nil, "", "Y", "y"].include? ask("Copy over existing #{save_location}? [Yn]")
|
56
|
+
end
|
57
|
+
|
58
|
+
directory(expanded_dir, save_location, :verbose => false)
|
59
|
+
say_status("installed", save_location )
|
60
|
+
ensure
|
61
|
+
remove_dir(tmp_save_dir)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# the only thing that's REALLY BL-specific is these conf files
|
66
|
+
# installed by another generator. We write em on top of the solr we
|
67
|
+
# just installed. We "force" it because we're usually writing on top of files
|
68
|
+
# we just installed anyway. The user should have said 'no' to overwriting
|
69
|
+
# their dir if they already had one!
|
70
|
+
#
|
71
|
+
# If we later install Solr from somewhere other than BL jetty repo, we'd
|
72
|
+
# still want to write these on top, just like this.
|
73
|
+
def install_conf_files
|
74
|
+
generate("blacklight:solr_conf", "#{File.join(save_location, 'solr', 'conf')} --force")
|
75
|
+
end
|
76
|
+
|
77
|
+
# adds a jetty_path key to solr.yml for the current environment, so
|
78
|
+
# rake tasks for automatically starting jetty/solr (as well as
|
79
|
+
# for indexing with solrmarc) can find it.
|
80
|
+
def add_jetty_path_to_solr_yml
|
81
|
+
# inject_into_file no-ops silently if the :after isn't found, we
|
82
|
+
# want to be noisy.
|
83
|
+
config_file = "config/solr.yml"
|
84
|
+
config_file_full_path = File.expand_path(config_file, destination_root)
|
85
|
+
after_hook = /#{Regexp.escape(options[:environment])}\:[^\n]*\n/
|
86
|
+
|
87
|
+
if !(File.exists?(config_file_full_path) && File.binread( config_file_full_path ) =~ after_hook)
|
88
|
+
say_status("skipped", "Could not find '#{options[:environment]}' block in #{config_file} to add jetty_path to.", :red)
|
89
|
+
elsif File.binread( config_file_full_path ) =~ /#{Regexp.escape(options[:environment])}\:[^\n]*\n.*(?!\n\n).*jetty_path\:/
|
90
|
+
say_status("skipped", "#{config_file} '#{options[:environment]}' block already has jetty_path, not overwriting.", :red)
|
91
|
+
else
|
92
|
+
inject_into_file config_file, :verbose => false, :after => after_hook do
|
93
|
+
" jetty_path: '#{save_location}'\n"
|
94
|
+
end
|
95
|
+
say_status("insert", "#{config_file}: jetty_path key for '#{options[:environment]}' block")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Blacklight
|
2
|
+
class SolrConf < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
argument :target_path, :type=>:string, :default => "."
|
6
|
+
|
7
|
+
desc """
|
8
|
+
Generate solr config files solrconfig.xml and schema.xml
|
9
|
+
to directory you specify. (default current dir).
|
10
|
+
|
11
|
+
Conf files generated are set up to work with out-of-the-box default
|
12
|
+
blacklight.
|
13
|
+
|
14
|
+
You might want to put them into a solr setup, or you might just
|
15
|
+
want to look at them.
|
16
|
+
|
17
|
+
"""
|
18
|
+
|
19
|
+
# this generator used by test jetty generator too.
|
20
|
+
def solr_conf_files
|
21
|
+
copy_file "solr_conf/schema.xml", File.expand_path("./schema.xml", target_path)
|
22
|
+
copy_file "solr_conf/solrconfig.xml", File.expand_path("./solrconfig.xml", target_path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,6 +1,18 @@
|
|
1
|
+
# = jetty_path key
|
2
|
+
# each environment can have a jetty_path with absolute or relative
|
3
|
+
# (to app root) path to a jetty/solr install. This is used
|
4
|
+
# by the rake tasks that start up solr automatically for testing
|
5
|
+
# and by rake solr:marc:index.
|
6
|
+
#
|
7
|
+
# jetty_path is not used by a running Blacklight application
|
8
|
+
# at all. In general you do NOT need to deploy solr in Jetty, you can deploy it
|
9
|
+
# however you want.
|
10
|
+
# jetty_path is only required for rake tasks that need to know
|
11
|
+
# how to start up solr, generally for automated testing.
|
12
|
+
|
1
13
|
development:
|
2
14
|
url: http://127.0.0.1:8983/solr
|
3
|
-
test:
|
15
|
+
test: &test
|
4
16
|
url: http://127.0.0.1:8888/solr
|
5
17
|
cucumber:
|
6
|
-
|
18
|
+
<<: *test
|
File without changes
|
File without changes
|
data/lib/generators/blacklight/templates/public/images/{blacklight/bul_sq_gry.gif → bul_sq_gry.gif}
RENAMED
File without changes
|
data/lib/generators/blacklight/templates/public/images/{blacklight/checkmark.gif → checkmark.gif}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/generators/blacklight/templates/public/images/{blacklight/separator.gif → separator.gif}
RENAMED
File without changes
|
data/lib/generators/blacklight/templates/public/images/{blacklight/start_over.gif → start_over.gif}
RENAMED
File without changes
|
@@ -1,3 +1,8 @@
|
|
1
|
+
/* This file is generated by Blacklight. You probably don't want to edit
|
2
|
+
this file directly, or you'll have to manually merge your changes if later
|
3
|
+
versions of Blacklight change this file. Instead, use your own JS file
|
4
|
+
which over-rides things in this JS file, as described below: */
|
5
|
+
|
1
6
|
/* Blacklight has a Javascript setup meant to support local disabling,
|
2
7
|
modification, and use of Blacklight behaviors.
|
3
8
|
|
@@ -1,3 +1,9 @@
|
|
1
|
+
/* This file is generated by Blacklight. You probably don't want to edit
|
2
|
+
this file directly, or you'll have to manually merge your changes if later
|
3
|
+
versions of Blacklight change this file. Instead, use your own CSS file
|
4
|
+
which over-rides things in this file. Or of course you can choose
|
5
|
+
not to use the Blacklight CSS file at all in your local app. */
|
6
|
+
|
1
7
|
/* Global */
|
2
8
|
html {background: #707070;}
|
3
9
|
|
@@ -6,7 +12,7 @@ html {background: #707070;}
|
|
6
12
|
an accident. */
|
7
13
|
.ui-dialog-content { text-align: left; }
|
8
14
|
|
9
|
-
body {background: url('
|
15
|
+
body {background: url('../../images/blacklight/bg.png') repeat-x top left; font: 0.7em Verdana, "Lucida Grande", "Lucida Sans Unicode", "Arial Unicode MS", Arial, sans-serif; line-height: 1.4; color:#333; margin: 0px; padding: 15px;}
|
10
16
|
|
11
17
|
select,input,button,textarea {font: 1em Verdana, "Lucida Grande", "Lucida Sans Unicode", "Arial Unicode MS", Arial, sans-serif;}
|
12
18
|
|
@@ -32,7 +38,7 @@ a:hover {color: #029;}
|
|
32
38
|
#hd {margin: 0em 2em 0 2em; padding: 2em 0 2em 0; }
|
33
39
|
#hd .yui-g {text-align: right;}
|
34
40
|
#hd .yui-g .first {text-align: left;}
|
35
|
-
#doc, #doc2, #doc3, #doc4 {background: #fff url('
|
41
|
+
#doc, #doc2, #doc3, #doc4 {background: #fff url('../../images/blacklight/border.png') repeat-x top left; border-bottom: 2px solid #555; margin: 0px auto;}
|
36
42
|
/* border-top: 10px solid #548cd8; -moz-border-top-colors: #548cd8 #5188d3 #4e84d0 #4b81cd #497dc9 #457ac6 #4376c2 #4173be #3e71bc #3d6fba; */
|
37
43
|
|
38
44
|
/* Body Container Layout */
|
@@ -43,7 +49,7 @@ a:hover {color: #029;}
|
|
43
49
|
.sidebar p {padding-top: 2em;}
|
44
50
|
|
45
51
|
/* Top Banner */
|
46
|
-
h1.site_title {background: transparent url('
|
52
|
+
h1.site_title {background: transparent url('../../images/blacklight/logo.png') no-repeat top left; margin: 2em 0px 0px 1em; height: 35px; width: 120px;}
|
47
53
|
.first h1 {margin: 0px; padding: 0px;}
|
48
54
|
h1.site_title a {display:block; height: 35px; width:120px; text-indent: -9999px; overflow: hidden; text-decoration: none; border: 0px;}
|
49
55
|
h1.site_title a:link, h1.site_title a:visited, h1.site_title a:hover, h1.site_title a:active {border: 0px;}
|
@@ -0,0 +1,339 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<!--
|
3
|
+
For information on how to customize this file, please see
|
4
|
+
http://wiki.apache.org/solr/SchemaXml. The page also has a link to an
|
5
|
+
extensively commented version of this file.
|
6
|
+
-->
|
7
|
+
<schema name="Blacklight Demo Index" version="1.2">
|
8
|
+
<!-- attribute "name" is the name of this schema and is only used for display purposes.
|
9
|
+
Applications should change this to reflect the nature of the search collection.
|
10
|
+
version="1.2" is Solr's version number for the schema syntax and semantics. It should
|
11
|
+
not normally be changed by applications.
|
12
|
+
1.0: multiValued attribute did not exist, all fields are multiValued by nature
|
13
|
+
1.1: multiValued attribute introduced, false by default
|
14
|
+
1.2: omitTermFreqAndPositions attribute introduced, true by default except for text fields.
|
15
|
+
1.3: removed optional field compress feature
|
16
|
+
-->
|
17
|
+
<types>
|
18
|
+
<!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
|
19
|
+
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
|
20
|
+
<!-- boolean type: "true" or "false" -->
|
21
|
+
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
|
22
|
+
<!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
|
23
|
+
<fieldtype name="binary" class="solr.BinaryField"/>
|
24
|
+
|
25
|
+
<!-- The optional sortMissingLast and sortMissingFirst attributes are
|
26
|
+
currently supported on types that are sorted internally as strings.
|
27
|
+
This includes "string","boolean","sint","slong","sfloat","sdouble","pdate"
|
28
|
+
- If sortMissingLast="true", then a sort on this field will cause documents
|
29
|
+
without the field to come after documents with the field,
|
30
|
+
regardless of the requested sort order (asc or desc).
|
31
|
+
- If sortMissingFirst="true", then a sort on this field will cause documents
|
32
|
+
without the field to come before documents with the field,
|
33
|
+
regardless of the requested sort order.
|
34
|
+
- If sortMissingLast="false" and sortMissingFirst="false" (the default),
|
35
|
+
then default lucene sorting will be used which places docs without the
|
36
|
+
field first in an ascending sort and last in a descending sort.
|
37
|
+
-->
|
38
|
+
|
39
|
+
<!--
|
40
|
+
Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
|
41
|
+
-->
|
42
|
+
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
43
|
+
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
44
|
+
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
45
|
+
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
46
|
+
|
47
|
+
<!-- included for backwards compat, same as "pint" below. For backwards
|
48
|
+
compat only, see notes at "pint" -->
|
49
|
+
<fieldType name="integer" class="solr.IntField" omitNorms="true"/>
|
50
|
+
|
51
|
+
<!--
|
52
|
+
Numeric field types that index each value at various levels of precision
|
53
|
+
to accelerate range queries when the number of values between the range
|
54
|
+
endpoints is large. See the javadoc for NumericRangeQuery for internal
|
55
|
+
implementation details.
|
56
|
+
|
57
|
+
Smaller precisionStep values (specified in bits) will lead to more tokens
|
58
|
+
indexed per value, slightly larger index size, and faster range queries.
|
59
|
+
A precisionStep of 0 disables indexing at different precision levels.
|
60
|
+
-->
|
61
|
+
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
|
62
|
+
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
|
63
|
+
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
|
64
|
+
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
|
65
|
+
|
66
|
+
<!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
|
67
|
+
is a more restricted form of the canonical representation of dateTime
|
68
|
+
http://www.w3.org/TR/xmlschema-2/#dateTime
|
69
|
+
The trailing "Z" designates UTC time and is mandatory.
|
70
|
+
Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
|
71
|
+
All other components are mandatory.
|
72
|
+
|
73
|
+
Expressions can also be used to denote calculations that should be
|
74
|
+
performed relative to "NOW" to determine the value, ie...
|
75
|
+
|
76
|
+
NOW/HOUR
|
77
|
+
... Round to the start of the current hour
|
78
|
+
NOW-1DAY
|
79
|
+
... Exactly 1 day prior to now
|
80
|
+
NOW/DAY+6MONTHS+3DAYS
|
81
|
+
... 6 months and 3 days in the future from the start of
|
82
|
+
the current day
|
83
|
+
|
84
|
+
Consult the DateField javadocs for more information.
|
85
|
+
|
86
|
+
Note: For faster range queries, consider the tdate type
|
87
|
+
-->
|
88
|
+
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
|
89
|
+
|
90
|
+
<!-- A Trie based date field for faster date range queries and date faceting. -->
|
91
|
+
<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
|
92
|
+
|
93
|
+
<!--
|
94
|
+
Note:
|
95
|
+
These should only be used for compatibility with existing indexes (created with older Solr versions)
|
96
|
+
or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
|
97
|
+
|
98
|
+
Plain numeric field types that store and index the text
|
99
|
+
value verbatim (and hence don't support range queries, since the
|
100
|
+
lexicographic ordering isn't equal to the numeric ordering)
|
101
|
+
-->
|
102
|
+
<fieldType name="pint" class="solr.IntField" omitNorms="true"/>
|
103
|
+
<fieldType name="plong" class="solr.LongField" omitNorms="true"/>
|
104
|
+
<fieldType name="pfloat" class="solr.FloatField" omitNorms="true"/>
|
105
|
+
<fieldType name="pdouble" class="solr.DoubleField" omitNorms="true"/>
|
106
|
+
<fieldType name="pdate" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
|
107
|
+
|
108
|
+
<!--
|
109
|
+
Note:
|
110
|
+
These should only be used for compatibility with existing indexes (created with older Solr versions)
|
111
|
+
or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
|
112
|
+
|
113
|
+
Numeric field types that manipulate the value into
|
114
|
+
a string value that isn't human-readable in its internal form,
|
115
|
+
but with a lexicographic ordering the same as the numeric ordering,
|
116
|
+
so that range queries work correctly.
|
117
|
+
-->
|
118
|
+
<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
|
119
|
+
<fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
|
120
|
+
<fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
|
121
|
+
<fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
|
122
|
+
|
123
|
+
<!-- The "RandomSortField" is not used to store or search any
|
124
|
+
data. You can declare fields of this type it in your schema
|
125
|
+
to generate pseudo-random orderings of your docs for sorting
|
126
|
+
purposes. The ordering is generated based on the field name
|
127
|
+
and the version of the index, As long as the index version
|
128
|
+
remains unchanged, and the same field name is reused,
|
129
|
+
the ordering of the docs will be consistent.
|
130
|
+
If you want different psuedo-random orderings of documents,
|
131
|
+
for the same version of the index, use a dynamicField and
|
132
|
+
change the name
|
133
|
+
-->
|
134
|
+
<fieldType name="random" class="solr.RandomSortField" indexed="true" />
|
135
|
+
|
136
|
+
|
137
|
+
<!-- solr.TextField allows the specification of custom text analyzers
|
138
|
+
specified as a tokenizer and a list of token filters. Different
|
139
|
+
analyzers may be specified for indexing and querying.
|
140
|
+
|
141
|
+
The optional positionIncrementGap puts space between multiple fields of
|
142
|
+
this type on the same document, with the purpose of preventing false phrase
|
143
|
+
matching across fields.
|
144
|
+
|
145
|
+
For more info on customizing your analyzer chain, please see
|
146
|
+
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
|
147
|
+
-->
|
148
|
+
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
|
149
|
+
<analyzer type="index">
|
150
|
+
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
|
151
|
+
<!-- custom filter from bob@umich -->
|
152
|
+
<filter class="schema.UnicodeNormalizationFilterFactory" version="icu4j" composed="false" remove_diacritics="true" remove_modifiers="true" fold="true" />
|
153
|
+
<!-- cusotm filter from bob@umich, tokenizes CJK char-by-char. Not
|
154
|
+
sure how good that is, but it's probably better than tokenizing
|
155
|
+
only at whitespace. -->
|
156
|
+
<filter class="schema.CJKFilterFactory" bigrams="false"/>
|
157
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
|
158
|
+
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
|
159
|
+
<filter class="solr.LowerCaseFilterFactory"/>
|
160
|
+
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
|
161
|
+
</analyzer>
|
162
|
+
<analyzer type="query">
|
163
|
+
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
|
164
|
+
<filter class="schema.UnicodeNormalizationFilterFactory" version="icu4j" composed="false" remove_diacritics="true" remove_modifiers="true" fold="true" />
|
165
|
+
<filter class="schema.CJKFilterFactory" bigrams="false"/>
|
166
|
+
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
|
167
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
|
168
|
+
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
|
169
|
+
<filter class="solr.LowerCaseFilterFactory"/>
|
170
|
+
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
|
171
|
+
</analyzer>
|
172
|
+
</fieldType>
|
173
|
+
|
174
|
+
<!-- Analyzed Text, no Stemming or Synonyms -->
|
175
|
+
<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100">
|
176
|
+
<analyzer type="index">
|
177
|
+
<tokenizer class="solr.WhitespaceTokenizerFactory" />
|
178
|
+
<filter class="schema.UnicodeNormalizationFilterFactory" version="icu4j" composed="false" remove_diacritics="true" remove_modifiers="true" fold="true" />
|
179
|
+
<filter class="schema.CJKFilterFactory" bigrams="false"/>
|
180
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
|
181
|
+
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" />
|
182
|
+
<filter class="solr.LowerCaseFilterFactory" />
|
183
|
+
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
|
184
|
+
</analyzer>
|
185
|
+
<analyzer type="query">
|
186
|
+
<tokenizer class="solr.WhitespaceTokenizerFactory" />
|
187
|
+
<filter class="schema.UnicodeNormalizationFilterFactory" version="icu4j" composed="false" remove_diacritics="true" remove_modifiers="true" fold="true" />
|
188
|
+
<filter class="schema.CJKFilterFactory" bigrams="false"/>
|
189
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
|
190
|
+
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" />
|
191
|
+
<filter class="solr.LowerCaseFilterFactory" />
|
192
|
+
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
|
193
|
+
</analyzer>
|
194
|
+
</fieldtype>
|
195
|
+
|
196
|
+
<!-- Less flexible matching, but less false matches. Probably not ideal for product names, but may be good for SKUs. Can insert dashes in the wrong place and still match. -->
|
197
|
+
<fieldType name="textTight" class="solr.TextField" positionIncrementGap="100" >
|
198
|
+
<analyzer>
|
199
|
+
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
|
200
|
+
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
|
201
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
|
202
|
+
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
|
203
|
+
<filter class="solr.LowerCaseFilterFactory"/>
|
204
|
+
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
|
205
|
+
<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
|
206
|
+
possible with WordDelimiterFilter in conjuncton with stemming. -->
|
207
|
+
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
|
208
|
+
</analyzer>
|
209
|
+
</fieldType>
|
210
|
+
|
211
|
+
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" >
|
212
|
+
<analyzer>
|
213
|
+
<tokenizer class="solr.StandardTokenizerFactory"/>
|
214
|
+
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
|
215
|
+
<filter class="solr.StandardFilterFactory"/>
|
216
|
+
<filter class="solr.LowerCaseFilterFactory"/>
|
217
|
+
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
|
218
|
+
</analyzer>
|
219
|
+
</fieldType>
|
220
|
+
|
221
|
+
<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
|
222
|
+
<analyzer>
|
223
|
+
<!-- KeywordTokenizer does no actual tokenizing, so the entire
|
224
|
+
input string is preserved as a single token
|
225
|
+
-->
|
226
|
+
<tokenizer class="solr.KeywordTokenizerFactory"/>
|
227
|
+
<filter class="schema.UnicodeNormalizationFilterFactory" version="icu4j" composed="false" remove_diacritics="true" remove_modifiers="true" fold="true" />
|
228
|
+
<filter class="solr.LowerCaseFilterFactory" />
|
229
|
+
<filter class="solr.TrimFilterFactory" />
|
230
|
+
<!--
|
231
|
+
<filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z\d])" replacement="" replace="all" />
|
232
|
+
-->
|
233
|
+
</analyzer>
|
234
|
+
</fieldType>
|
235
|
+
</types>
|
236
|
+
|
237
|
+
<fields>
|
238
|
+
<!-- NOTE: this is not a full list of fields in the index; dynamic fields are also used -->
|
239
|
+
<field name="id" type="string" indexed="true" stored="true" required="true" />
|
240
|
+
<field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
|
241
|
+
<!-- default, catch all search field -->
|
242
|
+
<field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
|
243
|
+
|
244
|
+
<!-- these display fields are NOT multi-valued -->
|
245
|
+
<field name="marc_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
246
|
+
<field name="title_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
247
|
+
<field name="title_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
248
|
+
<field name="subtitle_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
249
|
+
<field name="subtitle_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
250
|
+
<field name="author_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
251
|
+
<field name="author_vern_display" type="string" indexed="false" stored="true" multiValued="false"/>
|
252
|
+
|
253
|
+
<!-- these fields are also used for display, so they must be stored -->
|
254
|
+
<field name="isbn_t" type="text" indexed="true" stored="true" multiValued="true"/>
|
255
|
+
<field name="language_facet" type="string" indexed="true" stored="true" multiValued="true" />
|
256
|
+
<field name="subject_topic_facet" type="string" indexed="true" stored="true" multiValued="true" />
|
257
|
+
<field name="subject_era_facet" type="string" indexed="true" stored="true" multiValued="true" />
|
258
|
+
<field name="subject_geo_facet" type="string" indexed="true" stored="true" multiValued="true" />
|
259
|
+
<!-- pub_date is used for facet and display so it must be indexed and stored -->
|
260
|
+
<field name="pub_date" type="string" indexed="true" stored="true" multiValued="true"/>
|
261
|
+
<!-- pub_date sort uses new trie-based int fields, which are recommended for any int and are displayable, sortable, and range-query-able. In addition,
|
262
|
+
we use 'tint' for faster range-queries. -->
|
263
|
+
<field name="pub_date_sort" type="tint" indexed="true" stored="true" multiValued="false"/>
|
264
|
+
|
265
|
+
<!-- format is used for facet, display, and choosing which partial to use for the show view, so it must be stored and indexed -->
|
266
|
+
<field name="format" type="string" indexed="true" stored="true"/>
|
267
|
+
|
268
|
+
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
|
269
|
+
<dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="true"/>
|
270
|
+
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
|
271
|
+
<dynamicField name="*_t" type="text" indexed="true" stored="false" multiValued="true"/>
|
272
|
+
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
|
273
|
+
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
|
274
|
+
<dynamicField name="*_d" type="double" indexed="true" stored="true"/>
|
275
|
+
<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
|
276
|
+
<dynamicField name="random*" type="random" />
|
277
|
+
|
278
|
+
<dynamicField name="*_facet" type="string" indexed="true" stored="false" multiValued="true" />
|
279
|
+
<dynamicField name="*_display" type="string" indexed="false" stored="true" multiValued="true" />
|
280
|
+
<dynamicField name="*_sort" type="alphaOnlySort" indexed="true" stored="false"/>
|
281
|
+
<dynamicField name="*_unstem_search" type="textNoStem" indexed="true" stored="false" multiValued="true" />
|
282
|
+
<dynamicField name="*spell" type="textSpell" indexed="true" stored="false" multiValued="true"/>
|
283
|
+
|
284
|
+
</fields>
|
285
|
+
|
286
|
+
<uniqueKey>id</uniqueKey>
|
287
|
+
<defaultSearchField>text</defaultSearchField>
|
288
|
+
<solrQueryParser defaultOperator="OR"/>
|
289
|
+
|
290
|
+
<!-- Copy Fields -->
|
291
|
+
|
292
|
+
<!-- unstemmed fields -->
|
293
|
+
<copyField source="title_t" dest="title_unstem_search"/>
|
294
|
+
<copyField source="subtitle_t" dest="subtitle_unstem_search"/>
|
295
|
+
<copyField source="title_addl_t" dest="title_addl_unstem_search"/>
|
296
|
+
<copyField source="title_added_entry_t" dest="title_added_entry_unstem_search"/>
|
297
|
+
<copyField source="title_series_t" dest="title_series_unstem_search"/>
|
298
|
+
<copyField source="author_t" dest="author_unstem_search"/>
|
299
|
+
<copyField source="author_addl_t" dest="author_addl_unstem_search"/>
|
300
|
+
<copyField source="subject_t" dest="subject_unstem_search"/>
|
301
|
+
<copyField source="subject_addl_t" dest="subject_addl_unstem_search"/>
|
302
|
+
<copyField source="subject_topic_facet" dest="subject_topic_unstem_search"/>
|
303
|
+
|
304
|
+
<!-- sort fields -->
|
305
|
+
<copyField source="pub_date" dest="pub_date_sort"/>
|
306
|
+
|
307
|
+
|
308
|
+
<!-- spellcheck fields -->
|
309
|
+
<!-- default spell check; should match fields for default request handler -->
|
310
|
+
<!-- it won't work with a copy of a copy field -->
|
311
|
+
<copyField source="*_t" dest="spell"/>
|
312
|
+
<copyField source="*_facet" dest="spell"/>
|
313
|
+
<!-- title spell check; should match fields for title request handler -->
|
314
|
+
<copyField source="title_t" dest="title_spell"/>
|
315
|
+
<copyField source="subtitle_t" dest="title_spell"/>
|
316
|
+
<copyField source="addl_titles_t" dest="title_spell"/>
|
317
|
+
<copyField source="title_added_entry_t" dest="title_spell"/>
|
318
|
+
<copyField source="title_series_t" dest="title_spell"/>
|
319
|
+
<!-- author spell check; should match fields for author request handler -->
|
320
|
+
<copyField source="author_t" dest="author_spell"/>
|
321
|
+
<copyField source="author_addl_t" dest="author_spell"/>
|
322
|
+
<!-- subject spell check; should match fields for subject request handler -->
|
323
|
+
<copyField source="subject_topic_facet" dest="subject_spell"/>
|
324
|
+
<copyField source="subject_t" dest="subject_spell"/>
|
325
|
+
<copyField source="subject_addl_t" dest="subject_spell"/>
|
326
|
+
|
327
|
+
<!-- OpenSearch query field should match request handler search fields -->
|
328
|
+
<copyField source="title_t" dest="opensearch_display"/>
|
329
|
+
<copyField source="subtitle_t" dest="opensearch_display"/>
|
330
|
+
<copyField source="addl_titles_t" dest="opensearch_display"/>
|
331
|
+
<copyField source="title_added_entry_t" dest="opensearch_display"/>
|
332
|
+
<copyField source="title_series_t" dest="opensearch_display"/>
|
333
|
+
<copyField source="author_t" dest="opensearch_display"/>
|
334
|
+
<copyField source="author_addl_t" dest="opensearch_display"/>
|
335
|
+
<copyField source="subject_topic_facet" dest="opensearch_display"/>
|
336
|
+
<copyField source="subject_t" dest="opensearch_display"/>
|
337
|
+
<copyField source="subject_addl_t" dest="opensearch_display"/>
|
338
|
+
|
339
|
+
</schema>
|