Merge branch 'sunspot_search'
This commit is contained in:
		
						commit
						a9141f91ba
					
				
							
								
								
									
										5
									
								
								Gemfile
								
								
								
								
							
							
						
						
									
										5
									
								
								Gemfile
								
								
								
								
							| 
						 | 
					@ -32,6 +32,11 @@ gem 'resque-restriction'
 | 
				
			||||||
#gem 'rb-readline'
 | 
					#gem 'rb-readline'
 | 
				
			||||||
gem 'ruby-debug19'
 | 
					gem 'ruby-debug19'
 | 
				
			||||||
gem 'rubyzip'
 | 
					gem 'rubyzip'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gem 'sunspot_mongo'
 | 
				
			||||||
 | 
					gem 'sunspot_solr'
 | 
				
			||||||
 | 
					gem 'progress_bar'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gem 'sinatra'
 | 
					gem 'sinatra'
 | 
				
			||||||
gem 'sprockets'
 | 
					gem 'sprockets'
 | 
				
			||||||
gem 'tinymce-rails'
 | 
					gem 'tinymce-rails'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								Gemfile.lock
								
								
								
								
							
							
						
						
									
										13
									
								
								Gemfile.lock
								
								
								
								
							| 
						 | 
					@ -97,7 +97,9 @@ GEM
 | 
				
			||||||
      factory_girl (~> 2.6.0)
 | 
					      factory_girl (~> 2.6.0)
 | 
				
			||||||
      railties (>= 3.0.0)
 | 
					      railties (>= 3.0.0)
 | 
				
			||||||
    fastercsv (1.5.4)
 | 
					    fastercsv (1.5.4)
 | 
				
			||||||
 | 
					    fattr (2.2.1)
 | 
				
			||||||
    haml (3.1.4)
 | 
					    haml (3.1.4)
 | 
				
			||||||
 | 
					    highline (1.6.13)
 | 
				
			||||||
    hike (1.2.1)
 | 
					    hike (1.2.1)
 | 
				
			||||||
    hoe (2.16.1)
 | 
					    hoe (2.16.1)
 | 
				
			||||||
      rake (~> 0.8)
 | 
					      rake (~> 0.8)
 | 
				
			||||||
| 
						 | 
					@ -136,12 +138,17 @@ GEM
 | 
				
			||||||
    net-ldap (0.3.1)
 | 
					    net-ldap (0.3.1)
 | 
				
			||||||
    nokogiri (1.5.2)
 | 
					    nokogiri (1.5.2)
 | 
				
			||||||
    nokogiri (1.5.2-x86-mingw32)
 | 
					    nokogiri (1.5.2-x86-mingw32)
 | 
				
			||||||
 | 
					    options (2.3.0)
 | 
				
			||||||
 | 
					      fattr
 | 
				
			||||||
    orm_adapter (0.0.6)
 | 
					    orm_adapter (0.0.6)
 | 
				
			||||||
    pdf-writer (1.1.8)
 | 
					    pdf-writer (1.1.8)
 | 
				
			||||||
      color (>= 1.4.0)
 | 
					      color (>= 1.4.0)
 | 
				
			||||||
      transaction-simple (~> 1.3)
 | 
					      transaction-simple (~> 1.3)
 | 
				
			||||||
    polyglot (0.3.3)
 | 
					    polyglot (0.3.3)
 | 
				
			||||||
    pr_geohash (1.0.0)
 | 
					    pr_geohash (1.0.0)
 | 
				
			||||||
 | 
					    progress_bar (0.4.0)
 | 
				
			||||||
 | 
					      highline (~> 1.6.1)
 | 
				
			||||||
 | 
					      options (~> 2.3.0)
 | 
				
			||||||
    rack (1.3.6)
 | 
					    rack (1.3.6)
 | 
				
			||||||
    rack-cache (1.2)
 | 
					    rack-cache (1.2)
 | 
				
			||||||
      rack (>= 0.4)
 | 
					      rack (>= 0.4)
 | 
				
			||||||
| 
						 | 
					@ -256,9 +263,12 @@ GEM
 | 
				
			||||||
      rsolr (~> 1.0.7)
 | 
					      rsolr (~> 1.0.7)
 | 
				
			||||||
    sunspot-rails-tester (0.0.4)
 | 
					    sunspot-rails-tester (0.0.4)
 | 
				
			||||||
      sunspot_rails (~> 1.2)
 | 
					      sunspot_rails (~> 1.2)
 | 
				
			||||||
 | 
					    sunspot_mongo (1.0.1)
 | 
				
			||||||
 | 
					      sunspot_rails
 | 
				
			||||||
    sunspot_rails (1.3.3)
 | 
					    sunspot_rails (1.3.3)
 | 
				
			||||||
      nokogiri
 | 
					      nokogiri
 | 
				
			||||||
      sunspot (= 1.3.3)
 | 
					      sunspot (= 1.3.3)
 | 
				
			||||||
 | 
					    sunspot_solr (1.3.3)
 | 
				
			||||||
    thor (0.14.6)
 | 
					    thor (0.14.6)
 | 
				
			||||||
    tilt (1.3.3)
 | 
					    tilt (1.3.3)
 | 
				
			||||||
    tinymce-rails (3.4.8)
 | 
					    tinymce-rails (3.4.8)
 | 
				
			||||||
| 
						 | 
					@ -314,6 +324,7 @@ DEPENDENCIES
 | 
				
			||||||
  mysql2
 | 
					  mysql2
 | 
				
			||||||
  net-ldap (~> 0.3.1)
 | 
					  net-ldap (~> 0.3.1)
 | 
				
			||||||
  nokogiri
 | 
					  nokogiri
 | 
				
			||||||
 | 
					  progress_bar
 | 
				
			||||||
  radius
 | 
					  radius
 | 
				
			||||||
  rails (>= 3.1.0, < 3.2.0)
 | 
					  rails (>= 3.1.0, < 3.2.0)
 | 
				
			||||||
  rake
 | 
					  rake
 | 
				
			||||||
| 
						 | 
					@ -335,6 +346,8 @@ DEPENDENCIES
 | 
				
			||||||
  spork
 | 
					  spork
 | 
				
			||||||
  sprockets
 | 
					  sprockets
 | 
				
			||||||
  sunspot-rails-tester
 | 
					  sunspot-rails-tester
 | 
				
			||||||
 | 
					  sunspot_mongo
 | 
				
			||||||
 | 
					  sunspot_solr
 | 
				
			||||||
  tinymce-rails
 | 
					  tinymce-rails
 | 
				
			||||||
  uglifier
 | 
					  uglifier
 | 
				
			||||||
  watchr
 | 
					  watchr
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +0,0 @@
 | 
				
			||||||
require "redis"
 | 
					 | 
				
			||||||
require "redis-namespace"
 | 
					 | 
				
			||||||
require "redis-search"
 | 
					 | 
				
			||||||
# don't forget change namespace
 | 
					 | 
				
			||||||
redis = Redis.new(:host => "127.0.0.1",:port => "6379")
 | 
					 | 
				
			||||||
# We suggest you use a special db in Redis, when you need to clear all data, you can use flushdb command to clear them.
 | 
					 | 
				
			||||||
redis.select(3)
 | 
					 | 
				
			||||||
# Give a special namespace as prefix for Redis key, when your have more than one project used redis-search, this config will make them work fine.
 | 
					 | 
				
			||||||
redis = Redis::Namespace.new("orbit_nccu:redis_search2", :redis => redis)
 | 
					 | 
				
			||||||
Redis::Search.configure do |config|
 | 
					 | 
				
			||||||
  config.redis = redis
 | 
					 | 
				
			||||||
  config.complete_max_length = 100
 | 
					 | 
				
			||||||
  #config.pinyin_match = true
 | 
					 | 
				
			||||||
  # use rmmseg, true to disable it, it can save memroy
 | 
					 | 
				
			||||||
  config.disable_rmmseg = false
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
# Bulletin.new
 | 
					 | 
				
			||||||
# NewsBulletin.new
 | 
					 | 
				
			||||||
| 
						 | 
					@ -306,3 +306,4 @@ en:
 | 
				
			||||||
    sitesearch: Google Site Search
 | 
					    sitesearch: Google Site Search
 | 
				
			||||||
    site_setting_help: Please Enter the search argument for Google search.
 | 
					    site_setting_help: Please Enter the search argument for Google search.
 | 
				
			||||||
    result_get: "Searched about '  %{search_word}  ' Found %{item_num} items"
 | 
					    result_get: "Searched about '  %{search_word}  ' Found %{item_num} items"
 | 
				
			||||||
 | 
					    too_many: "Search about ' %{search_word} 'resulted more than %{exceed_num} items maybe try to search with more specific terms?"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,7 +442,9 @@ zh_tw:
 | 
				
			||||||
    site_search: "全站搜尋"
 | 
					    site_search: "全站搜尋"
 | 
				
			||||||
    sitesearch: Google Site Search
 | 
					    sitesearch: Google Site Search
 | 
				
			||||||
    site_setting_help: 請輸入送交Google搜尋的參數
 | 
					    site_setting_help: 請輸入送交Google搜尋的參數
 | 
				
			||||||
    result_get: "搜尋標題有關 ' %{search_word} ' 共搜尋到%{item_num}筆資料"
 | 
					    result_get: "搜尋有關 ' %{search_word} ' 共搜尋到%{item_num}筆資料"
 | 
				
			||||||
 | 
					    too_many: "搜尋有關 ' %{search_word} ' 尋找到超過 %{exceed_num} 筆資料,請嘗試加入更多關鍵字縮小搜尋範圍,以作更精確的搜尋"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  activerecord:
 | 
					  activerecord:
 | 
				
			||||||
    errors:
 | 
					    errors:
 | 
				
			||||||
      template: # ~ 2.3.5 backward compatible
 | 
					      template: # ~ 2.3.5 backward compatible
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,11 +7,11 @@ production:
 | 
				
			||||||
development:
 | 
					development:
 | 
				
			||||||
  solr:
 | 
					  solr:
 | 
				
			||||||
    hostname: localhost
 | 
					    hostname: localhost
 | 
				
			||||||
    port: 8983
 | 
					    port: 8982
 | 
				
			||||||
    log_level: INFO
 | 
					    log_level: INFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test:
 | 
					test:
 | 
				
			||||||
  solr:
 | 
					  solr:
 | 
				
			||||||
    hostname: localhost
 | 
					    hostname: localhost
 | 
				
			||||||
    port: 8983
 | 
					    port: 8981
 | 
				
			||||||
    log_level: WARNING
 | 
					    log_level: WARNING
 | 
				
			||||||
