benjaminkrause-sunspot 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. data/History.txt +107 -0
  2. data/LICENSE +18 -0
  3. data/README.rdoc +159 -0
  4. data/Rakefile +9 -0
  5. data/TODO +11 -0
  6. data/VERSION.yml +4 -0
  7. data/bin/sunspot-configure-solr +46 -0
  8. data/bin/sunspot-solr +86 -0
  9. data/lib/light_config.rb +40 -0
  10. data/lib/sunspot/adapters.rb +265 -0
  11. data/lib/sunspot/composite_setup.rb +184 -0
  12. data/lib/sunspot/configuration.rb +49 -0
  13. data/lib/sunspot/data_extractor.rb +50 -0
  14. data/lib/sunspot/dsl/field_query.rb +77 -0
  15. data/lib/sunspot/dsl/fields.rb +95 -0
  16. data/lib/sunspot/dsl/fulltext.rb +106 -0
  17. data/lib/sunspot/dsl/query.rb +107 -0
  18. data/lib/sunspot/dsl/query_facet.rb +31 -0
  19. data/lib/sunspot/dsl/restriction.rb +25 -0
  20. data/lib/sunspot/dsl/scope.rb +193 -0
  21. data/lib/sunspot/dsl/search.rb +30 -0
  22. data/lib/sunspot/dsl.rb +4 -0
  23. data/lib/sunspot/facet.rb +24 -0
  24. data/lib/sunspot/facet_data.rb +152 -0
  25. data/lib/sunspot/facet_row.rb +12 -0
  26. data/lib/sunspot/field.rb +148 -0
  27. data/lib/sunspot/field_factory.rb +141 -0
  28. data/lib/sunspot/indexer.rb +129 -0
  29. data/lib/sunspot/instantiated_facet.rb +45 -0
  30. data/lib/sunspot/instantiated_facet_row.rb +27 -0
  31. data/lib/sunspot/query/base_query.rb +55 -0
  32. data/lib/sunspot/query/boost_query.rb +20 -0
  33. data/lib/sunspot/query/connective.rb +148 -0
  34. data/lib/sunspot/query/dynamic_query.rb +61 -0
  35. data/lib/sunspot/query/field_facet.rb +129 -0
  36. data/lib/sunspot/query/field_query.rb +69 -0
  37. data/lib/sunspot/query/fulltext_base_query.rb +86 -0
  38. data/lib/sunspot/query/highlighting.rb +36 -0
  39. data/lib/sunspot/query/local.rb +24 -0
  40. data/lib/sunspot/query/pagination.rb +39 -0
  41. data/lib/sunspot/query/query_facet.rb +78 -0
  42. data/lib/sunspot/query/query_facet_row.rb +19 -0
  43. data/lib/sunspot/query/query_field_facet.rb +20 -0
  44. data/lib/sunspot/query/restriction.rb +272 -0
  45. data/lib/sunspot/query/scope.rb +185 -0
  46. data/lib/sunspot/query/sort.rb +105 -0
  47. data/lib/sunspot/query/sort_composite.rb +33 -0
  48. data/lib/sunspot/query/text_field_boost.rb +15 -0
  49. data/lib/sunspot/query.rb +108 -0
  50. data/lib/sunspot/schema.rb +147 -0
  51. data/lib/sunspot/search/highlight.rb +38 -0
  52. data/lib/sunspot/search/hit.rb +113 -0
  53. data/lib/sunspot/search.rb +240 -0
  54. data/lib/sunspot/session.rb +206 -0
  55. data/lib/sunspot/setup.rb +312 -0
  56. data/lib/sunspot/text_field_setup.rb +29 -0
  57. data/lib/sunspot/type.rb +200 -0
  58. data/lib/sunspot/util.rb +190 -0
  59. data/lib/sunspot.rb +459 -0
  60. data/solr/etc/jetty.xml +212 -0
  61. data/solr/etc/webdefault.xml +379 -0
  62. data/solr/lib/jetty-6.1.3.jar +0 -0
  63. data/solr/lib/jetty-util-6.1.3.jar +0 -0
  64. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  65. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  66. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  67. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  68. data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
  69. data/solr/solr/conf/elevate.xml +36 -0
  70. data/solr/solr/conf/protwords.txt +21 -0
  71. data/solr/solr/conf/schema.xml +64 -0
  72. data/solr/solr/conf/solrconfig.xml +726 -0
  73. data/solr/solr/conf/stopwords.txt +57 -0
  74. data/solr/solr/conf/synonyms.txt +31 -0
  75. data/solr/start.jar +0 -0
  76. data/solr/webapps/solr.war +0 -0
  77. data/spec/api/adapters_spec.rb +33 -0
  78. data/spec/api/indexer/attributes_spec.rb +100 -0
  79. data/spec/api/indexer/batch_spec.rb +46 -0
  80. data/spec/api/indexer/dynamic_fields_spec.rb +33 -0
  81. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  82. data/spec/api/indexer/fulltext_spec.rb +43 -0
  83. data/spec/api/indexer/removal_spec.rb +46 -0
  84. data/spec/api/indexer/spec_helper.rb +1 -0
  85. data/spec/api/indexer_spec.rb +4 -0
  86. data/spec/api/query/connectives_spec.rb +161 -0
  87. data/spec/api/query/dsl_spec.rb +12 -0
  88. data/spec/api/query/dynamic_fields_spec.rb +148 -0
  89. data/spec/api/query/faceting_spec.rb +272 -0
  90. data/spec/api/query/fulltext_spec.rb +152 -0
  91. data/spec/api/query/highlighting_spec.rb +82 -0
  92. data/spec/api/query/local_spec.rb +37 -0
  93. data/spec/api/query/ordering_pagination_spec.rb +95 -0
  94. data/spec/api/query/scope_spec.rb +253 -0
  95. data/spec/api/query/spec_helper.rb +1 -0
  96. data/spec/api/query/text_field_scoping_spec.rb +30 -0
  97. data/spec/api/query/types_spec.rb +20 -0
  98. data/spec/api/search/dynamic_fields_spec.rb +27 -0
  99. data/spec/api/search/faceting_spec.rb +206 -0
  100. data/spec/api/search/highlighting_spec.rb +65 -0
  101. data/spec/api/search/hits_spec.rb +62 -0
  102. data/spec/api/search/results_spec.rb +52 -0
  103. data/spec/api/search/search_spec.rb +11 -0
  104. data/spec/api/search/spec_helper.rb +1 -0
  105. data/spec/api/session_spec.rb +157 -0
  106. data/spec/api/spec_helper.rb +1 -0
  107. data/spec/api/sunspot_spec.rb +18 -0
  108. data/spec/helpers/indexer_helper.rb +29 -0
  109. data/spec/helpers/query_helper.rb +13 -0
  110. data/spec/helpers/search_helper.rb +78 -0
  111. data/spec/integration/dynamic_fields_spec.rb +55 -0
  112. data/spec/integration/faceting_spec.rb +169 -0
  113. data/spec/integration/highlighting_spec.rb +22 -0
  114. data/spec/integration/keyword_search_spec.rb +148 -0
  115. data/spec/integration/local_search_spec.rb +47 -0
  116. data/spec/integration/scoped_search_spec.rb +303 -0
  117. data/spec/integration/spec_helper.rb +1 -0
  118. data/spec/integration/stored_fields_spec.rb +10 -0
  119. data/spec/integration/test_pagination.rb +32 -0
  120. data/spec/mocks/adapters.rb +32 -0
  121. data/spec/mocks/blog.rb +3 -0
  122. data/spec/mocks/comment.rb +19 -0
  123. data/spec/mocks/connection.rb +84 -0
  124. data/spec/mocks/mock_adapter.rb +30 -0
  125. data/spec/mocks/mock_record.rb +48 -0
  126. data/spec/mocks/photo.rb +8 -0
  127. data/spec/mocks/post.rb +75 -0
  128. data/spec/mocks/super_class.rb +2 -0
  129. data/spec/mocks/user.rb +8 -0
  130. data/spec/spec_helper.rb +60 -0
  131. data/tasks/gemspec.rake +35 -0
  132. data/tasks/rcov.rake +28 -0
  133. data/tasks/rdoc.rake +22 -0
  134. data/tasks/schema.rake +19 -0
  135. data/tasks/spec.rake +24 -0
  136. data/tasks/todo.rake +4 -0
  137. data/templates/schema.xml.erb +36 -0
  138. metadata +312 -0
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'post')
2
+
3
+ module MockAdapter
4
+ class InstanceAdapter < Sunspot::Adapters::InstanceAdapter
5
+ def id
6
+ @instance.id
7
+ end
8
+ end
9
+
10
+ class DataAccessor < Sunspot::Adapters::DataAccessor
11
+ def load(id)
12
+ @clazz.get(id.to_i)
13
+ end
14
+
15
+ def load_all(ids)
16
+ all = @clazz.get_all(ids.map { |id| id.to_i })
17
+ if @custom_title
18
+ all.each { |item| item.title = @custom_title }
19
+ end
20
+ all
21
+ end
22
+
23
+ def custom_title=(custom_title)
24
+ @custom_title = custom_title
25
+ end
26
+ end
27
+ end
28
+
29
+ Sunspot::Adapters::DataAccessor.register(MockAdapter::DataAccessor, MockRecord)
30
+ Sunspot::Adapters::InstanceAdapter.register(MockAdapter::InstanceAdapter, MockRecord)
@@ -0,0 +1,48 @@
1
+ class MockRecord
2
+ IDS = Hash.new { |h, k| h[k] = 0 }
3
+ QUERY_COUNTS = Hash.new { |h, k| h[k] = 0 }
4
+ INSTANCES = Hash.new { |h, k| h[k] = {} }
5
+
6
+ attr_reader :id
7
+
8
+ class <<self
9
+ def reset!
10
+ IDS[name.to_sym] = 0
11
+ INSTANCES[name.to_sym] = {}
12
+ end
13
+ end
14
+
15
+ def initialize(attrs = {})
16
+ attrs.each_pair do |name, value|
17
+ send(:"#{name}=", value)
18
+ end
19
+ @id = IDS[self.class.name.to_sym] += 1
20
+ INSTANCES[self.class.name.to_sym][@id] = self
21
+ end
22
+
23
+ def self.inherited(base)
24
+ base.extend(ClassMethods)
25
+ end
26
+
27
+ module ClassMethods
28
+ def get(id)
29
+ QUERY_COUNTS[self.name.to_sym] += 1
30
+ get_instance(id)
31
+ end
32
+
33
+ def get_all(ids)
34
+ QUERY_COUNTS[self.name.to_sym] += 1
35
+ ids.map { |id| get_instance(id) }.sort_by { |instance| instance.id }
36
+ end
37
+
38
+ def query_count
39
+ QUERY_COUNTS[self.name.to_sym]
40
+ end
41
+
42
+ private
43
+
44
+ def get_instance(id)
45
+ INSTANCES[self.name.to_sym][id]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ class Photo < MockRecord
2
+ attr_accessor :caption
3
+ end
4
+
5
+ Sunspot.setup(Photo) do
6
+ text :caption
7
+ boost 0.75
8
+ end
@@ -0,0 +1,75 @@
1
+ require File.join(File.dirname(__FILE__), 'blog')
2
+ require File.join(File.dirname(__FILE__), 'super_class')
3
+
4
+ class Post < SuperClass
5
+ attr_accessor :title, :body, :blog_id, :published_at, :ratings_average,
6
+ :author_name, :featured, :expire_date, :coordinates
7
+ alias_method :featured?, :featured
8
+
9
+ def category_ids
10
+ @category_ids ||= []
11
+ end
12
+
13
+ def custom_string
14
+ @custom_string ||= {}
15
+ end
16
+
17
+ def custom_fl
18
+ @custom_fl ||= {}
19
+ end
20
+
21
+ def custom_time
22
+ @custom_time ||= {}
23
+ end
24
+
25
+ def custom_boolean
26
+ @custom_boolean ||= {}
27
+ end
28
+
29
+ private
30
+ attr_writer :category_ids, :custom_string, :custom_fl, :custom_time, :custom_boolean
31
+ end
32
+
33
+ Sunspot.setup(Post) do
34
+ text :title, :boost => 2
35
+ text :body, :stored => true
36
+ text :backwards_title do
37
+ title.reverse if title
38
+ end
39
+ string :title, :stored => true
40
+ integer :blog_id, :references => Blog
41
+ integer :category_ids, :multiple => true
42
+ float :average_rating, :using => :ratings_average
43
+ time :published_at
44
+ date :expire_date
45
+ boolean :featured, :using => :featured?
46
+ string :sort_title do
47
+ title.downcase.sub(/^(a|an|the)\W+/, '') if title
48
+ end
49
+ integer :primary_category_id do |post|
50
+ post.category_ids.first
51
+ end
52
+ time :last_indexed_at, :stored => true do
53
+ Time.now
54
+ end
55
+ coordinates :coordinates
56
+
57
+ dynamic_string :custom_string
58
+ dynamic_float :custom_float, :multiple => true, :using => :custom_fl
59
+ dynamic_integer :custom_integer do
60
+ category_ids.inject({}) do |hash, category_id|
61
+ hash.merge(category_id => 1)
62
+ end
63
+ end
64
+ dynamic_time :custom_time
65
+ dynamic_boolean :custom_boolean
66
+
67
+ boost do
68
+ if ratings_average
69
+ 1 + (ratings_average - 3.0) / 4.0
70
+ end
71
+ end
72
+ end
73
+
74
+ class PhotoPost < Post
75
+ end
@@ -0,0 +1,2 @@
1
+ class SuperClass < MockRecord
2
+ end
@@ -0,0 +1,8 @@
1
+ class User
2
+ attr_accessor :name
3
+ end
4
+
5
+ Sunspot.setup(User) do
6
+ text :name
7
+ string :name
8
+ end
@@ -0,0 +1,60 @@
1
+ using_gems = false
2
+ begin
3
+ require 'spec'
4
+ begin
5
+ require 'ruby-debug'
6
+ rescue LoadError => e
7
+ if using_gems
8
+ module Kernel
9
+ def debugger
10
+ STDERR.puts('Debugger is not available')
11
+ end
12
+ end
13
+ else
14
+ raise(e)
15
+ end
16
+ end
17
+ if ENV['USE_WILL_PAGINATE']
18
+ require 'will_paginate'
19
+ require 'will_paginate/collection'
20
+ end
21
+ rescue LoadError => e
22
+ require 'rubygems'
23
+ if using_gems
24
+ raise(e)
25
+ else
26
+ using_gems = true
27
+ retry
28
+ end
29
+ end
30
+ require 'ostruct'
31
+
32
+ unless gem_name = ENV['SUNSPOT_TEST_GEM']
33
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
34
+ else
35
+ gem gem_name
36
+ end
37
+ require 'sunspot'
38
+
39
+ require File.join(File.dirname(__FILE__), 'mocks', 'mock_record.rb')
40
+ Dir.glob(File.join(File.dirname(__FILE__), 'mocks', '**', '*.rb')).each do |file|
41
+ require file unless File.basename(file) == 'mock_record.rb'
42
+ end
43
+
44
+ Spec::Runner.configure do |config|
45
+ Dir.glob(File.join(File.dirname(__FILE__), 'helpers', '*_helper.rb')).each do |helper|
46
+ helper_name = File.basename(helper, File.extname(helper))
47
+ spec_type = helper_name.sub(/_helper$/, '').to_sym
48
+ require(helper)
49
+ config.include(
50
+ Sunspot::Util.full_const_get(Sunspot::Util.camel_case(helper_name)),
51
+ :type => spec_type
52
+ )
53
+ end
54
+ end
55
+
56
+ def without_class(clazz)
57
+ Object.class_eval { remove_const(clazz.name.to_sym) }
58
+ yield
59
+ Object.class_eval { const_set(clazz.name.to_sym, clazz) }
60
+ end
@@ -0,0 +1,35 @@
1
+ begin
2
+ require 'jeweler'
3
+ require 'jeweler/rubyforge_tasks'
4
+ Jeweler::Tasks.new do |s|
5
+ s.name = 'sunspot'
6
+ s.executables = ['sunspot-solr', 'sunspot-configure-solr']
7
+ s.email = 'mat@patch.com'
8
+ s.homepage = 'http://github.com/outoftime/sunspot'
9
+ s.summary = 'Library for expressive, powerful interaction with the Solr search engine'
10
+ s.description = <<TEXT
11
+ Sunspot is a library providing a powerful, all-ruby API for the Solr search engine. Sunspot manages the configuration of persistent Ruby classes for search and indexing and exposes Solr's most powerful features through a collection of DSLs. Complex search operations can be performed without hand-writing any boolean queries or building Solr parameters by hand.
12
+ TEXT
13
+ s.authors = ['Mat Brown', 'Peer Allan', 'Dmitriy Dzema', 'Benjamin Krause', 'Brandon Keepers']
14
+ s.rubyforge_project = 'sunspot'
15
+ s.files = FileList['[A-Z]*', '{bin,lib,spec,tasks,templates}/**/*', 'solr/{etc,lib,webapps}/**/*', 'solr/solr/conf/*', 'solr/start.jar']
16
+ s.add_dependency 'mwmitchell-rsolr', '= 0.9.1'
17
+ s.add_dependency 'daemons', '~> 1.0'
18
+ s.add_dependency 'optiflag', '~> 0.6.5'
19
+ s.add_development_dependency 'rspec', '~> 1.1'
20
+ s.add_development_dependency 'ruby-debug', '~> 0.10'
21
+ s.add_development_dependency 'technicalpickles-jeweler', '1.2.1'
22
+ s.extra_rdoc_files = ['README.rdoc']
23
+ s.rdoc_options << '--webcvs=http://github.com/outoftime/sunspot/tree/master/%s' <<
24
+ '--title' << 'Sunspot - Solr-powered search for Ruby objects - API Documentation' <<
25
+ '--main' << 'README.rdoc'
26
+
27
+ end
28
+
29
+ Jeweler::RubyforgeTasks.new
30
+ end
31
+
32
+ namespace :release do
33
+ desc "Release gem to RubyForge and GitHub"
34
+ task :all => [:"rubyforge:release:gem", :release]
35
+ end
data/tasks/rcov.rake ADDED
@@ -0,0 +1,28 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+
4
+ desc 'run specs with rcov'
5
+ Spec::Rake::SpecTask.new('rcov') do |t|
6
+ t.spec_files = FileList['spec/**/*_spec.rb']
7
+ t.rcov = true
8
+ t.rcov_dir = File.join('coverage', 'all')
9
+ t.rcov_opts.concat(['--exclude', 'spec', '--sort', 'coverage', '--only-uncovered'])
10
+ end
11
+
12
+ namespace :rcov do
13
+ desc 'run api specs with rcov'
14
+ Spec::Rake::SpecTask.new('api') do |t|
15
+ t.spec_files = FileList['spec/api/*_spec.rb']
16
+ t.rcov = true
17
+ t.rcov_dir = File.join('coverage', 'api')
18
+ t.rcov_opts.concat(['--exclude', 'spec', '--sort', 'coverage', '--only-uncovered'])
19
+ end
20
+
21
+ desc 'run integration specs with rcov'
22
+ Spec::Rake::SpecTask.new('integration') do |t|
23
+ t.spec_files = FileList['spec/integration/*_spec.rb']
24
+ t.rcov = true
25
+ t.rcov_dir = File.join('coverage', 'integration')
26
+ t.rcov_opts.concat(['--exclude', 'spec', '--sort', 'coverage', '--only-uncovered'])
27
+ end
28
+ end
data/tasks/rdoc.rake ADDED
@@ -0,0 +1,22 @@
1
+ gem 'mislav-hanna'
2
+ require 'hanna/rdoctask'
3
+ require 'jeweler'
4
+
5
+ Rake::RDocTask.new(:doc) do |rdoc|
6
+ version = Jeweler::VersionHelper.new(File.join(File.dirname(__FILE__), '..')).to_s
7
+ rdoc.title = "Sunspot #{version} - Solr-powered search for Ruby objects - API Documentation"
8
+ rdoc.main = 'README.rdoc'
9
+ rdoc.rdoc_files.include('README.rdoc', 'lib/sunspot.rb', 'lib/sunspot/**/*.rb')
10
+ rdoc.rdoc_dir = 'doc'
11
+ rdoc.options << "--webcvs=http://github.com/outoftime/sunspot/tree/v#{version}/%s" << '--title' << 'Sunspot - Solr-powered search for Ruby objects - API Documentation'
12
+ end
13
+
14
+ namespace :doc do
15
+ desc 'Generate rdoc and move into pages directory'
16
+ task :publish => :redoc do
17
+ doc_dir = File.join(File.dirname(__FILE__), '..', 'doc')
18
+ publish_dir = File.join(File.dirname(__FILE__), '..', 'pages', 'docs')
19
+ FileUtils.rm_rf(publish_dir) if File.exist?(publish_dir)
20
+ FileUtils.cp_r(doc_dir, publish_dir)
21
+ end
22
+ end
data/tasks/schema.rake ADDED
@@ -0,0 +1,19 @@
1
+ namespace :schema do
2
+ desc 'Generate schema from template'
3
+ task :compile do
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'sunspot', 'schema')
5
+ File.open(
6
+ File.join(
7
+ File.dirname(__FILE__),
8
+ '..',
9
+ 'solr',
10
+ 'solr',
11
+ 'conf',
12
+ 'schema.xml'
13
+ ),
14
+ 'w'
15
+ ) do |file|
16
+ file << Sunspot::Schema.new.to_xml
17
+ end
18
+ end
19
+ end
data/tasks/spec.rake ADDED
@@ -0,0 +1,24 @@
1
+ gem 'rspec', '~>1.1'
2
+
3
+ require 'spec'
4
+ require 'spec/rake/spectask'
5
+
6
+ desc 'run specs'
7
+ Spec::Rake::SpecTask.new('spec') do |t|
8
+ t.spec_files = FileList[File.join(File.dirname(__FILE__), '..', 'spec', '**', '*_spec.rb')]
9
+ t.spec_opts = ['--color']
10
+ end
11
+
12
+ namespace :spec do
13
+ desc 'run api specs (mock out Solr dependency)'
14
+ Spec::Rake::SpecTask.new('api') do |t|
15
+ t.spec_files = FileList[File.join(File.dirname(__FILE__), '..', 'spec', 'api', '**', '*_spec.rb')]
16
+ t.spec_opts = ['--color']
17
+ end
18
+
19
+ desc 'run integration specs (be sure to run `bin/sunspot-solr start`)'
20
+ Spec::Rake::SpecTask.new('integration') do |t|
21
+ t.spec_files = FileList[File.join(File.dirname(__FILE__), '..', 'spec', 'integration', '*_spec.rb')]
22
+ t.spec_opts = ['--color']
23
+ end
24
+ end
data/tasks/todo.rake ADDED
@@ -0,0 +1,4 @@
1
+ desc 'Show all TODO and related tags'
2
+ task :todo do
3
+ FileList['lib/**/*.rb'].egrep(/#.*(TODO|FIXME|XXX)/)
4
+ end
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <schema version="0.9" name="sunspot">
3
+ <types>
4
+ <fieldtype class="solr.TextField" positionIncrementGap="100" name="text">
5
+ <analyzer>
6
+ <tokenizer class="<%= tokenizer %>"/>
7
+ <%- filters.each do |filter| -%>
8
+ <filter class="<%= filter %>"/>
9
+ <%- end -%>
10
+ </analyzer>
11
+ </fieldtype>
12
+ <fieldtype class="solr.RandomSortField" name="rand"/>
13
+ <%- types.each do |type| -%>
14
+ <fieldtype name="<%= type.name %>" class="solr.<%= type.class_name %>Field" omitNorms="true"/>
15
+ <%- end -%>
16
+ </types>
17
+ <fields>
18
+ <field name="id" type="string" indexed="true" stored="true" multiValued="false" />
19
+ <field name="type" type="string" indexed="true" stored="false" multiValued="true" />
20
+ <field name="class_name" type="string" indexed="true" stored="false" multiValued="false" />
21
+ <field name="text" type="text" indexed="true" stored="false" multiValued="true" />
22
+ <field name="lat" type="sdouble" indexed="true" stored="true" multiValued="false" />
23
+ <field name="long" type="sdouble" indexed="true" stored="true" multiValued="false" />
24
+ <dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true" />
25
+ <dynamicField name="*_texts" type="text" indexed="true" stored="true" multiValued="true" />
26
+ <dynamicField name="random_*" type="rand" indexed="true" stored="false" multiValued="false" />
27
+ <dynamicField name="_local*" type="sdouble" indexed="true" stored="false" multiValued="false" />
28
+ <%- dynamic_fields.each do |dynamic_field| -%>
29
+ <dynamicField name="<%= dynamic_field.name %>" type="<%= dynamic_field.type %>" indexed="true" stored="<%= dynamic_field.stored? %>" multiValued="<%= dynamic_field.multiValued? %>" />
30
+ <%- end -%>
31
+ </fields>
32
+ <uniqueKey>id</uniqueKey>
33
+ <defaultSearchField>text</defaultSearchField>
34
+ <solrQueryParser defaultOperator="AND"/>
35
+ <copyField dest="text" source="*_text"/>
36
+ </schema>