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 'ruby-debug19' | ||||
| gem 'rubyzip' | ||||
| 
 | ||||
| gem 'sunspot_mongo' | ||||
| gem 'sunspot_solr' | ||||
| gem 'progress_bar' | ||||
| 
 | ||||
| gem 'sinatra' | ||||
| gem 'sprockets' | ||||
| gem 'tinymce-rails' | ||||
|  |  | |||
							
								
								
									
										13
									
								
								Gemfile.lock
								
								
								
								
							
							
						
						
									
										13
									
								
								Gemfile.lock
								
								
								
								
							|  | @ -97,7 +97,9 @@ GEM | |||
|       factory_girl (~> 2.6.0) | ||||
|       railties (>= 3.0.0) | ||||
|     fastercsv (1.5.4) | ||||
|     fattr (2.2.1) | ||||
|     haml (3.1.4) | ||||
|     highline (1.6.13) | ||||
|     hike (1.2.1) | ||||
|     hoe (2.16.1) | ||||
|       rake (~> 0.8) | ||||
|  | @ -136,12 +138,17 @@ GEM | |||
|     net-ldap (0.3.1) | ||||
|     nokogiri (1.5.2) | ||||
|     nokogiri (1.5.2-x86-mingw32) | ||||
|     options (2.3.0) | ||||
|       fattr | ||||
|     orm_adapter (0.0.6) | ||||
|     pdf-writer (1.1.8) | ||||
|       color (>= 1.4.0) | ||||
|       transaction-simple (~> 1.3) | ||||
|     polyglot (0.3.3) | ||||
|     pr_geohash (1.0.0) | ||||
|     progress_bar (0.4.0) | ||||
|       highline (~> 1.6.1) | ||||
|       options (~> 2.3.0) | ||||
|     rack (1.3.6) | ||||
|     rack-cache (1.2) | ||||
|       rack (>= 0.4) | ||||
|  | @ -256,9 +263,12 @@ GEM | |||
|       rsolr (~> 1.0.7) | ||||
|     sunspot-rails-tester (0.0.4) | ||||
|       sunspot_rails (~> 1.2) | ||||
|     sunspot_mongo (1.0.1) | ||||
|       sunspot_rails | ||||
|     sunspot_rails (1.3.3) | ||||
|       nokogiri | ||||
|       sunspot (= 1.3.3) | ||||
|     sunspot_solr (1.3.3) | ||||
|     thor (0.14.6) | ||||
|     tilt (1.3.3) | ||||
|     tinymce-rails (3.4.8) | ||||
|  | @ -314,6 +324,7 @@ DEPENDENCIES | |||
|   mysql2 | ||||
|   net-ldap (~> 0.3.1) | ||||
|   nokogiri | ||||
|   progress_bar | ||||
|   radius | ||||
|   rails (>= 3.1.0, < 3.2.0) | ||||
|   rake | ||||
|  | @ -335,6 +346,8 @@ DEPENDENCIES | |||
|   spork | ||||
|   sprockets | ||||
|   sunspot-rails-tester | ||||
|   sunspot_mongo | ||||
|   sunspot_solr | ||||
|   tinymce-rails | ||||
|   uglifier | ||||
|   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 | ||||
|     site_setting_help: Please Enter the search argument for Google search. | ||||
|     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: "全站搜尋" | ||||
|     sitesearch: Google Site Search | ||||
|     site_setting_help: 請輸入送交Google搜尋的參數 | ||||
|     result_get: "搜尋標題有關 ' %{search_word} ' 共搜尋到%{item_num}筆資料" | ||||
|     result_get: "搜尋有關 ' %{search_word} ' 共搜尋到%{item_num}筆資料" | ||||
|     too_many: "搜尋有關 ' %{search_word} ' 尋找到超過 %{exceed_num} 筆資料,請嘗試加入更多關鍵字縮小搜尋範圍,以作更精確的搜尋" | ||||
| 
 | ||||
|   activerecord: | ||||
|     errors: | ||||
|       template: # ~ 2.3.5 backward compatible | ||||
|  |  | |||
|  | @ -7,11 +7,11 @@ production: | |||
| development: | ||||
|   solr: | ||||
|     hostname: localhost | ||||
|     port: 8983 | ||||
|     port: 8982 | ||||
|     log_level: INFO | ||||
| 
 | ||||