| 
						 | 
					@ -6,9 +6,22 @@ namespace :matt_dev do
 | 
				
			||||||
    p a
 | 
					    p a
 | 
				
			||||||
    a= Redis::Search.query("NewsBulletin",'社科院',:conditions =>{:is_checked=>true,:is_hidden=>false})
 | 
					    a= Redis::Search.query("NewsBulletin",'社科院',:conditions =>{:is_checked=>true,:is_hidden=>false})
 | 
				
			||||||
    p a
 | 
					    p a
 | 
				
			||||||
    # p Pinyin.t('台灣不是中國的一部分')
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					  task :searching_02 => :environment do
 | 
				
			||||||
 | 
					     a= Bulletin.solr_search do #("Bulletin",'我',:conditions =>{:is_checked=>true,:is_hidden=>false})
 | 
				
			||||||
 | 
					      fulltext '關島'
 | 
				
			||||||
 | 
					      with(:frontend_search,true)
 | 
				
			||||||
 | 
					      #with(:is_hidden,true)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    p a.results
 | 
				
			||||||
 | 
					    a= NewsBulletin.solr_search do #("NewsBulletin",'社科院',:conditions =>{:is_checked=>true,:is_hidden=>false})
 | 
				
			||||||
 | 
					      fulltext '社科院'
 | 
				
			||||||
 | 
					      with(:frontend_search,true)
 | 
				
			||||||
 | 
					      #with(:is_hidden,true)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    p a.results
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
  task  :testing_new_tag_cal do
 | 
					  task  :testing_new_tag_cal do
 | 
				
			||||||
  ranges = [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[1,2,3,4,5,6],[1,2,3,4,5,6,7],[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,7,8,9,10,11,12],[-1,-2,-3,-4,5,6,7,8,9,10,11,12]]
 | 
					  ranges = [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[1,2,3,4,5,6],[1,2,3,4,5,6,7],[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,7,8,9,10,11,12],[-1,-2,-3,-4,5,6,7,8,9,10,11,12]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ namespace :mid_site do
 | 
				
			||||||
  admin_role = nil
 | 
					  admin_role = nil
 | 
				
			||||||
  sub_role = nil
 | 
					  sub_role = nil
 | 
				
			||||||
  test_account_ldap_id ='139716'
 | 
					  test_account_ldap_id ='139716'
 | 
				
			||||||
 MiddleSiteConnection.establish
 | 
					 #MiddleSiteConnection.establish
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  task :sync => :environment do
 | 
					  task :sync => :environment do
 | 
				
			||||||
    info_profile = Info.first(conditions: {:key => 'profile'})
 | 
					    info_profile = Info.first(conditions: {:key => 'profile'})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					 Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					 contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					 this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					 The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					 (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					 the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 limitations under the License.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- The content of this page will be statically included into the top
 | 
				
			||||||
 | 
					of the admin page.  Uncomment this as an example to see there the content
 | 
				
			||||||
 | 
					will show up.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<hr>
 | 
				
			||||||
 | 
					<i>This line will appear before the first table</i>
 | 
				
			||||||
 | 
					<tr>
 | 
				
			||||||
 | 
					<td colspan="2">
 | 
				
			||||||
 | 
					This row will be appended to the end of the first table
 | 
				
			||||||
 | 
					</td>
 | 
				
			||||||
 | 
					</tr>
 | 
				
			||||||
 | 
					<hr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?>
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					 Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					 contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					 this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					 The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					 (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					 the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 limitations under the License.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- If this file is found in the config directory, it will only be
 | 
				
			||||||
 | 
					     loaded once at startup.  If it is found in Solr's data
 | 
				
			||||||
 | 
					     directory, it will be re-loaded every commit.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<elevate>
 | 
				
			||||||
 | 
					 <query text="foo bar">
 | 
				
			||||||
 | 
					  <doc id="1" />
 | 
				
			||||||
 | 
					  <doc id="2" />
 | 
				
			||||||
 | 
					  <doc id="3" />
 | 
				
			||||||
 | 
					 </query>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 <query text="ipod">
 | 
				
			||||||
 | 
					   <doc id="MA147LL/A" />  <!-- put the actual ipod at the top -->
 | 
				
			||||||
 | 
					   <doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
 | 
				
			||||||
 | 
					 </query>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					</elevate>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,246 @@
 | 
				
			||||||
 | 
					# The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					# (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					# the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Syntax:
 | 
				
			||||||
 | 
					#   "source" => "target"
 | 
				
			||||||
 | 
					#     "source".length() > 0 (source cannot be empty.)
 | 
				
			||||||
 | 
					#     "target".length() >= 0 (target can be empty.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# example:
 | 
				
			||||||
 | 
					#   "À" => "A"
 | 
				
			||||||
 | 
					#   "\u00C0" => "A"
 | 
				
			||||||
 | 
					#   "\u00C0" => "\u0041"
 | 
				
			||||||
 | 
					#   "ß" => "ss"
 | 
				
			||||||
 | 
					#   "\t" => " "
 | 
				
			||||||
 | 
					#   "\n" => ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# À => A
 | 
				
			||||||
 | 
					"\u00C0" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Á => A
 | 
				
			||||||
 | 
					"\u00C1" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Â => A
 | 
				
			||||||
 | 
					"\u00C2" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ã => A
 | 
				
			||||||
 | 
					"\u00C3" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ä => A
 | 
				
			||||||
 | 
					"\u00C4" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Å => A
 | 
				
			||||||
 | 
					"\u00C5" => "A"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Æ => AE
 | 
				
			||||||
 | 
					"\u00C6" => "AE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ç => C
 | 
				
			||||||
 | 
					"\u00C7" => "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# È => E
 | 
				
			||||||
 | 
					"\u00C8" => "E"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# É => E
 | 
				
			||||||
 | 
					"\u00C9" => "E"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ê => E
 | 
				
			||||||
 | 
					"\u00CA" => "E"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ë => E
 | 
				
			||||||
 | 
					"\u00CB" => "E"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ì => I
 | 
				
			||||||
 | 
					"\u00CC" => "I"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Í => I
 | 
				
			||||||
 | 
					"\u00CD" => "I"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Î => I
 | 
				
			||||||
 | 
					"\u00CE" => "I"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ï => I
 | 
				
			||||||
 | 
					"\u00CF" => "I"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# IJ => IJ
 | 
				
			||||||
 | 
					"\u0132" => "IJ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ð => D
 | 
				
			||||||
 | 
					"\u00D0" => "D"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ñ => N
 | 
				
			||||||
 | 
					"\u00D1" => "N"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ò => O
 | 
				
			||||||
 | 
					"\u00D2" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ó => O
 | 
				
			||||||
 | 
					"\u00D3" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ô => O
 | 
				
			||||||
 | 
					"\u00D4" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Õ => O
 | 
				
			||||||
 | 
					"\u00D5" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ö => O
 | 
				
			||||||
 | 
					"\u00D6" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ø => O
 | 
				
			||||||
 | 
					"\u00D8" => "O"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Œ => OE
 | 
				
			||||||
 | 
					"\u0152" => "OE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Þ
 | 
				
			||||||
 | 
					"\u00DE" => "TH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ù => U
 | 
				
			||||||
 | 
					"\u00D9" => "U"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ú => U
 | 
				
			||||||
 | 
					"\u00DA" => "U"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Û => U
 | 
				
			||||||
 | 
					"\u00DB" => "U"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ü => U
 | 
				
			||||||
 | 
					"\u00DC" => "U"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ý => Y
 | 
				
			||||||
 | 
					"\u00DD" => "Y"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ÿ => Y
 | 
				
			||||||
 | 
					"\u0178" => "Y"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# à => a
 | 
				
			||||||
 | 
					"\u00E0" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# á => a
 | 
				
			||||||
 | 
					"\u00E1" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# â => a
 | 
				
			||||||
 | 
					"\u00E2" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ã => a
 | 
				
			||||||
 | 
					"\u00E3" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ä => a
 | 
				
			||||||
 | 
					"\u00E4" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# å => a
 | 
				
			||||||
 | 
					"\u00E5" => "a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# æ => ae
 | 
				
			||||||
 | 
					"\u00E6" => "ae"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ç => c
 | 
				
			||||||
 | 
					"\u00E7" => "c"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# è => e
 | 
				
			||||||
 | 
					"\u00E8" => "e"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# é => e
 | 
				
			||||||
 | 
					"\u00E9" => "e"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ê => e
 | 
				
			||||||
 | 
					"\u00EA" => "e"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ë => e
 | 
				
			||||||
 | 
					"\u00EB" => "e"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ì => i
 | 
				
			||||||
 | 
					"\u00EC" => "i"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# í => i
 | 
				
			||||||
 | 
					"\u00ED" => "i"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# î => i
 | 
				
			||||||
 | 
					"\u00EE" => "i"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ï => i
 | 
				
			||||||
 | 
					"\u00EF" => "i"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ij => ij
 | 
				
			||||||
 | 
					"\u0133" => "ij"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ð => d
 | 
				
			||||||
 | 
					"\u00F0" => "d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ñ => n
 | 
				
			||||||
 | 
					"\u00F1" => "n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ò => o
 | 
				
			||||||
 | 
					"\u00F2" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ó => o
 | 
				
			||||||
 | 
					"\u00F3" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ô => o
 | 
				
			||||||
 | 
					"\u00F4" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# õ => o
 | 
				
			||||||
 | 
					"\u00F5" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ö => o
 | 
				
			||||||
 | 
					"\u00F6" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ø => o
 | 
				
			||||||
 | 
					"\u00F8" => "o"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# œ => oe
 | 
				
			||||||
 | 
					"\u0153" => "oe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ß => ss
 | 
				
			||||||
 | 
					"\u00DF" => "ss"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# þ => th
 | 
				
			||||||
 | 
					"\u00FE" => "th"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ù => u
 | 
				
			||||||
 | 
					"\u00F9" => "u"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ú => u
 | 
				
			||||||
 | 
					"\u00FA" => "u"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# û => u
 | 
				
			||||||
 | 
					"\u00FB" => "u"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ü => u
 | 
				
			||||||
 | 
					"\u00FC" => "u"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ý => y
 | 
				
			||||||
 | 
					"\u00FD" => "y"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ÿ => y
 | 
				
			||||||
 | 
					"\u00FF" => "y"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ff => ff
 | 
				
			||||||
 | 
					"\uFB00" => "ff"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# fi => fi
 | 
				
			||||||
 | 
					"\uFB01" => "fi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# fl => fl
 | 
				
			||||||
 | 
					"\uFB02" => "fl"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ffi => ffi
 | 
				
			||||||
 | 
					"\uFB03" => "ffi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ffl => ffl
 | 
				
			||||||
 | 
					"\uFB04" => "ffl"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ſt => ft
 | 
				
			||||||
 | 
					"\uFB05" => "ft"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# st => st
 | 
				
			||||||
 | 
					"\uFB06" => "st"
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					# The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					# (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					# the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Use a protected word file to protect against the stemmer reducing two
 | 
				
			||||||
 | 
					# unrelated words to the same base word.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Some non-words that normally won't be encountered,
 | 
				
			||||||
 | 
					# just to test that they won't be stemmed.
 | 
				
			||||||
 | 
					dontstems
 | 
				
			||||||
 | 
					zwhacky
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,238 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					 Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					 contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					 this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					 The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					 (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					 the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 limitations under the License.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<!--  
 | 
				
			||||||
 | 
					 This is the Solr schema file. This file should be named "schema.xml" and
 | 
				
			||||||
 | 
					 should be in the conf directory under the solr home
 | 
				
			||||||
 | 
					 (i.e. ./solr/conf/schema.xml by default) 
 | 
				
			||||||
 | 
					 or located where the classloader for the Solr webapp can find it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 This example schema is the recommended starting point for users.
 | 
				
			||||||
 | 
					 It should be kept correct and concise, usable out-of-the-box.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 For more information, on how to customize this file, please see
 | 
				
			||||||
 | 
					 http://wiki.apache.org/solr/SchemaXml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 PERFORMANCE NOTE: this schema includes many optional features and should not
 | 
				
			||||||
 | 
					 be used for benchmarking.  To improve performance one could
 | 
				
			||||||
 | 
					  - set stored="false" for all fields possible (esp large fields) when you
 | 
				
			||||||
 | 
					    only need to search on the field but don't need to return the original
 | 
				
			||||||
 | 
					    value.
 | 
				
			||||||
 | 
					  - set indexed="false" if you don't need to search on the field, but only
 | 
				
			||||||
 | 
					    return the field as a result of searching on other indexed fields.
 | 
				
			||||||
 | 
					  - remove all unneeded copyField statements
 | 
				
			||||||
 | 
					  - for best index size and searching performance, set "index" to false
 | 
				
			||||||
 | 
					    for all general text fields, use copyField to copy them to the
 | 
				
			||||||
 | 
					    catchall "text" field, and use that for searching.
 | 
				
			||||||
 | 
					  - For maximum indexing performance, use the StreamingUpdateSolrServer
 | 
				
			||||||
 | 
					    java client.
 | 
				
			||||||
 | 
					  - Remember to run the JVM in server mode, and use a higher logging level
 | 
				
			||||||
 | 
					    that avoids logging every request
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<schema name="sunspot" version="1.0">
 | 
				
			||||||
 | 
					  <types>
 | 
				
			||||||
 | 
					    <!-- field type definitions. The "name" attribute is
 | 
				
			||||||
 | 
					       just a label to be used by field definitions.  The "class"
 | 
				
			||||||
 | 
					       attribute and any other attributes determine the real
 | 
				
			||||||
 | 
					       behavior of the fieldType.
 | 
				
			||||||
 | 
					         Class names starting with "solr" refer to java classes in the
 | 
				
			||||||
 | 
					       org.apache.solr.analysis package.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="string" class="solr.StrField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="tdouble" class="solr.TrieDoubleField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="text" class="solr.TextField" omitNorms="false">
 | 
				
			||||||
 | 
					      <analyzer>
 | 
				
			||||||
 | 
					        <tokenizer class="solr.CJKTokenizerFactory"/>
 | 
				
			||||||
 | 
					        <filter class="solr.StandardFilterFactory"/>
 | 
				
			||||||
 | 
					        <filter class="solr.LowerCaseFilterFactory"/>
 | 
				
			||||||
 | 
					      </analyzer>
 | 
				
			||||||
 | 
					    </fieldType>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="boolean" class="solr.BoolField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="date" class="solr.DateField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="sdouble" class="solr.SortableDoubleField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="sfloat" class="solr.SortableFloatField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="sint" class="solr.SortableIntField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="slong" class="solr.SortableLongField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="tint" class="solr.TrieIntField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="tfloat" class="solr.TrieFloatField" omitNorms="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This fieldType is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true"/>
 | 
				
			||||||
 | 
					  </types>
 | 
				
			||||||
 | 
					  <fields>
 | 
				
			||||||
 | 
					    <!-- Valid attributes for fields:
 | 
				
			||||||
 | 
					     name: mandatory - the name for the field
 | 
				
			||||||
 | 
					     type: mandatory - the name of a previously defined type from the 
 | 
				
			||||||
 | 
					       <types> section
 | 
				
			||||||
 | 
					     indexed: true if this field should be indexed (searchable or sortable)
 | 
				
			||||||
 | 
					     stored: true if this field should be retrievable
 | 
				
			||||||
 | 
					     compressed: [false] if this field should be stored using gzip compression
 | 
				
			||||||
 | 
					       (this will only apply if the field type is compressable; among
 | 
				
			||||||
 | 
					       the standard field types, only TextField and StrField are)
 | 
				
			||||||
 | 
					     multiValued: true if this field may contain multiple values per document
 | 
				
			||||||
 | 
					     omitNorms: (expert) set to true to omit the norms associated with
 | 
				
			||||||
 | 
					       this field (this disables length normalization and index-time
 | 
				
			||||||
 | 
					       boosting for the field, and saves some memory).  Only full-text
 | 
				
			||||||
 | 
					       fields or fields that need an index-time boost need norms.
 | 
				
			||||||
 | 
					     termVectors: [false] set to true to store the term vector for a
 | 
				
			||||||
 | 
					       given field.
 | 
				
			||||||
 | 
					       When using MoreLikeThis, fields used for similarity should be
 | 
				
			||||||
 | 
					       stored for best performance.
 | 
				
			||||||
 | 
					     termPositions: Store position information with the term vector.  
 | 
				
			||||||
 | 
					       This will increase storage costs.
 | 
				
			||||||
 | 
					     termOffsets: Store offset information with the term vector. This 
 | 
				
			||||||
 | 
					       will increase storage costs.
 | 
				
			||||||
 | 
					     default: a value that should be used if no value is specified
 | 
				
			||||||
 | 
					       when adding a document.
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="id" stored="true" type="string" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="type" stored="false" type="string" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="class_name" stored="false" type="string" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="text" stored="false" type="string" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="lat" stored="true" type="tdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This field is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <field name="lng" stored="true" type="tdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="random_*" stored="false" type="rand" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="_local*" stored="false" type="tdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_texts" stored="true" type="text" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_b" stored="false" type="boolean" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_bm" stored="false" type="boolean" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_bs" stored="true" type="boolean" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_bms" stored="true" type="boolean" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_d" stored="false" type="date" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dm" stored="false" type="date" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ds" stored="true" type="date" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dms" stored="true" type="date" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_e" stored="false" type="sdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_em" stored="false" type="sdouble" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_es" stored="true" type="sdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ems" stored="true" type="sdouble" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_f" stored="false" type="sfloat" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_fm" stored="false" type="sfloat" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_fs" stored="true" type="sfloat" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_fms" stored="true" type="sfloat" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_i" stored="false" type="sint" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_im" stored="false" type="sint" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_is" stored="true" type="sint" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ims" stored="true" type="sint" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_l" stored="false" type="slong" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_lm" stored="false" type="slong" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ls" stored="true" type="slong" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_lms" stored="true" type="slong" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_s" stored="false" type="string" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_sm" stored="false" type="string" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ss" stored="true" type="string" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_sms" stored="true" type="string" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_it" stored="false" type="tint" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_itm" stored="false" type="tint" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_its" stored="true" type="tint" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_itms" stored="true" type="tint" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ft" stored="false" type="tfloat" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ftm" stored="false" type="tfloat" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_fts" stored="true" type="tfloat" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ftms" stored="true" type="tfloat" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dt" stored="false" type="tdate" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dtm" stored="false" type="tdate" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dts" stored="true" type="tdate" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_dtms" stored="true" type="tdate" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_textv" stored="false" termVectors="true" type="text" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_textsv" stored="true" termVectors="true" type="text" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_et" stored="false" termVectors="true" type="tdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_etm" stored="false" termVectors="true" type="tdouble" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_ets" stored="true" termVectors="true" type="tdouble" multiValued="false" indexed="true"/>
 | 
				
			||||||
 | 
					    <!-- *** This dynamicField is used by Sunspot! *** -->
 | 
				
			||||||
 | 
					    <dynamicField name="*_etms" stored="true" termVectors="true" type="tdouble" multiValued="true" indexed="true"/>
 | 
				
			||||||
 | 
					  </fields>
 | 
				
			||||||
 | 
					  <!-- Field to use to determine and enforce document uniqueness. 
 | 
				
			||||||
 | 
					      Unless this field is marked with required="false", it will be a required field
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					  <uniqueKey>id</uniqueKey>
 | 
				
			||||||
 | 
					  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
 | 
				
			||||||
 | 
					  <defaultSearchField>text</defaultSearchField>
 | 
				
			||||||
 | 
					  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
 | 
				
			||||||
 | 
					  <solrQueryParser defaultOperator="AND"/>
 | 
				
			||||||
 | 
					  <!-- copyField commands copy one field to another at the time a document
 | 
				
			||||||
 | 
					        is added to the index.  It's used either to index the same field differently,
 | 
				
			||||||
 | 
					        or to add multiple fields to the same field for easier/faster searching.  -->
 | 
				
			||||||
 | 
					</schema>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					# Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					# contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					# this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					# The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					# (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					# the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					user=
 | 
				
			||||||
 | 
					solr_hostname=localhost
 | 
				
			||||||
 | 
					solr_port=8983
 | 
				
			||||||
 | 
					rsyncd_port=18983
 | 
				
			||||||
 | 
					data_dir=
 | 
				
			||||||
 | 
					webapp_name=solr
 | 
				
			||||||
 | 
					master_host=
 | 
				
			||||||
 | 
					master_data_dir=
 | 
				
			||||||
 | 
					master_status_dir=
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,934 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					 Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					 contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					 this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					 The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					 (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					 the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 limitations under the License.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					     For more details about configurations options that may appear in this 
 | 
				
			||||||
 | 
					     file, see http://wiki.apache.org/solr/SolrConfigXml.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     Specifically, the Solr Config can support XInclude, which may make it easier to manage
 | 
				
			||||||
 | 
					     the configuration.  See https://issues.apache.org/jira/browse/SOLR-1167
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<config>
 | 
				
			||||||
 | 
					  <!-- Set this to 'false' if you want solr to continue working after it has 
 | 
				
			||||||
 | 
					       encountered an severe configuration error.  In a production environment, 
 | 
				
			||||||
 | 
					       you may want solr to keep working even if one handler is mis-configured.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       You may also set this to false using by setting the system property:
 | 
				
			||||||
 | 
					         -Dsolr.abortOnConfigurationError=false
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					  <abortOnConfigurationError>${solr.abortOnConfigurationError:true}</abortOnConfigurationError>
 | 
				
			||||||
 | 
					  <!-- lib directives can be used to instruct Solr to load an Jars identified
 | 
				
			||||||
 | 
					       and use them to resolve any "plugins" specified in your solrconfig.xml or
 | 
				
			||||||
 | 
					       schema.xml (ie: Analyzers, Request Handlers, etc...).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       All directories and paths are resolved relative the instanceDir.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       If a "./lib" directory exists in your instanceDir, all files found in it
 | 
				
			||||||
 | 
					       are included as if you had used the following syntax...
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					              <lib dir="./lib" />
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <!-- A dir option by itself adds any files found in the directory to the
 | 
				
			||||||
 | 
					       classpath, this is useful for including all jars in a directory.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <lib dir="../../contrib/extraction/lib"/>
 | 
				
			||||||
 | 
					  <!-- When a regex is specified in addition to a directory, only the files in that
 | 
				
			||||||
 | 
					       directory which completely match the regex (anchored on both ends)
 | 
				
			||||||
 | 
					       will be included.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar"/>
 | 
				
			||||||
 | 
					  <lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar"/>
 | 
				
			||||||
 | 
					  <!-- If a dir option (with or without a regex) is used and nothing is found
 | 
				
			||||||
 | 
					       that matches, it will be ignored
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <lib dir="../../contrib/clustering/lib/downloads/"/>
 | 
				
			||||||
 | 
					  <lib dir="../../contrib/clustering/lib/"/>
 | 
				
			||||||
 | 
					  <lib dir="/total/crap/dir/ignored"/>
 | 
				
			||||||
 | 
					  <!-- an exact path can be used to specify a specific file.  This will cause
 | 
				
			||||||
 | 
					       a serious error to be logged if it can't be loaded.
 | 
				
			||||||
 | 
					  <lib path="../a-jar-that-does-not-exist.jar" /> 
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- Used to specify an alternate directory to hold all index data
 | 
				
			||||||
 | 
					       other than the default ./data under the Solr home.
 | 
				
			||||||
 | 
					       If replication is in use, this should match the replication configuration. -->
 | 
				
			||||||
 | 
					  <dataDir>${solr.data.dir:./solr/data}</dataDir>
 | 
				
			||||||
 | 
					  <!-- WARNING: this <indexDefaults> section only provides defaults for index writers
 | 
				
			||||||
 | 
					       in general. See also the <mainIndex> section after that when changing parameters
 | 
				
			||||||
 | 
					       for Solr's main Lucene index. -->
 | 
				
			||||||
 | 
					  <indexDefaults>
 | 
				
			||||||
 | 
					    <!-- Values here affect all index writers and act as a default unless overridden. -->
 | 
				
			||||||
 | 
					    <useCompoundFile>false</useCompoundFile>
 | 
				
			||||||
 | 
					    <mergeFactor>10</mergeFactor>
 | 
				
			||||||
 | 
					    <!-- If both ramBufferSizeMB and maxBufferedDocs is set, then Lucene will flush
 | 
				
			||||||
 | 
					     based on whichever limit is hit first.  -->
 | 
				
			||||||
 | 
					    <!--<maxBufferedDocs>1000</maxBufferedDocs>-->
 | 
				
			||||||
 | 
					    <!-- Sets the amount of RAM that may be used by Lucene indexing
 | 
				
			||||||
 | 
					      for buffering added documents and deletions before they are
 | 
				
			||||||
 | 
					      flushed to the Directory.  -->
 | 
				
			||||||
 | 
					    <ramBufferSizeMB>32</ramBufferSizeMB>
 | 
				
			||||||
 | 
					    <!-- <maxMergeDocs>2147483647</maxMergeDocs> -->
 | 
				
			||||||
 | 
					    <maxFieldLength>10000</maxFieldLength>
 | 
				
			||||||
 | 
					    <writeLockTimeout>1000</writeLockTimeout>
 | 
				
			||||||
 | 
					    <commitLockTimeout>10000</commitLockTimeout>
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					     Expert: Turn on Lucene's auto commit capability.  This causes intermediate
 | 
				
			||||||
 | 
					     segment flushes to write a new lucene index descriptor, enabling it to be
 | 
				
			||||||
 | 
					     opened by an external IndexReader.  This can greatly slow down indexing
 | 
				
			||||||
 | 
					     speed.  NOTE: Despite the name, this value does not have any relation to
 | 
				
			||||||
 | 
					     Solr's autoCommit functionality
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <!--<luceneAutoCommit>false</luceneAutoCommit>-->
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					     Expert: The Merge Policy in Lucene controls how merging is handled by
 | 
				
			||||||
 | 
					     Lucene.  The default in 2.3 is the LogByteSizeMergePolicy, previous
 | 
				
			||||||
 | 
					     versions used LogDocMergePolicy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     LogByteSizeMergePolicy chooses segments to merge based on their size.  The
 | 
				
			||||||
 | 
					     Lucene 2.2 default, LogDocMergePolicy chose when to merge based on number
 | 
				
			||||||
 | 
					     of documents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     Other implementations of MergePolicy must have a no-argument constructor
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <!--<mergePolicy class="org.apache.lucene.index.LogByteSizeMergePolicy"/>-->
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					     Expert:
 | 
				
			||||||
 | 
					     The Merge Scheduler in Lucene controls how merges are performed.  The
 | 
				
			||||||
 | 
					     ConcurrentMergeScheduler (Lucene 2.3 default) can perform merges in the
 | 
				
			||||||
 | 
					     background using separate threads.  The SerialMergeScheduler (Lucene 2.2
 | 
				
			||||||
 | 
					     default) does not.
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <!--<mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>-->
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					      This option specifies which Lucene LockFactory implementation to use.
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      single = SingleInstanceLockFactory - suggested for a read-only index
 | 
				
			||||||
 | 
					               or when there is no possibility of another process trying
 | 
				
			||||||
 | 
					               to modify the index.
 | 
				
			||||||
 | 
					      native = NativeFSLockFactory  - uses OS native file locking
 | 
				
			||||||
 | 
					      simple = SimpleFSLockFactory  - uses a plain file for locking
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (For backwards compatibility with Solr 1.2, 'simple' is the default
 | 
				
			||||||
 | 
					       if not specified.)
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <lockType>native</lockType>
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					     Expert:
 | 
				
			||||||
 | 
					    Controls how often Lucene loads terms into memory -->
 | 
				
			||||||
 | 
					    <!--<termIndexInterval>256</termIndexInterval>-->
 | 
				
			||||||
 | 
					  </indexDefaults>
 | 
				
			||||||
 | 
					  <mainIndex>
 | 
				
			||||||
 | 
					    <!-- options specific to the main on-disk lucene index -->
 | 
				
			||||||
 | 
					    <useCompoundFile>false</useCompoundFile>
 | 
				
			||||||
 | 
					    <ramBufferSizeMB>32</ramBufferSizeMB>
 | 
				
			||||||
 | 
					    <mergeFactor>10</mergeFactor>
 | 
				
			||||||
 | 
					    <!-- Deprecated -->
 | 
				
			||||||
 | 
					    <!--<maxBufferedDocs>1000</maxBufferedDocs>-->
 | 
				
			||||||
 | 
					    <!--<maxMergeDocs>2147483647</maxMergeDocs>-->
 | 
				
			||||||
 | 
					    <!-- inherit from indexDefaults <maxFieldLength>10000</maxFieldLength> -->
 | 
				
			||||||
 | 
					    <!-- If true, unlock any held write or commit locks on startup. 
 | 
				
			||||||
 | 
					         This defeats the locking mechanism that allows multiple
 | 
				
			||||||
 | 
					         processes to safely access a lucene index, and should be
 | 
				
			||||||
 | 
					         used with care.
 | 
				
			||||||
 | 
					         This is not needed if lock type is 'none' or 'single'
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <unlockOnStartup>false</unlockOnStartup>
 | 
				
			||||||
 | 
					    <!-- If true, IndexReaders will be reopened (often more efficient) instead
 | 
				
			||||||
 | 
					         of closed and then opened.  -->
 | 
				
			||||||
 | 
					    <reopenReaders>true</reopenReaders>
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					     Expert:
 | 
				
			||||||
 | 
					    Controls how often Lucene loads terms into memory.  Default is 128 and is likely good for most everyone. -->
 | 
				
			||||||
 | 
					    <!--<termIndexInterval>256</termIndexInterval>-->
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					        Custom deletion policies can specified here. The class must
 | 
				
			||||||
 | 
					        implement org.apache.lucene.index.IndexDeletionPolicy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        http://lucene.apache.org/java/2_3_2/api/org/apache/lucene/index/IndexDeletionPolicy.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        The standard Solr IndexDeletionPolicy implementation supports deleting
 | 
				
			||||||
 | 
					        index commit points on number of commits, age of commit point and
 | 
				
			||||||
 | 
					        optimized status.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        The latest commit point should always be preserved regardless
 | 
				
			||||||
 | 
					        of the criteria.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <deletionPolicy class="solr.SolrDeletionPolicy">
 | 
				
			||||||
 | 
					      <!-- The number of commit points to be kept -->
 | 
				
			||||||
 | 
					      <str name="maxCommitsToKeep">1</str>
 | 
				
			||||||
 | 
					      <!-- The number of optimized commit points to be kept -->
 | 
				
			||||||
 | 
					      <str name="maxOptimizedCommitsToKeep">0</str>
 | 
				
			||||||
 | 
					      <!--
 | 
				
			||||||
 | 
					          Delete all commit points once they have reached the given age.
 | 
				
			||||||
 | 
					          Supports DateMathParser syntax e.g.
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					          <str name="maxCommitAge">30MINUTES</str>
 | 
				
			||||||
 | 
					          <str name="maxCommitAge">1DAY</str>
 | 
				
			||||||
 | 
					      -->
 | 
				
			||||||
 | 
					    </deletionPolicy>
 | 
				
			||||||
 | 
					    <!--  To aid in advanced debugging, you may turn on IndexWriter debug logging.
 | 
				
			||||||
 | 
					      Setting to true will set the file that the underlying Lucene IndexWriter
 | 
				
			||||||
 | 
					      will write its debug infostream to.  -->
 | 
				
			||||||
 | 
					    <infoStream file="INFOSTREAM.txt">false</infoStream>
 | 
				
			||||||
 | 
					  </mainIndex>
 | 
				
			||||||
 | 
					  <!--	Enables JMX if and only if an existing MBeanServer is found, use this
 | 
				
			||||||
 | 
					    if you want to configure JMX through JVM parameters. Remove this to disable
 | 
				
			||||||
 | 
					    exposing Solr configuration and statistics to JMX.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							If you want to connect to a particular server, specify the agentId
 | 
				
			||||||
 | 
							e.g. <jmx agentId="myAgent" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							If you want to start a new MBeanServer, specify the serviceUrl
 | 
				
			||||||
 | 
							e.g <jmx serviceUrl="service:jmx:rmi:///jndi/rmi://localhost:9999/solr"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							For more details see http://wiki.apache.org/solr/SolrJmx
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <jmx/>
 | 
				
			||||||
 | 
					  <!-- the default high-performance update handler -->
 | 
				
			||||||
 | 
					  <updateHandler class="solr.DirectUpdateHandler2">
 | 
				
			||||||
 | 
					    <!-- A prefix of "solr." for class names is an alias that
 | 
				
			||||||
 | 
					         causes solr to search appropriate packages, including
 | 
				
			||||||
 | 
					         org.apache.solr.(search|update|request|core|analysis)
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <!-- Perform a <commit/> automatically under certain conditions:
 | 
				
			||||||
 | 
					         maxDocs - number of updates since last commit is greater than this
 | 
				
			||||||
 | 
					         maxTime - oldest uncommited update (in ms) is this long ago
 | 
				
			||||||
 | 
					         Instead of enabling autoCommit, consider using "commitWithin"
 | 
				
			||||||
 | 
					         when adding documents. http://wiki.apache.org/solr/UpdateXmlMessages
 | 
				
			||||||
 | 
					    <autoCommit> 
 | 
				
			||||||
 | 
					      <maxDocs>10000</maxDocs>
 | 
				
			||||||
 | 
					      <maxTime>1000</maxTime> 
 | 
				
			||||||
 | 
					    </autoCommit>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- The RunExecutableListener executes an external command from a
 | 
				
			||||||
 | 
					      hook such as postCommit or postOptimize.
 | 
				
			||||||
 | 
					         exe - the name of the executable to run
 | 
				
			||||||
 | 
					         dir - dir to use as the current working directory. default="."
 | 
				
			||||||
 | 
					         wait - the calling thread waits until the executable returns. default="true"
 | 
				
			||||||
 | 
					         args - the arguments to pass to the program.  default=nothing
 | 
				
			||||||
 | 
					         env - environment variables to set.  default=nothing
 | 
				
			||||||
 | 
					      -->
 | 
				
			||||||
 | 
					    <!-- A postCommit event is fired after every commit or optimize command
 | 
				
			||||||
 | 
					    <listener event="postCommit" class="solr.RunExecutableListener">
 | 
				
			||||||
 | 
					      <str name="exe">solr/bin/snapshooter</str>
 | 
				
			||||||
 | 
					      <str name="dir">.</str>
 | 
				
			||||||
 | 
					      <bool name="wait">true</bool>
 | 
				
			||||||
 | 
					      <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
 | 
				
			||||||
 | 
					      <arr name="env"> <str>MYVAR=val1</str> </arr>
 | 
				
			||||||
 | 
					    </listener>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- A postOptimize event is fired only after every optimize command
 | 
				
			||||||
 | 
					    <listener event="postOptimize" class="solr.RunExecutableListener">
 | 
				
			||||||
 | 
					      <str name="exe">snapshooter</str>
 | 
				
			||||||
 | 
					      <str name="dir">solr/bin</str>
 | 
				
			||||||
 | 
					      <bool name="wait">true</bool>
 | 
				
			||||||
 | 
					    </listener>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  </updateHandler>
 | 
				
			||||||
 | 
					  <!-- Use the following format to specify a custom IndexReaderFactory - allows for alternate
 | 
				
			||||||
 | 
					       IndexReader implementations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       ** Experimental Feature **
 | 
				
			||||||
 | 
					       Please note - Using a custom IndexReaderFactory may prevent certain other features
 | 
				
			||||||
 | 
					       from working. The API to IndexReaderFactory may change without warning or may even
 | 
				
			||||||
 | 
					       be removed from future releases if the problems cannot be resolved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       ** Features that may not work with custom IndexReaderFactory **
 | 
				
			||||||
 | 
					       The ReplicationHandler assumes a disk-resident index. Using a custom
 | 
				
			||||||
 | 
					       IndexReader implementation may cause incompatibility with ReplicationHandler and
 | 
				
			||||||
 | 
					       may cause replication to not work correctly. See SOLR-1366 for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <indexReaderFactory name="IndexReaderFactory" class="package.class">
 | 
				
			||||||
 | 
					    Parameters as required by the implementation
 | 
				
			||||||
 | 
					  </indexReaderFactory >
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- To set the termInfosIndexDivisor, do this: -->
 | 
				
			||||||
 | 
					  <!--<indexReaderFactory name="IndexReaderFactory" class="org.apache.solr.core.StandardIndexReaderFactory">
 | 
				
			||||||
 | 
					    <int name="termInfosIndexDivisor">12</int>
 | 
				
			||||||
 | 
					  </indexReaderFactory >-->
 | 
				
			||||||
 | 
					  <query>
 | 
				
			||||||
 | 
					    <!-- Maximum number of clauses in a boolean query... in the past, this affected
 | 
				
			||||||
 | 
					        range or prefix queries that expanded to big boolean queries - built in Solr 
 | 
				
			||||||
 | 
					        query parsers no longer create queries with this limitation. 
 | 
				
			||||||
 | 
					        An exception is thrown if exceeded.  -->
 | 
				
			||||||
 | 
					    <maxBooleanClauses>1024</maxBooleanClauses>
 | 
				
			||||||
 | 
					    <!-- There are two implementations of cache available for Solr,
 | 
				
			||||||
 | 
					         LRUCache, based on a synchronized LinkedHashMap, and
 | 
				
			||||||
 | 
					         FastLRUCache, based on a ConcurrentHashMap.  FastLRUCache has faster gets
 | 
				
			||||||
 | 
					         and slower puts in single threaded operation and thus is generally faster
 | 
				
			||||||
 | 
					         than LRUCache when the hit ratio of the cache is high (> 75%), and may be
 | 
				
			||||||
 | 
					         faster under other scenarios on multi-cpu systems. -->
 | 
				
			||||||
 | 
					    <!-- Cache used by SolrIndexSearcher for filters (DocSets),
 | 
				
			||||||
 | 
					         unordered sets of *all* documents that match a query.
 | 
				
			||||||
 | 
					         When a new searcher is opened, its caches may be prepopulated
 | 
				
			||||||
 | 
					         or "autowarmed" using data from caches in the old searcher.
 | 
				
			||||||
 | 
					         autowarmCount is the number of items to prepopulate.  For LRUCache,
 | 
				
			||||||
 | 
					         the autowarmed items will be the most recently accessed items.
 | 
				
			||||||
 | 
					       Parameters:
 | 
				
			||||||
 | 
					         class - the SolrCache implementation LRUCache or FastLRUCache
 | 
				
			||||||
 | 
					         size - the maximum number of entries in the cache
 | 
				
			||||||
 | 
					         initialSize - the initial capacity (number of entries) of
 | 
				
			||||||
 | 
					           the cache.  (seel java.util.HashMap)
 | 
				
			||||||
 | 
					         autowarmCount - the number of entries to prepopulate from
 | 
				
			||||||
 | 
					           and old cache.
 | 
				
			||||||
 | 
					         -->
 | 
				
			||||||
 | 
					    <filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0"/>
 | 
				
			||||||
 | 
					    <!-- Cache used to hold field values that are quickly accessible
 | 
				
			||||||
 | 
					         by document id.  The fieldValueCache is created by default
 | 
				
			||||||
 | 
					         even if not configured here.
 | 
				
			||||||
 | 
					      <fieldValueCache
 | 
				
			||||||
 | 
					        class="solr.FastLRUCache"
 | 
				
			||||||
 | 
					        size="512"
 | 
				
			||||||
 | 
					        autowarmCount="128"
 | 
				
			||||||
 | 
					        showItems="32"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- queryResultCache caches results of searches - ordered lists of
 | 
				
			||||||
 | 
					         document ids (DocList) based on a query, a sort, and the range
 | 
				
			||||||
 | 
					         of documents requested.  -->
 | 
				
			||||||
 | 
					    <queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
 | 
				
			||||||
 | 
					    <!-- documentCache caches Lucene Document objects (the stored fields for each document).
 | 
				
			||||||
 | 
					       Since Lucene internal document ids are transient, this cache will not be autowarmed.  -->
 | 
				
			||||||
 | 
					    <documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
 | 
				
			||||||
 | 
					    <!-- If true, stored fields that are not requested will be loaded lazily.
 | 
				
			||||||
 | 
					      This can result in a significant speed improvement if the usual case is to
 | 
				
			||||||
 | 
					      not load all stored fields, especially if the skipped fields are large
 | 
				
			||||||
 | 
					      compressed text fields.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <enableLazyFieldLoading>true</enableLazyFieldLoading>
 | 
				
			||||||
 | 
					    <!-- Example of a generic cache.  These caches may be accessed by name
 | 
				
			||||||
 | 
					         through SolrIndexSearcher.getCache(),cacheLookup(), and cacheInsert().
 | 
				
			||||||
 | 
					         The purpose is to enable easy caching of user/application level data.
 | 
				
			||||||
 | 
					         The regenerator argument should be specified as an implementation
 | 
				
			||||||
 | 
					         of solr.search.CacheRegenerator if autowarming is desired.  -->
 | 
				
			||||||
 | 
					    <!--
 | 
				
			||||||
 | 
					    <cache name="myUserCache"
 | 
				
			||||||
 | 
					      class="solr.LRUCache"
 | 
				
			||||||
 | 
					      size="4096"
 | 
				
			||||||
 | 
					      initialSize="1024"
 | 
				
			||||||
 | 
					      autowarmCount="1024"
 | 
				
			||||||
 | 
					      regenerator="org.mycompany.mypackage.MyRegenerator"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- An optimization that attempts to use a filter to satisfy a search.
 | 
				
			||||||
 | 
					         If the requested sort does not include score, then the filterCache
 | 
				
			||||||
 | 
					         will be checked for a filter matching the query. If found, the filter
 | 
				
			||||||
 | 
					         will be used as the source of document ids, and then the sort will be
 | 
				
			||||||
 | 
					         applied to that.
 | 
				
			||||||
 | 
					    <useFilterForSortedQuery>true</useFilterForSortedQuery>
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					    <!-- An optimization for use with the queryResultCache.  When a search
 | 
				
			||||||
 | 
					         is requested, a superset of the requested number of document ids
 | 
				
			||||||
 | 
					         are collected.  For example, if a search for a particular query
 | 
				
			||||||
 | 
					         requests matching documents 10 through 19, and queryWindowSize is 50,
 | 
				
			||||||
 | 
					         then documents 0 through 49 will be collected and cached.  Any further
 | 
				
			||||||
 | 
					         requests in that range can be satisfied via the cache.  -->
 | 
				
			||||||
 | 
					    <queryResultWindowSize>20</queryResultWindowSize>
 | 
				
			||||||
 | 
					    <!-- Maximum number of documents to cache for any entry in the
 | 
				
			||||||
 | 
					         queryResultCache. -->
 | 
				
			||||||
 | 
					    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
 | 
				
			||||||
 | 
					    <!-- a newSearcher event is fired whenever a new searcher is being prepared
 | 
				
			||||||
 | 
					      and there is a current searcher handling requests (aka registered).
 | 
				
			||||||
 | 
					      It can be used to prime certain caches to prevent long request times for
 | 
				
			||||||
 | 
					      certain requests.
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- QuerySenderListener takes an array of NamedList and executes a
 | 
				
			||||||
 | 
					         local query request for each NamedList in sequence. -->
 | 
				
			||||||
 | 
					    <listener event="newSearcher" class="solr.QuerySenderListener">
 | 
				
			||||||
 | 
					      <arr name="queries">
 | 
				
			||||||
 | 
					        <!--
 | 
				
			||||||
 | 
					        <lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> </lst>
 | 
				
			||||||
 | 
					        <lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> </lst>
 | 
				
			||||||
 | 
					        <lst><str name="q">static newSearcher warming query from solrconfig.xml</str></lst>
 | 
				
			||||||
 | 
					        -->
 | 
				
			||||||
 | 
					      </arr>
 | 
				
			||||||
 | 
					    </listener>
 | 
				
			||||||
 | 
					    <!-- a firstSearcher event is fired whenever a new searcher is being
 | 
				
			||||||
 | 
					         prepared but there is no current registered searcher to handle
 | 
				
			||||||
 | 
					         requests or to gain autowarming data from. -->
 | 
				
			||||||
 | 
					    <listener event="firstSearcher" class="solr.QuerySenderListener">
 | 
				
			||||||
 | 
					      <arr name="queries">
 | 
				
			||||||
 | 
					        <lst>
 | 
				
			||||||
 | 
					          <str name="q">solr rocks</str>
 | 
				
			||||||
 | 
					          <str name="start">0</str>
 | 
				
			||||||
 | 
					          <str name="rows">10</str>
 | 
				
			||||||
 | 
					        </lst>
 | 
				
			||||||
 | 
					        <lst>
 | 
				
			||||||
 | 
					          <str name="q">static firstSearcher warming query from solrconfig.xml</str>
 | 
				
			||||||
 | 
					        </lst>
 | 
				
			||||||
 | 
					      </arr>
 | 
				
			||||||
 | 
					    </listener>
 | 
				
			||||||
 | 
					    <!-- If a search request comes in and there is no current registered searcher,
 | 
				
			||||||
 | 
					         then immediately register the still warming searcher and use it.  If
 | 
				
			||||||
 | 
					         "false" then all requests will block until the first searcher is done
 | 
				
			||||||
 | 
					         warming. -->
 | 
				
			||||||
 | 
					    <useColdSearcher>false</useColdSearcher>
 | 
				
			||||||
 | 
					    <!-- Maximum number of searchers that may be warming in the background
 | 
				
			||||||
 | 
					      concurrently.  An error is returned if this limit is exceeded. Recommend
 | 
				
			||||||
 | 
					      1-2 for read-only slaves, higher for masters w/o cache warming. -->
 | 
				
			||||||
 | 
					    <maxWarmingSearchers>2</maxWarmingSearchers>
 | 
				
			||||||
 | 
					  </query>
 | 
				
			||||||
 | 
					  <!-- 
 | 
				
			||||||
 | 
					    Let the dispatch filter handler /select?qt=XXX
 | 
				
			||||||
 | 
					    handleSelect=true will use consistent error handling for /select and /update
 | 
				
			||||||
 | 
					    handleSelect=false will use solr1.1 style error formatting
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <requestDispatcher handleSelect="true">
 | 
				
			||||||
 | 
					    <!--Make sure your system has some authentication before enabling remote streaming!  -->
 | 
				
			||||||
 | 
					    <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000"/>
 | 
				
			||||||
 | 
					    <!-- Set HTTP caching related parameters (for proxy caches and clients).
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					         To get the behaviour of Solr 1.2 (ie: no caching related headers)
 | 
				
			||||||
 | 
					         use the never304="true" option and do not specify a value for
 | 
				
			||||||
 | 
					         <cacheControl>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					    <!-- <httpCaching never304="true"> -->
 | 
				
			||||||
 | 
					    <httpCaching lastModifiedFrom="openTime" etagSeed="Solr">
 | 
				
			||||||
 | 
					      <!-- lastModFrom="openTime" is the default, the Last-Modified value
 | 
				
			||||||
 | 
					            (and validation against If-Modified-Since requests) will all be
 | 
				
			||||||
 | 
					            relative to when the current Searcher was opened.
 | 
				
			||||||
 | 
					            You can change it to lastModFrom="dirLastMod" if you want the
 | 
				
			||||||
 | 
					            value to exactly corrispond to when the physical index was last
 | 
				
			||||||
 | 
					            modified.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            etagSeed="..." is an option you can change to force the ETag
 | 
				
			||||||
 | 
					            header (and validation against If-None-Match requests) to be
 | 
				
			||||||
 | 
					            differnet even if the index has not changed (ie: when making
 | 
				
			||||||
 | 
					            significant changes to your config file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            lastModifiedFrom and etagSeed are both ignored if you use the
 | 
				
			||||||
 | 
					            never304="true" option.
 | 
				
			||||||
 | 
					       -->
 | 
				
			||||||
 | 
					      <!-- If you include a <cacheControl> directive, it will be used to
 | 
				
			||||||
 | 
					            generate a Cache-Control header, as well as an Expires header
 | 
				
			||||||
 | 
					            if the value contains "max-age="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            By default, no Cache-Control header is generated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            You can use the <cacheControl> option even if you have set
 | 
				
			||||||
 | 
					            never304="true"
 | 
				
			||||||
 | 
					       -->
 | 
				
			||||||
 | 
					      <!-- <cacheControl>max-age=30, public</cacheControl> -->
 | 
				
			||||||
 | 
					    </httpCaching>
 | 
				
			||||||
 | 
					  </requestDispatcher>
 | 
				
			||||||
 | 
					  <!-- requestHandler plugins... incoming queries will be dispatched to the
 | 
				
			||||||
 | 
					     correct handler based on the path or the qt (query type) param.
 | 
				
			||||||
 | 
					     Names starting with a '/' are accessed with the a path equal to the 
 | 
				
			||||||
 | 
					     registered name.  Names without a leading '/' are accessed with:
 | 
				
			||||||
 | 
					      http://host/app/select?qt=name
 | 
				
			||||||
 | 
					     If no qt is defined, the requestHandler that declares default="true"
 | 
				
			||||||
 | 
					     will be used.
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <requestHandler name="standard" class="solr.SearchHandler" default="true">
 | 
				
			||||||
 | 
					    <!-- default values for query parameters -->
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="echoParams">explicit</str>
 | 
				
			||||||
 | 
					      <!--
 | 
				
			||||||
 | 
					       <int name="rows">10</int>
 | 
				
			||||||
 | 
					       <str name="fl">*</str>
 | 
				
			||||||
 | 
					       <str name="version">2.1</str>
 | 
				
			||||||
 | 
					        -->
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Please refer to http://wiki.apache.org/solr/SolrReplication for details on configuring replication -->
 | 
				
			||||||
 | 
					  <!-- remove the <lst name="master"> section if this is just a slave -->
 | 
				
			||||||
 | 
					  <!-- remove  the <lst name="slave"> section if this is just a master -->
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					<requestHandler name="/replication" class="solr.ReplicationHandler" >
 | 
				
			||||||
 | 
					    <lst name="master">
 | 
				
			||||||
 | 
					      <str name="replicateAfter">commit</str>
 | 
				
			||||||
 | 
					      <str name="replicateAfter">startup</str>
 | 
				
			||||||
 | 
					      <str name="confFiles">schema.xml,stopwords.txt</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <lst name="slave">
 | 
				
			||||||
 | 
					      <str name="masterUrl">http://localhost:8983/solr/replication</str>
 | 
				
			||||||
 | 
					      <str name="pollInterval">00:00:60</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					</requestHandler>-->
 | 
				
			||||||
 | 
					  <!-- DisMaxRequestHandler allows easy searching across multiple fields
 | 
				
			||||||
 | 
					       for simple user-entered phrases.  It's implementation is now
 | 
				
			||||||
 | 
					       just the standard SearchHandler with a default query type
 | 
				
			||||||
 | 
					       of "dismax". 
 | 
				
			||||||
 | 
					       see http://wiki.apache.org/solr/DisMaxRequestHandler
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					  <requestHandler name="dismax" class="solr.SearchHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="defType">dismax</str>
 | 
				
			||||||
 | 
					      <str name="echoParams">explicit</str>
 | 
				
			||||||
 | 
					      <float name="tie">0.01</float>
 | 
				
			||||||
 | 
					      <str name="qf">
 | 
				
			||||||
 | 
					        text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
 | 
				
			||||||
 | 
					     </str>
 | 
				
			||||||
 | 
					      <str name="pf">
 | 
				
			||||||
 | 
					        text^0.2 features^1.1 name^1.5 manu^1.4 manu_exact^1.9
 | 
				
			||||||
 | 
					     </str>
 | 
				
			||||||
 | 
					      <str name="bf">
 | 
				
			||||||
 | 
					        popularity^0.5 recip(price,1,1000,1000)^0.3
 | 
				
			||||||
 | 
					     </str>
 | 
				
			||||||
 | 
					      <str name="fl">
 | 
				
			||||||
 | 
					        id,name,price,score
 | 
				
			||||||
 | 
					     </str>
 | 
				
			||||||
 | 
					      <str name="mm">
 | 
				
			||||||
 | 
					        2<-1 5<-2 6<90%
 | 
				
			||||||
 | 
					     </str>
 | 
				
			||||||
 | 
					      <int name="ps">100</int>
 | 
				
			||||||
 | 
					      <str name="q.alt">*:*</str>
 | 
				
			||||||
 | 
					      <!-- example highlighter config, enable per-query with hl=true -->
 | 
				
			||||||
 | 
					      <str name="hl.fl">text features name</str>
 | 
				
			||||||
 | 
					      <!-- for this field, we want no fragmenting, just highlighting -->
 | 
				
			||||||
 | 
					      <str name="f.name.hl.fragsize">0</str>
 | 
				
			||||||
 | 
					      <!-- instructs Solr to return the field itself if no query terms are
 | 
				
			||||||
 | 
					          found -->
 | 
				
			||||||
 | 
					      <str name="f.name.hl.alternateField">name</str>
 | 
				
			||||||
 | 
					      <str name="f.text.hl.fragmenter">regex</str>
 | 
				
			||||||
 | 
					      <!-- defined below -->
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Note how you can register the same handler multiple times with
 | 
				
			||||||
 | 
					       different names (and different init parameters)
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <requestHandler name="partitioned" class="solr.SearchHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="defType">dismax</str>
 | 
				
			||||||
 | 
					      <str name="echoParams">explicit</str>
 | 
				
			||||||
 | 
					      <str name="qf">text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0</str>
 | 
				
			||||||
 | 
					      <str name="mm">2<-1 5<-2 6<90%</str>
 | 
				
			||||||
 | 
					      <!-- This is an example of using Date Math to specify a constantly
 | 
				
			||||||
 | 
					          moving date range in a config...
 | 
				
			||||||
 | 
					       -->
 | 
				
			||||||
 | 
					      <str name="bq">incubationdate_dt:[* TO NOW/DAY-1MONTH]^2.2</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <!-- In addition to defaults, "appends" params can be specified
 | 
				
			||||||
 | 
					         to identify values which should be appended to the list of
 | 
				
			||||||
 | 
					         multi-val params from the query (or the existing "defaults").
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         In this example, the param "fq=instock:true" will be appended to
 | 
				
			||||||
 | 
					         any query time fq params the user may specify, as a mechanism for
 | 
				
			||||||
 | 
					         partitioning the index, independent of any user selected filtering
 | 
				
			||||||
 | 
					         that may also be desired (perhaps as a result of faceted searching).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         NOTE: there is *absolutely* nothing a client can do to prevent these
 | 
				
			||||||
 | 
					         "appends" values from being used, so don't use this mechanism
 | 
				
			||||||
 | 
					         unless you are sure you always want it.
 | 
				
			||||||
 | 
					      -->
 | 
				
			||||||
 | 
					    <lst name="appends">
 | 
				
			||||||
 | 
					      <str name="fq">inStock:true</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <!-- "invariants" are a way of letting the Solr maintainer lock down
 | 
				
			||||||
 | 
					         the options available to Solr clients.  Any params values
 | 
				
			||||||
 | 
					         specified here are used regardless of what values may be specified
 | 
				
			||||||
 | 
					         in either the query, the "defaults", or the "appends" params.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         In this example, the facet.field and facet.query params are fixed,
 | 
				
			||||||
 | 
					         limiting the facets clients can use.  Faceting is not turned on by
 | 
				
			||||||
 | 
					         default - but if the client does specify facet=true in the request,
 | 
				
			||||||
 | 
					         these are the only facets they will be able to see counts for;
 | 
				
			||||||
 | 
					         regardless of what other facet.field or facet.query params they
 | 
				
			||||||
 | 
					         may specify.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         NOTE: there is *absolutely* nothing a client can do to prevent these
 | 
				
			||||||
 | 
					         "invariants" values from being used, so don't use this mechanism
 | 
				
			||||||
 | 
					         unless you are sure you always want it.
 | 
				
			||||||
 | 
					      -->
 | 
				
			||||||
 | 
					    <lst name="invariants">
 | 
				
			||||||
 | 
					      <str name="facet.field">cat</str>
 | 
				
			||||||
 | 
					      <str name="facet.field">manu_exact</str>
 | 
				
			||||||
 | 
					      <str name="facet.query">price:[* TO 500]</str>
 | 
				
			||||||
 | 
					      <str name="facet.query">price:[500 TO *]</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					   Search components are registered to SolrCore and used by Search Handlers
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   By default, the following components are avaliable:
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					   <searchComponent name="query"     class="org.apache.solr.handler.component.QueryComponent" />
 | 
				
			||||||
 | 
					   <searchComponent name="facet"     class="org.apache.solr.handler.component.FacetComponent" />
 | 
				
			||||||
 | 
					   <searchComponent name="mlt"       class="org.apache.solr.handler.component.MoreLikeThisComponent" />
 | 
				
			||||||
 | 
					   <searchComponent name="highlight" class="org.apache.solr.handler.component.HighlightComponent" />
 | 
				
			||||||
 | 
					   <searchComponent name="stats"     class="org.apache.solr.handler.component.StatsComponent" />
 | 
				
			||||||
 | 
					   <searchComponent name="debug"     class="org.apache.solr.handler.component.DebugComponent" />
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   Default configuration in a requestHandler would look like:
 | 
				
			||||||
 | 
					    <arr name="components">
 | 
				
			||||||
 | 
					      <str>query</str>
 | 
				
			||||||
 | 
					      <str>facet</str>
 | 
				
			||||||
 | 
					      <str>mlt</str>
 | 
				
			||||||
 | 
					      <str>highlight</str>
 | 
				
			||||||
 | 
					      <str>stats</str>
 | 
				
			||||||
 | 
					      <str>debug</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If you register a searchComponent to one of the standard names, that will be used instead.
 | 
				
			||||||
 | 
					    To insert components before or after the 'standard' components, use:
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <arr name="first-components">
 | 
				
			||||||
 | 
					      <str>myFirstComponentName</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <arr name="last-components">
 | 
				
			||||||
 | 
					      <str>myLastComponentName</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- The spell check component can return a list of alternative spelling
 | 
				
			||||||
 | 
					  suggestions.  -->
 | 
				
			||||||
 | 
					  <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
 | 
				
			||||||
 | 
					    <str name="queryAnalyzerFieldType">textSpell</str>
 | 
				
			||||||
 | 
					    <lst name="spellchecker">
 | 
				
			||||||
 | 
					      <str name="name">default</str>
 | 
				
			||||||
 | 
					      <str name="field">name</str>
 | 
				
			||||||
 | 
					      <str name="spellcheckIndexDir">./spellchecker</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <!-- a spellchecker that uses a different distance measure
 | 
				
			||||||
 | 
					    <lst name="spellchecker">
 | 
				
			||||||
 | 
					      <str name="name">jarowinkler</str>
 | 
				
			||||||
 | 
					      <str name="field">spell</str>
 | 
				
			||||||
 | 
					      <str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>
 | 
				
			||||||
 | 
					      <str name="spellcheckIndexDir">./spellchecker2</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					     -->
 | 
				
			||||||
 | 
					    <!-- a file based spell checker
 | 
				
			||||||
 | 
					    <lst name="spellchecker">
 | 
				
			||||||
 | 
					      <str name="classname">solr.FileBasedSpellChecker</str>
 | 
				
			||||||
 | 
					      <str name="name">file</str>
 | 
				
			||||||
 | 
					      <str name="sourceLocation">spellings.txt</str>
 | 
				
			||||||
 | 
					      <str name="characterEncoding">UTF-8</str>
 | 
				
			||||||
 | 
					      <str name="spellcheckIndexDir">./spellcheckerFile</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  </searchComponent>
 | 
				
			||||||
 | 
					  <!-- A request handler utilizing the spellcheck component.  
 | 
				
			||||||
 | 
					  #############################################################################
 | 
				
			||||||
 | 
					  NOTE: This is purely as an example.  The whole purpose of the
 | 
				
			||||||
 | 
					  SpellCheckComponent is to hook it into the request handler that handles (i.e.
 | 
				
			||||||
 | 
					  the standard or dismax SearchHandler) queries such that a separate request is
 | 
				
			||||||
 | 
					  not needed to get suggestions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  IN OTHER WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS NOT WHAT YOU
 | 
				
			||||||
 | 
					  WANT FOR YOUR PRODUCTION SYSTEM!
 | 
				
			||||||
 | 
					  #############################################################################
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <requestHandler name="/spell" class="solr.SearchHandler" lazy="true">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <!-- omp = Only More Popular -->
 | 
				
			||||||
 | 
					      <str name="spellcheck.onlyMorePopular">false</str>
 | 
				
			||||||
 | 
					      <!-- exr = Extended Results -->
 | 
				
			||||||
 | 
					      <str name="spellcheck.extendedResults">false</str>
 | 
				
			||||||
 | 
					      <!--  The number of suggestions to return -->
 | 
				
			||||||
 | 
					      <str name="spellcheck.count">1</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <arr name="last-components">
 | 
				
			||||||
 | 
					      <str>spellcheck</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <searchComponent name="tvComponent" class="org.apache.solr.handler.component.TermVectorComponent"/>
 | 
				
			||||||
 | 
					  <!-- A Req Handler for working with the tvComponent.  This is purely as an example.
 | 
				
			||||||
 | 
					  You will likely want to add the component to your already specified request handlers. -->
 | 
				
			||||||
 | 
					  <requestHandler name="tvrh" class="org.apache.solr.handler.component.SearchHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <bool name="tv">true</bool>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <arr name="last-components">
 | 
				
			||||||
 | 
					      <str>tvComponent</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Clustering Component
 | 
				
			||||||
 | 
					       http://wiki.apache.org/solr/ClusteringComponent
 | 
				
			||||||
 | 
					       This relies on third party jars which are not included in the release.
 | 
				
			||||||
 | 
					       To use this component (and the "/clustering" handler)
 | 
				
			||||||
 | 
					       Those jars will need to be downloaded, and you'll need to set the
 | 
				
			||||||
 | 
					       solr.cluster.enabled system property when running solr...
 | 
				
			||||||
 | 
					          java -Dsolr.clustering.enabled=true -jar start.jar
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <searchComponent name="clusteringComponent" enable="${solr.clustering.enabled:false}" class="org.apache.solr.handler.clustering.ClusteringComponent">
 | 
				
			||||||
 | 
					    <!-- Declare an engine -->
 | 
				
			||||||
 | 
					    <lst name="engine">
 | 
				
			||||||
 | 
					      <!-- The name, only one can be named "default" -->
 | 
				
			||||||
 | 
					      <str name="name">default</str>
 | 
				
			||||||
 | 
					      <!-- 
 | 
				
			||||||
 | 
					           Class name of Carrot2 clustering algorithm. Currently available algorithms are:
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					           * org.carrot2.clustering.lingo.LingoClusteringAlgorithm
 | 
				
			||||||
 | 
					           * org.carrot2.clustering.stc.STCClusteringAlgorithm
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					           See http://project.carrot2.org/algorithms.html for the algorithm's characteristics.
 | 
				
			||||||
 | 
					        -->
 | 
				
			||||||
 | 
					      <str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
 | 
				
			||||||
 | 
					      <!-- 
 | 
				
			||||||
 | 
					           Overriding values for Carrot2 default algorithm attributes. For a description
 | 
				
			||||||
 | 
					           of all available attributes, see: http://download.carrot2.org/stable/manual/#chapter.components.
 | 
				
			||||||
 | 
					           Use attribute key as name attribute of str elements below. These can be further
 | 
				
			||||||
 | 
					           overridden for individual requests by specifying attribute key as request
 | 
				
			||||||
 | 
					           parameter name and attribute value as parameter value.
 | 
				
			||||||
 | 
					        -->
 | 
				
			||||||
 | 
					      <str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <lst name="engine">
 | 
				
			||||||
 | 
					      <str name="name">stc</str>
 | 
				
			||||||
 | 
					      <str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </searchComponent>
 | 
				
			||||||
 | 
					  <requestHandler name="/clustering" enable="${solr.clustering.enabled:false}" class="solr.SearchHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <bool name="clustering">true</bool>
 | 
				
			||||||
 | 
					      <str name="clustering.engine">default</str>
 | 
				
			||||||
 | 
					      <bool name="clustering.results">true</bool>
 | 
				
			||||||
 | 
					      <!-- The title field -->
 | 
				
			||||||
 | 
					      <str name="carrot.title">name</str>
 | 
				
			||||||
 | 
					      <str name="carrot.url">id</str>
 | 
				
			||||||
 | 
					      <!-- The field to cluster on -->
 | 
				
			||||||
 | 
					      <str name="carrot.snippet">features</str>
 | 
				
			||||||
 | 
					      <!-- produce summaries -->
 | 
				
			||||||
 | 
					      <bool name="carrot.produceSummary">true</bool>
 | 
				
			||||||
 | 
					      <!-- the maximum number of labels per cluster -->
 | 
				
			||||||
 | 
					      <!--<int name="carrot.numDescriptions">5</int>-->
 | 
				
			||||||
 | 
					      <!-- produce sub clusters -->
 | 
				
			||||||
 | 
					      <bool name="carrot.outputSubClusters">false</bool>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <arr name="last-components">
 | 
				
			||||||
 | 
					      <str>clusteringComponent</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Solr Cell: http://wiki.apache.org/solr/ExtractingRequestHandler -->
 | 
				
			||||||
 | 
					  <requestHandler name="/update/extract" class="org.apache.solr.handler.extraction.ExtractingRequestHandler" startup="lazy">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <!-- All the main content goes into "text"... if you need to return
 | 
				
			||||||
 | 
					           the extracted text or do highlighting, use a stored field. -->
 | 
				
			||||||
 | 
					      <str name="fmap.content">text</str>
 | 
				
			||||||
 | 
					      <str name="lowernames">true</str>
 | 
				
			||||||
 | 
					      <str name="uprefix">ignored_</str>
 | 
				
			||||||
 | 
					      <!-- capture link hrefs but ignore div attributes -->
 | 
				
			||||||
 | 
					      <str name="captureAttr">true</str>
 | 
				
			||||||
 | 
					      <str name="fmap.a">links</str>
 | 
				
			||||||
 | 
					      <str name="fmap.div">ignored_</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- A component to return terms and document frequency of those terms.
 | 
				
			||||||
 | 
					       This component does not yet support distributed search. -->
 | 
				
			||||||
 | 
					  <searchComponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
 | 
				
			||||||
 | 
					  <requestHandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <bool name="terms">true</bool>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <arr name="components">
 | 
				
			||||||
 | 
					      <str>termsComponent</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- a search component that enables you to configure the top results for
 | 
				
			||||||
 | 
					       a given query regardless of the normal lucene scoring.-->
 | 
				
			||||||
 | 
					  <searchComponent name="elevator" class="solr.QueryElevationComponent">
 | 
				
			||||||
 | 
					    <!-- pick a fieldType to analyze queries -->
 | 
				
			||||||
 | 
					    <str name="queryFieldType">string</str>
 | 
				
			||||||
 | 
					    <str name="config-file">elevate.xml</str>
 | 
				
			||||||
 | 
					  </searchComponent>
 | 
				
			||||||
 | 
					  <!-- a request handler utilizing the elevator component -->
 | 
				
			||||||
 | 
					  <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="echoParams">explicit</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					    <arr name="last-components">
 | 
				
			||||||
 | 
					      <str>elevator</str>
 | 
				
			||||||
 | 
					    </arr>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Update request handler.  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       Note: Since solr1.1 requestHandlers requires a valid content type header if posted in
 | 
				
			||||||
 | 
					       the body. For example, curl now requires: -H 'Content-type:text/xml; charset=utf-8'
 | 
				
			||||||
 | 
					       The response format differs from solr1.1 formatting and returns a standard error code.
 | 
				
			||||||
 | 
					       To enable solr1.1 behavior, remove the /update handler or change its path
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  <requestHandler name="/update" class="solr.XmlUpdateRequestHandler"/>
 | 
				
			||||||
 | 
					  <requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler"/>
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					   Analysis request handler.  Since Solr 1.3.  Use to return how a document is analyzed.  Useful
 | 
				
			||||||
 | 
					   for debugging and as a token server for other types of applications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   This is deprecated in favor of the improved DocumentAnalysisRequestHandler and FieldAnalysisRequestHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <requestHandler name="/analysis" class="solr.AnalysisRequestHandler" />
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					    An analysis handler that provides a breakdown of the analysis process of provided docuemnts. This handler expects a
 | 
				
			||||||
 | 
					    (single) content stream with the following format:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <docs>
 | 
				
			||||||
 | 
					      <doc>
 | 
				
			||||||
 | 
					        <field name="id">1</field>
 | 
				
			||||||
 | 
					        <field name="name">The Name</field>
 | 
				
			||||||
 | 
					        <field name="text">The Text Value</field>
 | 
				
			||||||
 | 
					      <doc>
 | 
				
			||||||
 | 
					      <doc>...</doc>
 | 
				
			||||||
 | 
					      <doc>...</doc>
 | 
				
			||||||
 | 
					      ...
 | 
				
			||||||
 | 
					    </docs>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Note: Each document must contain a field which serves as the unique key. This key is used in the returned
 | 
				
			||||||
 | 
					    response to assoicate an analysis breakdown to the analyzed document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Like the FieldAnalysisRequestHandler, this handler also supports query analysis by
 | 
				
			||||||
 | 
					    sending either an "analysis.query" or "q" request paraemter that holds the query text to be analyized. It also
 | 
				
			||||||
 | 
					    supports the "analysis.showmatch" parameter which when set to true, all field tokens that match the query
 | 
				
			||||||
 | 
					    tokens will be marked as a "match".
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <requestHandler name="/analysis/document" class="solr.DocumentAnalysisRequestHandler"/>
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					    RequestHandler that provides much the same functionality as analysis.jsp. Provides the ability
 | 
				
			||||||
 | 
					    to specify multiple field types and field names in the same request and outputs index-time and
 | 
				
			||||||
 | 
					    query-time analysis for each of them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Request parameters are:
 | 
				
			||||||
 | 
					    analysis.fieldname - The field name whose analyzers are to be used
 | 
				
			||||||
 | 
					    analysis.fieldtype - The field type whose analyzers are to be used
 | 
				
			||||||
 | 
					    analysis.fieldvalue - The text for index-time analysis
 | 
				
			||||||
 | 
					    q (or analysis.q) - The text for query time analysis
 | 
				
			||||||
 | 
					    analysis.showmatch (true|false) - When set to true and when query analysis is performed, the produced
 | 
				
			||||||
 | 
					                                      tokens of the field value analysis will be marked as "matched" for every
 | 
				
			||||||
 | 
					                                      token that is produces by the query analysis
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					  <requestHandler name="/analysis/field" class="solr.FieldAnalysisRequestHandler"/>
 | 
				
			||||||
 | 
					  <!-- CSV update handler, loaded on demand -->
 | 
				
			||||||
 | 
					  <requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy"/>
 | 
				
			||||||
 | 
					  <!-- 
 | 
				
			||||||
 | 
					   Admin Handlers - This will register all the standard admin RequestHandlers.  Adding 
 | 
				
			||||||
 | 
					   this single handler is equivalent to registering:
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/luke"       class="org.apache.solr.handler.admin.LukeRequestHandler" />
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/system"     class="org.apache.solr.handler.admin.SystemInfoHandler" />
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/plugins"    class="org.apache.solr.handler.admin.PluginInfoHandler" />
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/threads"    class="org.apache.solr.handler.admin.ThreadDumpHandler" />
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/properties" class="org.apache.solr.handler.admin.PropertiesRequestHandler" />
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/file"       class="org.apache.solr.handler.admin.ShowFileRequestHandler" >
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  If you wish to hide files under ${solr.home}/conf, explicitly register the ShowFileRequestHandler using:
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/file" class="org.apache.solr.handler.admin.ShowFileRequestHandler" >
 | 
				
			||||||
 | 
					    <lst name="invariants">
 | 
				
			||||||
 | 
					     <str name="hidden">synonyms.txt</str> 
 | 
				
			||||||
 | 
					     <str name="hidden">anotherfile.txt</str> 
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers"/>
 | 
				
			||||||
 | 
					  <!-- ping/healthcheck -->
 | 
				
			||||||
 | 
					  <requestHandler name="/admin/ping" class="PingRequestHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="qt">standard</str>
 | 
				
			||||||
 | 
					      <str name="q">solrpingquery</str>
 | 
				
			||||||
 | 
					      <str name="echoParams">all</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <!-- Echo the request contents back to the client -->
 | 
				
			||||||
 | 
					  <requestHandler name="/debug/dump" class="solr.DumpRequestHandler">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="echoParams">explicit</str>
 | 
				
			||||||
 | 
					      <!-- for all params (including the default etc) use: 'all' -->
 | 
				
			||||||
 | 
					      <str name="echoHandler">true</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					  <highlighting>
 | 
				
			||||||
 | 
					    <!-- Configure the standard fragmenter -->
 | 
				
			||||||
 | 
					    <!-- This could most likely be commented out in the "default" case -->
 | 
				
			||||||
 | 
					    <fragmenter name="gap" class="org.apache.solr.highlight.GapFragmenter" default="true">
 | 
				
			||||||
 | 
					      <lst name="defaults">
 | 
				
			||||||
 | 
					        <int name="hl.fragsize">100</int>
 | 
				
			||||||
 | 
					      </lst>
 | 
				
			||||||
 | 
					    </fragmenter>
 | 
				
			||||||
 | 
					    <!-- A regular-expression-based fragmenter (f.i., for sentence extraction) -->
 | 
				
			||||||
 | 
					    <fragmenter name="regex" class="org.apache.solr.highlight.RegexFragmenter">
 | 
				
			||||||
 | 
					      <lst name="defaults">
 | 
				
			||||||
 | 
					        <!-- slightly smaller fragsizes work better because of slop -->
 | 
				
			||||||
 | 
					        <int name="hl.fragsize">70</int>
 | 
				
			||||||
 | 
					        <!-- allow 50% slop on fragment sizes -->
 | 
				
			||||||
 | 
					        <float name="hl.regex.slop">0.5</float>
 | 
				
			||||||
 | 
					        <!-- a basic sentence pattern -->
 | 
				
			||||||
 | 
					        <str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
 | 
				
			||||||
 | 
					      </lst>
 | 
				
			||||||
 | 
					    </fragmenter>
 | 
				
			||||||
 | 
					    <!-- Configure the standard formatter -->
 | 
				
			||||||
 | 
					    <formatter name="html" class="org.apache.solr.highlight.HtmlFormatter" default="true">
 | 
				
			||||||
 | 
					      <lst name="defaults">
 | 
				
			||||||
 | 
					        <str name="hl.simple.pre"><![CDATA[<em>]]></str>
 | 
				
			||||||
 | 
					        <str name="hl.simple.post"><![CDATA[</em>]]></str>
 | 
				
			||||||
 | 
					      </lst>
 | 
				
			||||||
 | 
					    </formatter>
 | 
				
			||||||
 | 
					  </highlighting>
 | 
				
			||||||
 | 
					  <!-- An example dedup update processor that creates the "id" field on the fly
 | 
				
			||||||
 | 
					       based on the hash code of some other fields.  This example has overwriteDupes
 | 
				
			||||||
 | 
					       set to false since we are using the id field as the signatureField and Solr
 | 
				
			||||||
 | 
					       will maintain uniqueness based on that anyway. 
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					       You have to link the chain to an update handler above to use it ie:
 | 
				
			||||||
 | 
					         <requestHandler name="/update "class="solr.XmlUpdateRequestHandler">
 | 
				
			||||||
 | 
					           <lst name="defaults">
 | 
				
			||||||
 | 
					             <str name="update.processor">dedupe</str>
 | 
				
			||||||
 | 
					           </lst>
 | 
				
			||||||
 | 
					         </requestHandler>  
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					  <updateRequestProcessorChain name="dedupe">
 | 
				
			||||||
 | 
					    <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
 | 
				
			||||||
 | 
					      <bool name="enabled">true</bool>
 | 
				
			||||||
 | 
					      <str name="signatureField">id</str>
 | 
				
			||||||
 | 
					      <bool name="overwriteDupes">false</bool>
 | 
				
			||||||
 | 
					      <str name="fields">name,features,cat</str>
 | 
				
			||||||
 | 
					      <str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str>
 | 
				
			||||||
 | 
					    </processor>
 | 
				
			||||||
 | 
					    <processor class="solr.LogUpdateProcessorFactory" />
 | 
				
			||||||
 | 
					    <processor class="solr.RunUpdateProcessorFactory" />
 | 
				
			||||||
 | 
					  </updateRequestProcessorChain>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- queryResponseWriter plugins... query responses will be written using the
 | 
				
			||||||
 | 
					    writer specified by the 'wt' request parameter matching the name of a registered
 | 
				
			||||||
 | 
					    writer.
 | 
				
			||||||
 | 
					    The "default" writer is the default and will be used if 'wt' is not specified 
 | 
				
			||||||
 | 
					    in the request. XMLResponseWriter will be used if nothing is specified here.
 | 
				
			||||||
 | 
					    The json, python, and ruby writers are also available by default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <queryResponseWriter name="xml" class="org.apache.solr.request.XMLResponseWriter" default="true"/>
 | 
				
			||||||
 | 
					    <queryResponseWriter name="json" class="org.apache.solr.request.JSONResponseWriter"/>
 | 
				
			||||||
 | 
					    <queryResponseWriter name="python" class="org.apache.solr.request.PythonResponseWriter"/>
 | 
				
			||||||
 | 
					    <queryResponseWriter name="ruby" class="org.apache.solr.request.RubyResponseWriter"/>
 | 
				
			||||||
 | 
					    <queryResponseWriter name="php" class="org.apache.solr.request.PHPResponseWriter"/>
 | 
				
			||||||
 | 
					    <queryResponseWriter name="phps" class="org.apache.solr.request.PHPSerializedResponseWriter"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <queryResponseWriter name="custom" class="com.example.MyResponseWriter"/>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- XSLT response writer transforms the XML output by any xslt file found
 | 
				
			||||||
 | 
					       in Solr's conf/xslt directory.  Changes to xslt files are checked for
 | 
				
			||||||
 | 
					       every xsltCacheLifetimeSeconds.  
 | 
				
			||||||
 | 
					   -->
 | 
				
			||||||
 | 
					  <queryResponseWriter name="xslt" class="org.apache.solr.request.XSLTResponseWriter">
 | 
				
			||||||
 | 
					    <int name="xsltCacheLifetimeSeconds">5</int>
 | 
				
			||||||
 | 
					  </queryResponseWriter>
 | 
				
			||||||
 | 
					  <!-- example of registering a query parser
 | 
				
			||||||
 | 
					  <queryParser name="lucene" class="org.apache.solr.search.LuceneQParserPlugin"/>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- example of registering a custom function parser 
 | 
				
			||||||
 | 
					  <valueSourceParser name="myfunc" class="com.mycompany.MyValueSourceParser" />
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					  <!-- config for the admin interface -->
 | 
				
			||||||
 | 
					  <admin>
 | 
				
			||||||
 | 
					    <defaultQuery>solr</defaultQuery>
 | 
				
			||||||
 | 
					    <!-- configure a healthcheck file for servers behind a loadbalancer
 | 
				
			||||||
 | 
					    <healthcheck type="file">server-enabled</healthcheck>
 | 
				
			||||||
 | 
					    -->
 | 
				
			||||||
 | 
					  </admin>
 | 
				
			||||||
 | 
					  <requestHandler class="solr.MoreLikeThisHandler" name="/mlt">
 | 
				
			||||||
 | 
					    <lst name="defaults">
 | 
				
			||||||
 | 
					      <str name="mlt.mintf">1</str>
 | 
				
			||||||
 | 
					      <str name="mlt.mindf">2</str>
 | 
				
			||||||
 | 
					    </lst>
 | 
				
			||||||
 | 
					  </requestHandler>
 | 
				
			||||||
 | 
					</config>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					pizza
 | 
				
			||||||
 | 
					history
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					# Licensed to the Apache Software Foundation (ASF) under one or more
 | 
				
			||||||
 | 
					# contributor license agreements.  See the NOTICE file distributed with
 | 
				
			||||||
 | 
					# this work for additional information regarding copyright ownership.
 | 
				
			||||||
 | 
					# The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					# (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					# the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# a couple of test stopwords to test that the words are really being
 | 
				
			||||||
 | 
					# configured from this file:
 | 
				
			||||||
 | 
					stopworda
 | 
				
			||||||
 | 
					stopwordb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Standard english stop words taken from Lucene's StopAnalyzer
 | 
				
			||||||
 | 
					a
 | 
				
			||||||
 | 
					an
 | 
				
			||||||
 | 
					and
 | 
				
			||||||
 | 
					are
 | 
				
			||||||
 | 
					as
 | 
				
			||||||
 | 
					at
 | 
				
			||||||
 | 
					be
 | 
				
			||||||
 | 
					but
 | 
				
			||||||
 | 
					by
 | 
				
			||||||
 | 
					for
 | 
				
			||||||
 | 
					if
 | 
				
			||||||
 | 
					in
 | 
				
			||||||
 | 
					into
 | 
				
			||||||
 | 
					is
 | 
				
			||||||
 | 
					it
 | 
				
			||||||
 | 
					no
 | 
				
			||||||
 | 
					not
 | 
				
			||||||
 | 
					of
 | 
				
			||||||
 | 
					on
 | 
				
			||||||
 | 
					or
 | 
				
			||||||
 | 
					s
 | 
				
			||||||
 | 
					such
 | 
				
			||||||
 | 
					t
 | 
				
			||||||
 | 
					that
 | 
				
			||||||
 | 
					the
 | 
				
			||||||
 | 
					their
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					there
 | 
				
			||||||
 | 
					these
 | 
				
			||||||
 | 
					they
 | 
				
			||||||
 | 
					this
 | 
				
			||||||
 | 
					to
 | 
				
			||||||
 | 
					was
 | 
				
			||||||
 | 
					will
 | 
				
			||||||
 | 
					with
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					# The ASF licenses this file to You under the Apache License, Version 2.0
 | 
				
			||||||
 | 
					# (the "License"); you may not use this file except in compliance with
 | 
				
			||||||
 | 
					# the License.  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
 | 
					#some test synonym mappings unlikely to appear in real input text
 | 
				
			||||||
 | 
					aaa => aaaa
 | 
				
			||||||
 | 
					bbb => bbbb1 bbbb2
 | 
				
			||||||
 | 
					ccc => cccc1,cccc2
 | 
				
			||||||
 | 
					a\=>a => b\=>b
 | 
				
			||||||
 | 
					a\,a => b\,b
 | 
				
			||||||
 | 
					fooaaa,baraaa,bazaaa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Some synonym groups specific to this example
 | 
				
			||||||
 | 
					GB,gib,gigabyte,gigabytes
 | 
				
			||||||
 | 
					MB,mib,megabyte,megabytes
 | 
				
			||||||
 | 
					Television, Televisions, TV, TVs
 | 
				
			||||||
 | 
					#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming
 | 
				
			||||||
 | 
					#after us won't split it into two words.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Synonym mappings can be used for spelling correction too
 | 
				
			||||||
 | 
					pixima => pixma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,11 +10,8 @@ class Panel::Announcement::BackEnd::ApprovalsController  < OrbitBackendControlle
 | 
				
			||||||
  def approve
 | 
					  def approve
 | 
				
			||||||
    notice = ""
 | 
					    notice = ""
 | 
				
			||||||
    @bulletin = Bulletin.find params[:bulletin_id]
 | 
					    @bulletin = Bulletin.find params[:bulletin_id]
 | 
				
			||||||
    
 | 
					    @bulletin.proc_check(params[:bulletin][:is_checked],params[:bulletin][:not_checked_reason])
 | 
				
			||||||
    @bulletin.is_checked = params[:bulletin][:is_checked]
 | 
					 | 
				
			||||||
    @bulletin.not_checked_reason = params[:bulletin][:not_checked_reason]
 | 
					 | 
				
			||||||
    @bulletin.de_pending
 | 
					    @bulletin.de_pending
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
     if @bulletin.save
 | 
					     if @bulletin.save
 | 
				
			||||||
        notice = t('bulletin.approve_bulletin_success')
 | 
					        notice = t('bulletin.approve_bulletin_success')
 | 
				
			||||||
     else
 | 
					     else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,12 +34,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
      @filter = {new_filter[:type] => [new_filter[:id].to_s]}
 | 
					      @filter = {new_filter[:type] => [new_filter[:id].to_s]}
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # @bulletins = Bulletin.where("bulletin_category_id" => params[:bulletin_category_id]).desc("postdate") if params[:bulletin_category_id]
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  	# @bulletins = Bulletin.search(params[:search], params[:category_id])
 | 
					 | 
				
			||||||
    # @bulletins = Bulletin.all.order_by([params[:sort], params[:direction]])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # @bulletins = (params[:sort] || @filter) ? get_sorted_and_filtered_bulletins : Bulletin.all.page(params[:page]).per(10)
 | 
					 | 
				
			||||||
    @bulletin_categories = get_categories_for_index("BulletinCategory")
 | 
					    @bulletin_categories = get_categories_for_index("BulletinCategory")
 | 
				
			||||||
    @bulletin_category_ids = @bulletin_categories.collect{|t| t.id.to_s} + [nil]
 | 
					    @bulletin_category_ids = @bulletin_categories.collect{|t| t.id.to_s} + [nil]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,15 +57,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  def show
 | 
					  def show
 | 
				
			||||||
    @bulletin = Bulletin.find(params[:id])
 | 
					    @bulletin = Bulletin.find(params[:id])
 | 
				
			||||||
    get_tags
 | 
					    get_tags
 | 
				
			||||||
	# get_categorys
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    # @bulletin_categorys = BulletinCategory.where("_id" => params[:id])
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    # if params[:id]
 | 
					 | 
				
			||||||
      # @bulletins = Bulletin.where("bulletin_category_id" => params[:id])
 | 
					 | 
				
			||||||
    # else
 | 
					 | 
				
			||||||
      # @bulletins = Bulletin.desc("postdate desc")
 | 
					 | 
				
			||||||
    # end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.html # show.html.erb
 | 
					      format.html # show.html.erb
 | 
				
			||||||
| 
						 | 
					@ -85,10 +70,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
    @bulletin = Bulletin.new(:postdate => DateTime.now)
 | 
					    @bulletin = Bulletin.new(:postdate => DateTime.now)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
    @link_url = panel_announcement_back_end_bulletins_path
 | 
					    @link_url = panel_announcement_back_end_bulletins_path
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
	# @bulletin.bulletin_files.build
 | 
					 | 
				
			||||||
	# @bulletin.bulletin_files.new
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    get_tags
 | 
					    get_tags
 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
        format.html # new.html.erb
 | 
					        format.html # new.html.erb
 | 
				
			||||||
| 
						 | 
					@ -141,6 +122,9 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		@bulletin.create_user_id = current_user.id
 | 
							@bulletin.create_user_id = current_user.id
 | 
				
			||||||
		@bulletin.update_user_id = current_user.id
 | 
							@bulletin.update_user_id = current_user.id
 | 
				
			||||||
 | 
					            if(is_manager? || is_admin?)
 | 
				
			||||||
 | 
					              @bulletin.de_pending
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		respond_to do |format|
 | 
							respond_to do |format|
 | 
				
			||||||
		  if @bulletin.save
 | 
							  if @bulletin.save
 | 
				
			||||||
| 
						 | 
					@ -159,11 +143,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def link_quick_add    
 | 
					  def link_quick_add    
 | 
				
			||||||
	# debugger
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    @bulletin_link = BulletinLink.new
 | 
					    @bulletin_link = BulletinLink.new
 | 
				
			||||||
    @link_url = panel_announcement_back_end_bulletins_path
 | 
					    @link_url = panel_announcement_back_end_bulletins_path
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    @bulletin_link.bulletin_id = params[:bulletin_id]
 | 
					    @bulletin_link.bulletin_id = params[:bulletin_id]
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
| 
						 | 
					@ -173,29 +154,17 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def link_quick_edit
 | 
					  def link_quick_edit
 | 
				
			||||||
	# debugger
 | 
					 | 
				
			||||||
    @bulletin_link = BulletinLink.find(params[:bulletin_id])
 | 
					    @bulletin_link = BulletinLink.find(params[:bulletin_id])
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    @link_url = panel_announcement_back_end_bulletin_path(@bulletin_link)
 | 
					    @link_url = panel_announcement_back_end_bulletin_path(@bulletin_link)
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    # @bulletin = Bulletin.find(params[:bulletin_id])
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	# @link_url = panel_announcement_back_end_bulletin_path(@bulletin)
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.js
 | 
					      format.js
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def file_quick_add    
 | 
					  def file_quick_add    
 | 
				
			||||||
    # debugger
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    @bulletin_file = BulletinFile.new
 | 
					    @bulletin_file = BulletinFile.new
 | 
				
			||||||
    @file_url = panel_announcement_back_end_bulletins_path
 | 
					    @file_url = panel_announcement_back_end_bulletins_path
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    @bulletin_file.bulletin_id = params[:bulletin_id]
 | 
					    @bulletin_file.bulletin_id = params[:bulletin_id]
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.js
 | 
					      format.js
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					@ -203,11 +172,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def file_quick_edit
 | 
					  def file_quick_edit
 | 
				
			||||||
    # debugger
 | 
					 | 
				
			||||||
    @bulletin_file = BulletinFile.find(params[:bulletin_id])
 | 
					    @bulletin_file = BulletinFile.find(params[:bulletin_id])
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    @file_url = panel_announcement_back_end_bulletin_path(@bulletin_file)
 | 
					    @file_url = panel_announcement_back_end_bulletin_path(@bulletin_file)
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.js
 | 
					      format.js
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					@ -215,6 +181,7 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # PUT /bulletins/1
 | 
					  # PUT /bulletins/1
 | 
				
			||||||
  # PUT /bulletins/1.xml
 | 
					  # PUT /bulletins/1.xml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def update
 | 
					  def update
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  	if params[:bulletin_link]
 | 
					  	if params[:bulletin_link]
 | 
				
			||||||
| 
						 | 
					@ -249,7 +216,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
  		@bulletin = Bulletin.find(params[:id])
 | 
					  		@bulletin = Bulletin.find(params[:id])
 | 
				
			||||||
  		
 | 
					  		
 | 
				
			||||||
  		
 | 
					 | 
				
			||||||
  		# @bulletin.image.clear if params[:bulletin][:image_del] == '1'
 | 
					  		# @bulletin.image.clear if params[:bulletin][:image_del] == '1'
 | 
				
			||||||
  		# if params[:bulletin][:image_del] == '1' 
 | 
					  		# if params[:bulletin][:image_del] == '1' 
 | 
				
			||||||
  			# @bulletin.remove_image!
 | 
					  			# @bulletin.remove_image!
 | 
				
			||||||
| 
						 | 
					@ -262,6 +228,11 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  		respond_to do |format|
 | 
					  		respond_to do |format|
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
  		  if @bulletin.update_attributes(params[:bulletin])
 | 
					  		  if @bulletin.update_attributes(params[:bulletin])
 | 
				
			||||||
 | 
					                 if(is_manager? || is_admin?)
 | 
				
			||||||
 | 
					                  @bulletin.is_checked = true
 | 
				
			||||||
 | 
					                  @bulletin.is_rejected = false
 | 
				
			||||||
 | 
					                  @bulletin.de_pending!
 | 
				
			||||||
 | 
					                 end
 | 
				
			||||||
                # if (params[:bulletin][:is_checked] == "false")
 | 
					                # if (params[:bulletin][:is_checked] == "false")
 | 
				
			||||||
                #   @bulletin.is_rejected = true
 | 
					                #   @bulletin.is_rejected = true
 | 
				
			||||||
                #   @bulletin.save!
 | 
					                #   @bulletin.save!
 | 
				
			||||||
| 
						 | 
					@ -277,7 +248,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
 | 
				
			||||||
  			format.xml  { head :ok }
 | 
					  			format.xml  { head :ok }
 | 
				
			||||||
  		  else
 | 
					  		  else
 | 
				
			||||||
                  get_tags
 | 
					                  get_tags
 | 
				
			||||||
          
 | 
					 | 
				
			||||||
  			format.html { render :action => "edit" }
 | 
					  			format.html { render :action => "edit" }
 | 
				
			||||||
  			format.xml  { render :xml => @bulletin.errors, :status => :unprocessable_entity }
 | 
					  			format.xml  { render :xml => @bulletin.errors, :status => :unprocessable_entity }
 | 
				
			||||||
  		  end
 | 
					  		  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,10 +10,14 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  def index
 | 
					  def index
 | 
				
			||||||
    if  !params[:search_query].blank?
 | 
					    if  !params[:search_query].blank?
 | 
				
			||||||
      search_cond =  {:is_checked=>true,:is_hidden=>false,:is_pending => false}
 | 
					      # search_cond =  {:is_checked=>true,:is_hidden=>false,:is_pending => false}
 | 
				
			||||||
      search_cond.merge!({:bulletin_category_id => "#{params[:category_id]}" }) if  !params[:category_id].blank?
 | 
					      # search_cond.merge!({:bulletin_category_id => "#{params[:category_id]}" }) if  !params[:category_id].blank?
 | 
				
			||||||
      search = Redis::Search.query("Bulletin", params[:search_query], :conditions =>search_cond,:limit=>Bulletin.all.count)
 | 
					      @search = Bulletin.solr_search do 
 | 
				
			||||||
      search_result = search.collect{|t| t["id"]}
 | 
					        fulltext params[:search_query]
 | 
				
			||||||
 | 
					        with(:frontend_search,true)
 | 
				
			||||||
 | 
					        #order_by(:average_rating)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      search_result =  @search.results.collect{|result| result.id}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      @bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(15)
 | 
					      @bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(15)
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ class Bulletin
 | 
				
			||||||
  include Mongoid::Document
 | 
					  include Mongoid::Document
 | 
				
			||||||
  include Mongoid::Timestamps
 | 
					  include Mongoid::Timestamps
 | 
				
			||||||
  include Mongoid::MultiParameterAttributes
 | 
					  include Mongoid::MultiParameterAttributes
 | 
				
			||||||
  include Redis::Search
 | 
					  include Sunspot::Mongo
 | 
				
			||||||
  include Impressionist::Impressionable
 | 
					  include Impressionist::Impressionable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  BelongsToCategory =  :bulletin_category
 | 
					  BelongsToCategory =  :bulletin_category
 | 
				
			||||||
| 
						 | 
					@ -60,60 +60,49 @@ class Bulletin
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  validates :title, :at_least_one => true
 | 
					  validates :title, :at_least_one => true
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  before_save :check_deadline,:update_status,:update_avliable_language
 | 
					  before_save :check_deadline,:update_avliable_language
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  after_save :save_bulletin_links
 | 
					  after_save :save_bulletin_links
 | 
				
			||||||
  after_save :save_bulletin_files
 | 
					  after_save :save_bulletin_files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  redis_search_index(:title_field => :s_title,
 | 
					  searchable do
 | 
				
			||||||
                      :alias_field =>:s_title_en ,
 | 
					    text :titles do
 | 
				
			||||||
                     :score_field => :view_count,
 | 
					      title_translations.to_a.collect{|t| t[1]}
 | 
				
			||||||
                     :condition_fields => [:is_checked,:is_hidden,:bulletin_category_id,:is_pending],
 | 
					    end
 | 
				
			||||||
                     :ext_fields => [])
 | 
					    text :texts do
 | 
				
			||||||
  
 | 
					      text_translations.to_a.collect{|t| Nokogiri::HTML(t[1]).text}
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  #  def gen_title_for_search
 | 
					    # text :text do
 | 
				
			||||||
  #   # [s_title,s_title_en,s_text_en,s_text_zh_tw].join(' ')
 | 
					    #   a = (title_translations["zh_tw"] + title_translations["en"])
 | 
				
			||||||
 | 
					    #   a
 | 
				
			||||||
    # end
 | 
					    # end
 | 
				
			||||||
 | 
					    boolean :frontend_search do
 | 
				
			||||||
 #alias_method
 | 
					      ( !is_hidden &&  !is_pending && is_checked && !is_rejected )
 | 
				
			||||||
 | 
					 | 
				
			||||||
  def s_title
 | 
					 | 
				
			||||||
   self.title_translations["zh_tw"]
 | 
					 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 def s_title_was
 | 
					    integer :view_count
 | 
				
			||||||
   self.title_was["zh_tw"]
 | 
					    string :bulletin_category_id
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def s_title_en
 | 
					  def proc_check(check,not_pass_info = "")
 | 
				
			||||||
   self.title_translations["en"]
 | 
					    self.is_checked = true
 | 
				
			||||||
 | 
					      if check =="true"
 | 
				
			||||||
 | 
					        self.is_rejected = false
 | 
				
			||||||
 | 
					      elsif check == "false"
 | 
				
			||||||
 | 
					        self.is_rejected = true
 | 
				
			||||||
 | 
					        self.not_checked_reason = not_pass_info
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 def s_title_en_was
 | 
					 | 
				
			||||||
   self.title_was["en"]
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # def s_text_en
 | 
					 | 
				
			||||||
  #  Nokogiri::HTML(self.text.en).text
 | 
					 | 
				
			||||||
  # end
 | 
					 | 
				
			||||||
  # def s_text_zh_tw
 | 
					 | 
				
			||||||
  #  Nokogiri::HTML(self.text.zh_tw).text
 | 
					 | 
				
			||||||
  # end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # scope :currently_available, lambda { |category, limit|
 | 
					 | 
				
			||||||
  #     # limit ||= 5
 | 
					 | 
				
			||||||
  #     # {
 | 
					 | 
				
			||||||
  #       # debugger
 | 
					 | 
				
			||||||
  #       # a=1
 | 
					 | 
				
			||||||
  #       :where => {:bulletin_category_id => bulletin_category_id, :disable => false}#, 
 | 
					 | 
				
			||||||
  #       # :limit => limit
 | 
					 | 
				
			||||||
  #     # }
 | 
					 | 
				
			||||||
  #   }
 | 
					 | 
				
			||||||
  def de_pending
 | 
					  def de_pending
 | 
				
			||||||
    self.is_pending = false
 | 
					    self.is_pending = false
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def de_pending!
 | 
				
			||||||
 | 
					    de_pending
 | 
				
			||||||
 | 
					    self.save!
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def publish_month
 | 
					  def publish_month
 | 
				
			||||||
    published_at.strftime("%B %Y")
 | 
					    published_at.strftime("%B %Y")
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					@ -215,21 +204,6 @@ class Bulletin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  def update_status
 | 
					 | 
				
			||||||
    if !self.is_pending 
 | 
					 | 
				
			||||||
      if !self.is_checked  
 | 
					 | 
				
			||||||
        # self.is_pending = false
 | 
					 | 
				
			||||||
        self.is_rejected = true
 | 
					 | 
				
			||||||
        #self.is_checked = false
 | 
					 | 
				
			||||||
      elsif self.is_checked
 | 
					 | 
				
			||||||
        # self.is_pending = false
 | 
					 | 
				
			||||||
        self.is_rejected = false
 | 
					 | 
				
			||||||
        #self.is_checked = true
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    return true
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  def update_avliable_language
 | 
					  def update_avliable_language
 | 
				
			||||||
    VALID_LOCALES.each  do |locale|
 | 
					    VALID_LOCALES.each  do |locale|
 | 
				
			||||||
      if (title_translations[locale].blank? rescue true)
 | 
					      if (title_translations[locale].blank? rescue true)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,8 +18,10 @@
 | 
				
			||||||
    <% if @bulletins.blank? and !params[:search_query].blank? %>
 | 
					    <% if @bulletins.blank? and !params[:search_query].blank? %>
 | 
				
			||||||
      <%=render :partial => 'shared/search_not_found'  %>
 | 
					      <%=render :partial => 'shared/search_not_found'  %>
 | 
				
			||||||
      <% elsif  !params[:search_query].blank?  %>
 | 
					      <% elsif  !params[:search_query].blank?  %>
 | 
				
			||||||
        <%= t("search.result_get",:search_word => params[:search_query],:item_num=>@bulletins.count) %>
 | 
					        <%= t("search.result_get",:search_word => params[:search_query],:item_num=>@bulletins.count) unless (@bulletins.count == 30) %>
 | 
				
			||||||
 | 
					        <%= t("search.too_many",:search_word => params[:search_query],:exceed_num=>@bulletins.count) if (@bulletins.count ==30) %>
 | 
				
			||||||
     <% end %>
 | 
					     <% end %>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<% @bulletins.each do |post| %>
 | 
					<% @bulletins.each do |post| %>
 | 
				
			||||||
  <tr>
 | 
					  <tr>
 | 
				
			||||||
	<td><%= (post.bulletin_category.title rescue nil ) if !params[:search_query].blank? %></td>
 | 
						<td><%= (post.bulletin_category.title rescue nil ) if !params[:search_query].blank? %></td>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,11 +10,8 @@ class Panel::News::BackEnd::NewsApprovalsController  < OrbitBackendController
 | 
				
			||||||
  def approve
 | 
					  def approve
 | 
				
			||||||
    notice = ""
 | 
					    notice = ""
 | 
				
			||||||
    @news_bulletin = NewsBulletin.find params[:news_bulletin_id]
 | 
					    @news_bulletin = NewsBulletin.find params[:news_bulletin_id]
 | 
				
			||||||
    
 | 
					    @news_bulletin.proc_check(params[:news_bulletin][:is_checked],params[:news_bulletin][:not_checked_reason])
 | 
				
			||||||
    @news_bulletin.is_checked = params[:news_bulletin][:is_checked]
 | 
					 | 
				
			||||||
    @news_bulletin.not_checked_reason = params[:news_bulletin][:not_checked_reason]
 | 
					 | 
				
			||||||
    @news_bulletin.de_pending
 | 
					    @news_bulletin.de_pending
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
     if @news_bulletin.save
 | 
					     if @news_bulletin.save
 | 
				
			||||||
        notice = t('news_bulletin.approve_bulletin_success')
 | 
					        notice = t('news_bulletin.approve_bulletin_success')
 | 
				
			||||||
     else
 | 
					     else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,6 +148,10 @@ class Panel::News::BackEnd::NewsBulletinsController < OrbitBackendController
 | 
				
			||||||
		@news_bulletin.create_user_id = current_user.id
 | 
							@news_bulletin.create_user_id = current_user.id
 | 
				
			||||||
		@news_bulletin.update_user_id = current_user.id
 | 
							@news_bulletin.update_user_id = current_user.id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(is_manager? || is_admin?)
 | 
				
			||||||
 | 
					              @news_bulletin.de_pending
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		respond_to do |format|
 | 
							respond_to do |format|
 | 
				
			||||||
		  if @news_bulletin.save
 | 
							  if @news_bulletin.save
 | 
				
			||||||
                  expire_page(:controller=>'panel/news/widget/news_bulletins' , :action=>'home_banner')
 | 
					                  expire_page(:controller=>'panel/news/widget/news_bulletins' , :action=>'home_banner')
 | 
				
			||||||
| 
						 | 
					@ -267,6 +271,11 @@ class Panel::News::BackEnd::NewsBulletinsController < OrbitBackendController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  		respond_to do |format|
 | 
					  		respond_to do |format|
 | 
				
			||||||
  		  if @news_bulletin.update_attributes(params[:news_bulletin])
 | 
					  		  if @news_bulletin.update_attributes(params[:news_bulletin])
 | 
				
			||||||
 | 
					                  if(is_manager? || is_admin?)
 | 
				
			||||||
 | 
					                    @news_bulletin.is_checked = true
 | 
				
			||||||
 | 
					                    @news_bulletin.is_rejected = false
 | 
				
			||||||
 | 
					                    @news_bulletin.de_pending!
 | 
				
			||||||
 | 
					                 end
 | 
				
			||||||
                  expire_page(:controller=>'panel/news/widget/news_bulletins' , :action=>'home_banner')
 | 
					                  expire_page(:controller=>'panel/news/widget/news_bulletins' , :action=>'home_banner')
 | 
				
			||||||
  			# format.html { redirect_to(panel_news_back_end_news_bulletin_url(@news_bulletin), :notice => t('news_bulletin.update_news_bulletin_success')) }
 | 
					  			# format.html { redirect_to(panel_news_back_end_news_bulletin_url(@news_bulletin), :notice => t('news_bulletin.update_news_bulletin_success')) }
 | 
				
			||||||
  			format.html { redirect_to(panel_news_back_end_news_bulletins_url, :notice => t('news_bulletin.update_success')) }
 | 
					  			format.html { redirect_to(panel_news_back_end_news_bulletins_url, :notice => t('news_bulletin.update_success')) }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,10 +10,15 @@ class Panel::News::FrontEnd::NewsBulletinsController < OrbitWidgetController
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  def index
 | 
					  def index
 | 
				
			||||||
    if !params[:search_query].blank?
 | 
					    if !params[:search_query].blank?
 | 
				
			||||||
      search_cond =  {:is_checked=>true,:is_hidden=>false,:is_pending=>false,:is_pending=>false}
 | 
					      # search_cond =  {:is_checked=>true,:is_hidden=>false,:is_pending=>false,:is_pending=>false}
 | 
				
			||||||
      search_cond.merge!({:news_bulletin_category_id => "#{params[:category_id]}" }) if  !params[:category_id].blank?
 | 
					      # search_cond.merge!({:news_bulletin_category_id => "#{params[:category_id]}" }) if  !params[:category_id].blank?
 | 
				
			||||||
      search = Redis::Search.query("NewsBulletin", params[:search_query], :conditions =>search_cond,:limit=>NewsBulletin.all.count)
 | 
					      
 | 
				
			||||||
      search_result = search.collect{|t| t["id"]}
 | 
					      @search = NewsBulletin.solr_search do 
 | 
				
			||||||
 | 
					        fulltext params[:search_query]
 | 
				
			||||||
 | 
					        with(:frontend_search,true)
 | 
				
			||||||
 | 
					        #order_by(:average_rating)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      search_result = @search.results.collect{|result| result.id}
 | 
				
			||||||
      @news_bulletins = NewsBulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(10)
 | 
					      @news_bulletins = NewsBulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(10)
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      date_now = Time.now
 | 
					      date_now = Time.now
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ class NewsBulletin
 | 
				
			||||||
  include Mongoid::Document
 | 
					  include Mongoid::Document
 | 
				
			||||||
  include Mongoid::Timestamps
 | 
					  include Mongoid::Timestamps
 | 
				
			||||||
  include Mongoid::MultiParameterAttributes  
 | 
					  include Mongoid::MultiParameterAttributes  
 | 
				
			||||||
  include Redis::Search
 | 
					  include Sunspot::Mongo
 | 
				
			||||||
  include Impressionist::Impressionable
 | 
					  include Impressionist::Impressionable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  BelongsToCategory =  :news_bulletin_category
 | 
					  BelongsToCategory =  :news_bulletin_category
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@ class NewsBulletin
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  validates :title, :at_least_one => true
 | 
					  validates :title, :at_least_one => true
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  before_save :update_status,:update_avliable_language
 | 
					  before_save :update_avliable_language
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  after_save :save_news_bulletin_links
 | 
					  after_save :save_news_bulletin_links
 | 
				
			||||||
  after_save :save_news_bulletin_files
 | 
					  after_save :save_news_bulletin_files
 | 
				
			||||||
| 
						 | 
					@ -91,31 +91,47 @@ class NewsBulletin
 | 
				
			||||||
    "news_bulletin"
 | 
					    "news_bulletin"
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 redis_search_index(:title_field => :s_title,
 | 
					  searchable do
 | 
				
			||||||
                      :alias_field =>  :s_title_en,
 | 
					    text :titles do
 | 
				
			||||||
                     :score_field => :view_count,
 | 
					      title_translations.to_a.collect{|t| t[1]}
 | 
				
			||||||
                     :condition_fields => [:is_checked,:is_hidden,:news_bulletin_category_id,:is_pending],
 | 
					    end
 | 
				
			||||||
                     :ext_fields =>[])
 | 
					    text :texts do
 | 
				
			||||||
 | 
					      text_translations.to_a.collect{|t| Nokogiri::HTML(t[1]).text}
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    integer :view_count
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    boolean :frontend_search do
 | 
				
			||||||
 | 
					      ( !is_hidden &&  !is_pending && is_checked && !is_rejected )
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    string :news_bulletin_category_id
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					 # redis_search_index(:title_field => :s_title,
 | 
				
			||||||
 | 
					 #                      :alias_field =>  :s_title_en,
 | 
				
			||||||
 | 
					 #                     :score_field => :view_count,
 | 
				
			||||||
 | 
					 #                     :condition_fields => [:is_checked,:is_hidden,:news_bulletin_category_id,:is_pending],
 | 
				
			||||||
 | 
					 #                     :ext_fields =>[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  def gen_title_for_search
 | 
					#  def gen_title_for_search
 | 
				
			||||||
#   # [s_title,s_title_en,s_text_en,s_text_zh_tw].join(' ')
 | 
					#   # [s_title,s_title_en,s_text_en,s_text_zh_tw].join(' ')
 | 
				
			||||||
# end
 | 
					# end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def s_title
 | 
					 #  def s_title
 | 
				
			||||||
   self.title_translations["zh_tw"]
 | 
					 #   self.
 | 
				
			||||||
  end
 | 
					 #  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 def s_title_was
 | 
					 # def s_title_was
 | 
				
			||||||
   self.title_was["zh_tw"]
 | 
					 #   self.title_was["zh_tw"]
 | 
				
			||||||
 end
 | 
					 # end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def s_title_en
 | 
					 #  def s_title_en
 | 
				
			||||||
   self.title_translations["en"]
 | 
					 #   self.title_translations["en"]
 | 
				
			||||||
  end
 | 
					 #  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 def s_title_en_was
 | 
					 # def s_title_en_was
 | 
				
			||||||
   self.title_was["en"]
 | 
					 #   self.title_was["en"]
 | 
				
			||||||
  end
 | 
					 #  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 # def s_text_en
 | 
					 # def s_text_en
 | 
				
			||||||
 #  Nokogiri::HTML(self.text.en).text
 | 
					 #  Nokogiri::HTML(self.text.en).text
 | 
				
			||||||
| 
						 | 
					@ -140,10 +156,25 @@ class NewsBulletin
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def proc_check(check,not_pass_info = "")
 | 
				
			||||||
 | 
					    self.is_checked = true
 | 
				
			||||||
 | 
					      if check =="true"
 | 
				
			||||||
 | 
					        self.is_rejected = false
 | 
				
			||||||
 | 
					      elsif check == "false"
 | 
				
			||||||
 | 
					        self.is_rejected = true
 | 
				
			||||||
 | 
					        self.not_checked_reason = not_pass_info
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def de_pending
 | 
					  def de_pending
 | 
				
			||||||
    self.is_pending = false
 | 
					    self.is_pending = false
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def de_pending!
 | 
				
			||||||
 | 
					    de_pending
 | 
				
			||||||
 | 
					    self.save!
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def is_expired?
 | 
					  def is_expired?
 | 
				
			||||||
    Date.today > self.deadline ? true : false  rescue false
 | 
					    Date.today > self.deadline ? true : false  rescue false
 | 
				
			||||||
    #some dates might sat as nil so rescue false
 | 
					    #some dates might sat as nil so rescue false
 | 
				
			||||||
| 
						 | 
					@ -213,19 +244,4 @@ class NewsBulletin
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def update_status
 | 
					 | 
				
			||||||
    if !self.is_pending 
 | 
					 | 
				
			||||||
      if !self.is_checked  
 | 
					 | 
				
			||||||
        # self.is_pending = false
 | 
					 | 
				
			||||||
        self.is_rejected = true
 | 
					 | 
				
			||||||
        #self.is_checked = false
 | 
					 | 
				
			||||||
      elsif self.is_checked
 | 
					 | 
				
			||||||
        # self.is_pending = false
 | 
					 | 
				
			||||||
        self.is_rejected = false
 | 
					 | 
				
			||||||
        #self.is_checked = true
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    return true
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,8 @@
 | 
				
			||||||
	   <% if @news_bulletins.blank? and !params[:search_query].blank? %>
 | 
						   <% if @news_bulletins.blank? and !params[:search_query].blank? %>
 | 
				
			||||||
	   	<%=render :partial => 'shared/search_not_found'  %>
 | 
						   	<%=render :partial => 'shared/search_not_found'  %>
 | 
				
			||||||
	   <% elsif  !params[:search_query].blank?  %>
 | 
						   <% elsif  !params[:search_query].blank?  %>
 | 
				
			||||||
        	<%= t("search.result_get",:search_word => params[:search_query],:item_num=>@news_bulletins.count) %>
 | 
					        	<%= t("search.result_get",:search_word => params[:search_query],:item_num=>@news_bulletins.count) unless (@bulletins.count == 30)%>
 | 
				
			||||||
 | 
					        	<%= t("search.too_many",:search_word => params[:search_query],:exceed_num=>@bulletins.count) if (@bulletins.count ==30) %>
 | 
				
			||||||
	   <% end %>
 | 
						   <% end %>
 | 
				
			||||||
<table class="table table-bordered">
 | 
					<table class="table table-bordered">
 | 
				
			||||||
	<tbody>
 | 
						<tbody>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in New Issue