| test: | ||||
|   solr: | ||||
|     hostname: localhost | ||||
|     port: 8983 | ||||
|     port: 8981 | ||||
|     log_level: WARNING | ||||
|  | @ -6,9 +6,22 @@ namespace :matt_dev do | |||
|     p a | ||||
|     a= Redis::Search.query("NewsBulletin",'社科院',:conditions =>{:is_checked=>true,:is_hidden=>false}) | ||||
|     p a | ||||
|     # p Pinyin.t('台灣不是中國的一部分') | ||||
|   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 | ||||
|   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 | ||||
|   sub_role = nil | ||||
|   test_account_ldap_id ='139716' | ||||
|  MiddleSiteConnection.establish | ||||
|  #MiddleSiteConnection.establish | ||||
|    | ||||
|   task :sync => :environment do | ||||
|     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 | ||||
|     notice = "" | ||||
|     @bulletin = Bulletin.find params[:bulletin_id] | ||||
|      | ||||
|     @bulletin.is_checked = params[:bulletin][:is_checked] | ||||
|     @bulletin.not_checked_reason = params[:bulletin][:not_checked_reason] | ||||
|     @bulletin.proc_check(params[:bulletin][:is_checked],params[:bulletin][:not_checked_reason]) | ||||
|     @bulletin.de_pending | ||||
|   | ||||
|      if @bulletin.save | ||||
|         notice = t('bulletin.approve_bulletin_success') | ||||
|      else | ||||
|  |  | |||
|  | @ -14,8 +14,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   def index | ||||
|     # @bulletins = Bulletin.all | ||||
|     # @bulletins = Bulletin.desc("postdate desc") | ||||
| 	  get_categorys('BulletinCategory',params[:bulletin_category_id]) | ||||
| 	  get_tags | ||||
|     get_categorys('BulletinCategory',params[:bulletin_category_id]) | ||||
|     get_tags | ||||
| 
 | ||||
|     @filter = params[:filter] | ||||
|     new_filter = params[:new_filter] | ||||
|  | @ -34,12 +34,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|       @filter = {new_filter[:type] => [new_filter[:id].to_s]} | ||||
|     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_category_ids = @bulletin_categories.collect{|t| t.id.to_s} + [nil] | ||||
| 
 | ||||
|  | @ -62,16 +56,7 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   # GET /bulletins/1.xml | ||||
|   def show | ||||
|     @bulletin = Bulletin.find(params[:id]) | ||||
| 	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 | ||||
|     get_tags | ||||
| 
 | ||||
|     respond_to do |format| | ||||
|       format.html # show.html.erb | ||||
|  | @ -84,13 +69,9 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   def new | ||||
|     @bulletin = Bulletin.new(:postdate => DateTime.now) | ||||
| 	 | ||||
| 	@link_url = panel_announcement_back_end_bulletins_path | ||||
|      | ||||
| 	# @bulletin.bulletin_files.build | ||||
| 	# @bulletin.bulletin_files.new | ||||
| 
 | ||||
| 	  get_tags | ||||
|       respond_to do |format| | ||||
|     @link_url = panel_announcement_back_end_bulletins_path | ||||
|     get_tags | ||||
|     respond_to do |format| | ||||
|         format.html # new.html.erb | ||||
|         format.xml  { render :xml => @bulletin } | ||||
|   	end | ||||
|  | @ -141,6 +122,9 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
| 		 | ||||
| 		@bulletin.create_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| | ||||
| 		  if @bulletin.save | ||||
|  | @ -158,13 +142,10 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
| 	 | ||||
|   end | ||||
| 
 | ||||
|   def link_quick_add | ||||
| 	# debugger | ||||
|      | ||||
|   def link_quick_add     | ||||
|     @bulletin_link = BulletinLink.new | ||||
| 	@link_url = panel_announcement_back_end_bulletins_path | ||||
| 	 | ||||
| 	@bulletin_link.bulletin_id = params[:bulletin_id] | ||||
|     @link_url = panel_announcement_back_end_bulletins_path | ||||
|     @bulletin_link.bulletin_id = params[:bulletin_id] | ||||
| 	 | ||||
|     respond_to do |format| | ||||
|       format.js | ||||
|  | @ -173,29 +154,17 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   end | ||||
| 
 | ||||
|   def link_quick_edit | ||||
| 	# debugger | ||||
|     @bulletin_link = BulletinLink.find(params[:bulletin_id]) | ||||
| 	 | ||||
| 	@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) | ||||
| 	 | ||||
|     @link_url = panel_announcement_back_end_bulletin_path(@bulletin_link) | ||||
|     respond_to do |format| | ||||
|       format.js | ||||
|     end | ||||
| 	 | ||||
|   end | ||||
| 
 | ||||
|   def file_quick_add | ||||
|     # debugger | ||||
|      | ||||
|   def file_quick_add     | ||||
|     @bulletin_file = BulletinFile.new | ||||
|     @file_url = panel_announcement_back_end_bulletins_path | ||||
| 	 | ||||
|     @bulletin_file.bulletin_id = params[:bulletin_id] | ||||
| 	 | ||||
|     respond_to do |format| | ||||
|       format.js | ||||
|     end | ||||
|  | @ -203,11 +172,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   end | ||||
| 
 | ||||
|   def file_quick_edit | ||||
|     # debugger | ||||
|     @bulletin_file = BulletinFile.find(params[:bulletin_id]) | ||||
| 	 | ||||
|     @file_url = panel_announcement_back_end_bulletin_path(@bulletin_file) | ||||
| 	 | ||||
|     respond_to do |format| | ||||
|       format.js | ||||
|     end | ||||
|  | @ -215,6 +181,7 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
| 
 | ||||
|   # PUT /bulletins/1 | ||||
|   # PUT /bulletins/1.xml | ||||
| 
 | ||||
|   def update | ||||
| 
 | ||||
|   	if params[:bulletin_link] | ||||
|  | @ -248,7 +215,6 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   	else | ||||
|      | ||||
|   		@bulletin = Bulletin.find(params[:id]) | ||||
| 
 | ||||
|   		 | ||||
|   		# @bulletin.image.clear if params[:bulletin][:image_del] == '1' | ||||
|   		# if params[:bulletin][:image_del] == '1'  | ||||
|  | @ -262,6 +228,11 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   		respond_to do |format| | ||||
|              | ||||
|   		  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") | ||||
|                 #   @bulletin.is_rejected = true | ||||
|                 #   @bulletin.save! | ||||
|  | @ -276,8 +247,7 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController | |||
|   			format.js  { render 'toggle_enable' } | ||||
|   			format.xml  { head :ok } | ||||
|   		  else | ||||
|           get_tags | ||||
|            | ||||
|                   get_tags | ||||
|   			format.html { render :action => "edit" } | ||||
|   			format.xml  { render :xml => @bulletin.errors, :status => :unprocessable_entity } | ||||
|   		  end | ||||
|  |  | |||
|  | @ -10,10 +10,14 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController | |||
|    | ||||
|   def index | ||||
|     if  !params[:search_query].blank? | ||||
|       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 = Redis::Search.query("Bulletin", params[:search_query], :conditions =>search_cond,:limit=>Bulletin.all.count) | ||||
|       search_result = search.collect{|t| t["id"]} | ||||
|       # 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 = Bulletin.solr_search do  | ||||
|         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) | ||||
|     else | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ class Bulletin | |||
|   include Mongoid::Document | ||||
|   include Mongoid::Timestamps | ||||
|   include Mongoid::MultiParameterAttributes | ||||
|   include Redis::Search | ||||
|   include Sunspot::Mongo | ||||
|   include Impressionist::Impressionable | ||||
| 
 | ||||
|   BelongsToCategory =  :bulletin_category | ||||
|  | @ -60,60 +60,49 @@ class Bulletin | |||
|    | ||||
|   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_files | ||||
| 
 | ||||
|   redis_search_index(:title_field => :s_title, | ||||
|                       :alias_field =>:s_title_en , | ||||
|                      :score_field => :view_count, | ||||
|                      :condition_fields => [:is_checked,:is_hidden,:bulletin_category_id,:is_pending], | ||||
|                      :ext_fields => []) | ||||
|    | ||||
|   searchable do | ||||
|     text :titles do | ||||
|       title_translations.to_a.collect{|t| t[1]} | ||||
|     end | ||||
|     text :texts do | ||||
|       text_translations.to_a.collect{|t| Nokogiri::HTML(t[1]).text} | ||||
|     end | ||||
|     # text :text do | ||||
|     #   a = (title_translations["zh_tw"] + title_translations["en"]) | ||||
|     #   a | ||||
|     # end | ||||
|     boolean :frontend_search do | ||||
|       ( !is_hidden &&  !is_pending && is_checked && !is_rejected ) | ||||
|     end | ||||
| 
 | ||||
|   #  def gen_title_for_search | ||||
|   #   # [s_title,s_title_en,s_text_en,s_text_zh_tw].join(' ') | ||||
|   # end | ||||
|     integer :view_count | ||||
|     string :bulletin_category_id | ||||
|     end | ||||
| 
 | ||||
|  #alias_method | ||||
| 
 | ||||
|   def s_title | ||||
|    self.title_translations["zh_tw"] | ||||
|   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 s_title_was | ||||
|    self.title_was["zh_tw"] | ||||
|  end | ||||
| 
 | ||||
|   def s_title_en | ||||
|    self.title_translations["en"] | ||||
|   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 | ||||
|     self.is_pending = false | ||||
|   end | ||||
| 
 | ||||
|   def de_pending! | ||||
|     de_pending | ||||
|     self.save! | ||||
|   end | ||||
| 
 | ||||
|   def publish_month | ||||
|     published_at.strftime("%B %Y") | ||||
|   end | ||||
|  | @ -214,21 +203,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 | ||||
|     VALID_LOCALES.each  do |locale| | ||||
|  |  | |||
|  | @ -18,8 +18,10 @@ | |||
|     <% if @bulletins.blank? and !params[:search_query].blank? %> | ||||
|       <%=render :partial => 'shared/search_not_found'  %> | ||||
|       <% 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 %> | ||||
| 
 | ||||
| <% @bulletins.each do |post| %> | ||||
|   <tr> | ||||
| 	<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 | ||||
|     notice = "" | ||||
|     @news_bulletin = NewsBulletin.find params[:news_bulletin_id] | ||||
|      | ||||
|     @news_bulletin.is_checked = params[:news_bulletin][:is_checked] | ||||
|     @news_bulletin.not_checked_reason = params[:news_bulletin][:not_checked_reason] | ||||
|     @news_bulletin.proc_check(params[:news_bulletin][:is_checked],params[:news_bulletin][:not_checked_reason]) | ||||
|     @news_bulletin.de_pending | ||||
|   | ||||
|      if @news_bulletin.save | ||||
|         notice = t('news_bulletin.approve_bulletin_success') | ||||
|      else | ||||
|  |  | |||
|  | @ -148,6 +148,10 @@ class Panel::News::BackEnd::NewsBulletinsController < OrbitBackendController | |||
| 		@news_bulletin.create_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| | ||||
| 		  if @news_bulletin.save | ||||
|                   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| | ||||
|   		  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') | ||||
|   			# 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')) } | ||||
|  |  | |||
|  | @ -10,10 +10,15 @@ class Panel::News::FrontEnd::NewsBulletinsController < OrbitWidgetController | |||
|    | ||||
|   def index | ||||
|     if !params[:search_query].blank? | ||||
|       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 = Redis::Search.query("NewsBulletin", params[:search_query], :conditions =>search_cond,:limit=>NewsBulletin.all.count) | ||||
|       search_result = search.collect{|t| t["id"]} | ||||
|       # 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 = 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) | ||||
|     else | ||||
|       date_now = Time.now | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ class NewsBulletin | |||
|   include Mongoid::Document | ||||
|   include Mongoid::Timestamps | ||||
|   include Mongoid::MultiParameterAttributes   | ||||
|   include Redis::Search | ||||
|   include Sunspot::Mongo | ||||
|   include Impressionist::Impressionable | ||||
| 
 | ||||
|   BelongsToCategory =  :news_bulletin_category | ||||
|  | @ -61,7 +61,7 @@ class NewsBulletin | |||
|    | ||||
|   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_files | ||||
|  | @ -91,31 +91,47 @@ class NewsBulletin | |||
|     "news_bulletin" | ||||
|   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 =>[]) | ||||
|   searchable do | ||||
|     text :titles do | ||||
|       title_translations.to_a.collect{|t| t[1]} | ||||
|     end | ||||
|     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 | ||||
| #   # [s_title,s_title_en,s_text_en,s_text_zh_tw].join(' ') | ||||
| # end | ||||
| 
 | ||||
|   def s_title | ||||
|    self.title_translations["zh_tw"] | ||||
|   end | ||||
|  #  def s_title | ||||
|  #   self. | ||||
|  #  end | ||||
| 
 | ||||
|  def s_title_was | ||||
|    self.title_was["zh_tw"] | ||||
|  end | ||||
|  # def s_title_was | ||||
|  #   self.title_was["zh_tw"] | ||||
|  # end | ||||
| 
 | ||||
|   def s_title_en | ||||
|    self.title_translations["en"] | ||||
|   end | ||||
|  #  def s_title_en | ||||
|  #   self.title_translations["en"] | ||||
|  #  end | ||||
| 
 | ||||
|  def s_title_en_was | ||||
|    self.title_was["en"] | ||||
|   end | ||||
|  # def s_title_en_was | ||||
|  #   self.title_was["en"] | ||||
|  #  end | ||||
| 
 | ||||
|  # def s_text_en | ||||
|  #  Nokogiri::HTML(self.text.en).text | ||||
|  | @ -140,10 +156,25 @@ class NewsBulletin | |||
|     | ||||
|   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 | ||||
|     self.is_pending = false | ||||
|   end | ||||
| 
 | ||||
|   def de_pending! | ||||
|     de_pending | ||||
|     self.save! | ||||
|   end | ||||
| 
 | ||||
|   def is_expired? | ||||
|     Date.today > self.deadline ? true : false  rescue false | ||||
|     #some dates might sat as nil so rescue false | ||||
|  | @ -213,19 +244,4 @@ class NewsBulletin | |||
|     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 | ||||
|  | @ -10,7 +10,8 @@ | |||
| 	   <% if @news_bulletins.blank? and !params[:search_query].blank? %> | ||||
| 	   	<%=render :partial => 'shared/search_not_found'  %> | ||||
| 	   <% 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 %> | ||||
| <table class="table table-bordered"> | ||||
| 	<tbody> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue