Class: ThinkingSphinx::Configuration
- Inherits:
-
Object
- Object
- ThinkingSphinx::Configuration
- Includes:
- Singleton
- Defined in:
- lib/thinking_sphinx/configuration.rb
Overview
This class both keeps track of the configuration settings for Sphinx and also generates the resulting file for Sphinx to use.
Here are the default settings, relative to RAILS_ROOT where relevant:
- config file
-
config/#Configuration.environment.sphinx.conf
- searchd log file
-
log/searchd.log
- query log file
-
log/searchd.query.log
- pid file
-
log/searchd.#Configuration.environment.pid
- searchd files
-
db/sphinx/#Configuration.environment/
- address
-
127.0.0.1
- port
-
3312
- allow star
-
false
- min prefix length
-
1
- min infix length
-
1
- mem limit
-
64M
- max matches
-
1000
- morphology
-
stem_en
- charset type
-
utf-8
- charset table
-
nil
- ignore chars
-
nil
- html strip
-
false
- html remove elements
-
”
If you want to change these settings, create a YAML file at config/sphinx.yml with settings for each environment, in a similar fashion to database.yml - using the following keys: config_file, searchd_log_file, query_log_file, pid_file, searchd_file_path, port, allow_star, enable_star, min_prefix_len, min_infix_len, mem_limit, max_matches, # morphology, charset_type, charset_table, ignore_chars, html_strip, # html_remove_elements. I think you’ve got the idea.
Each setting in the YAML file is optional - so only put in the ones you want to change.
Keep in mind, if for some particular reason you’re using a version of Sphinx older than 0.9.8 r871 (that’s prior to the proper 0.9.8 release), don’t set allow_star to true.
Constant Summary collapse
- SourceOptions =
%w( mysql_connect_flags sql_range_step sql_query_pre sql_query_post sql_ranged_throttle sql_query_post_index )
- IndexOptions =
%w( charset_table charset_type docinfo enable_star exceptions html_index_attrs html_remove_elements html_strip ignore_chars min_infix_len min_prefix_len min_word_len mlock morphology ngram_chars ngram_len phrase_boundary phrase_boundary_step preopen stopwords wordforms )
- IndexerOptions =
%w( max_iops max_iosize mem_limit )
- SearchdOptions =
%w( read_timeout max_children max_matches seamless_rotate preopen_indexes unlink_old )
Instance Attribute Summary collapse
-
#address ⇒ Object
Returns the value of attribute address.
-
#allow_star ⇒ Object
Returns the value of attribute allow_star.
-
#app_root ⇒ Object
Returns the value of attribute app_root.
-
#bin_path ⇒ Object
Returns the value of attribute bin_path.
-
#config_file ⇒ Object
Returns the value of attribute config_file.
-
#database_yml_file ⇒ Object
Returns the value of attribute database_yml_file.
-
#environment ⇒ Object
readonly
Returns the value of attribute environment.
-
#index_options ⇒ Object
Returns the value of attribute index_options.
-
#indexer_options ⇒ Object
Returns the value of attribute indexer_options.
-
#pid_file ⇒ Object
Returns the value of attribute pid_file.
-
#port ⇒ Object
Returns the value of attribute port.
-
#query_log_file ⇒ Object
Returns the value of attribute query_log_file.
-
#searchd_file_path ⇒ Object
Returns the value of attribute searchd_file_path.
-
#searchd_log_file ⇒ Object
Returns the value of attribute searchd_log_file.
-
#searchd_options ⇒ Object
Returns the value of attribute searchd_options.
-
#source_options ⇒ Object
Returns the value of attribute source_options.
Class Method Summary collapse
Instance Method Summary collapse
-
#build(file_path = nil) ⇒ Object
Generate the config file for Sphinx by using all the settings defined and looping through all the models with indexes to build the relevant indexer and searchd configuration, and sources and indexes details.
- #hash_to_config(hash) ⇒ Object
-
#initialize(app_root = Dir.pwd) ⇒ Configuration
constructor
Load in the configuration settings - this will look for config/sphinx.yml and parse it according to the current environment.
-
#load_models ⇒ Object
Make sure all models are loaded - without reloading any that ActiveRecord::Base is already aware of (otherwise we start to hit some messy dependencies issues).
- #reset ⇒ Object
Constructor Details
#initialize(app_root = Dir.pwd) ⇒ Configuration
Load in the configuration settings - this will look for config/sphinx.yml and parse it according to the current environment.
73 74 75 |
# File 'lib/thinking_sphinx/configuration.rb', line 73 def initialize(app_root = Dir.pwd) self.reset end |
Instance Attribute Details
#address ⇒ Object
Returns the value of attribute address.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def address @address end |
#allow_star ⇒ Object
Returns the value of attribute allow_star.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def allow_star @allow_star end |
#app_root ⇒ Object
Returns the value of attribute app_root.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def app_root @app_root end |
#bin_path ⇒ Object
Returns the value of attribute bin_path.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def bin_path @bin_path end |
#config_file ⇒ Object
Returns the value of attribute config_file.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def config_file @config_file end |
#database_yml_file ⇒ Object
Returns the value of attribute database_yml_file.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def database_yml_file @database_yml_file end |
#environment ⇒ Object (readonly)
Returns the value of attribute environment.
68 69 70 |
# File 'lib/thinking_sphinx/configuration.rb', line 68 def environment @environment end |
#index_options ⇒ Object
Returns the value of attribute index_options.
65 66 67 |
# File 'lib/thinking_sphinx/configuration.rb', line 65 def @index_options end |
#indexer_options ⇒ Object
Returns the value of attribute indexer_options.
65 66 67 |
# File 'lib/thinking_sphinx/configuration.rb', line 65 def @indexer_options end |
#pid_file ⇒ Object
Returns the value of attribute pid_file.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def pid_file @pid_file end |
#port ⇒ Object
Returns the value of attribute port.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def port @port end |
#query_log_file ⇒ Object
Returns the value of attribute query_log_file.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def query_log_file @query_log_file end |
#searchd_file_path ⇒ Object
Returns the value of attribute searchd_file_path.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def searchd_file_path @searchd_file_path end |
#searchd_log_file ⇒ Object
Returns the value of attribute searchd_log_file.
61 62 63 |
# File 'lib/thinking_sphinx/configuration.rb', line 61 def searchd_log_file @searchd_log_file end |
#searchd_options ⇒ Object
Returns the value of attribute searchd_options.
65 66 67 |
# File 'lib/thinking_sphinx/configuration.rb', line 65 def @searchd_options end |
#source_options ⇒ Object
Returns the value of attribute source_options.
65 66 67 |
# File 'lib/thinking_sphinx/configuration.rb', line 65 def @source_options end |
Class Method Details
.environment ⇒ Object
106 107 108 109 110 |
# File 'lib/thinking_sphinx/configuration.rb', line 106 def self.environment @@environment ||= ( defined?(Merb) ? Merb.environment : ENV['RAILS_ENV'] ) || "development" end |
.options_merge(base, extra) ⇒ Object
217 218 219 220 221 222 223 224 |
# File 'lib/thinking_sphinx/configuration.rb', line 217 def self.(base, extra) base = base.clone extra.each do |key, value| next if value.nil? || value == "" base[key] = value end base end |
Instance Method Details
#build(file_path = nil) ⇒ Object
Generate the config file for Sphinx by using all the settings defined and looping through all the models with indexes to build the relevant indexer and searchd configuration, and sources and indexes details.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'lib/thinking_sphinx/configuration.rb', line 120 def build(file_path=nil) load_models file_path ||= "#{self.config_file}" database_confs = YAML::load(ERB.new(IO.read("#{self.database_yml_file}")).result) database_confs.symbolize_keys! database_conf = database_confs[environment.to_sym] database_conf.symbolize_keys! open(file_path, "w") do |file| file.write <<-CONFIG indexer { #{hash_to_config(self.)} } searchd { address = #{self.address} port = #{self.port} log = #{self.searchd_log_file} query_log = #{self.query_log_file} pid_file = #{self.pid_file} #{hash_to_config(self.)} } CONFIG ThinkingSphinx.indexed_models.each_with_index do |model, model_index| model = model.constantize sources = [] delta_sources = [] prefixed_fields = [] infixed_fields = [] model.sphinx_indexes.select { |index| index.model == model }.each_with_index do |index, i| file.write index.to_config(model, i, database_conf, model_index) index.adapter_object.setup sources << "#{ThinkingSphinx::Index.name(model)}_#{i}_core" delta_sources << "#{ThinkingSphinx::Index.name(model)}_#{i}_delta" if index.delta? end next if sources.empty? source_list = sources.collect { |s| "source = #{s}" }.join("\n") delta_list = delta_sources.collect { |s| "source = #{s}" }.join("\n") file.write core_index_for_model(model, source_list) unless delta_list.blank? file.write delta_index_for_model(model, delta_list) end file.write distributed_index_for_model(model) end end end |
#hash_to_config(hash) ⇒ Object
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/thinking_sphinx/configuration.rb', line 201 def hash_to_config(hash) hash.collect { |key, value| translated_value = case value when TrueClass "1" when FalseClass "0" when NilClass, "" next else value end " #{key} = #{translated_value}" }.join("\n") end |
#load_models ⇒ Object
Make sure all models are loaded - without reloading any that ActiveRecord::Base is already aware of (otherwise we start to hit some messy dependencies issues).
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/thinking_sphinx/configuration.rb', line 181 def load_models base = "#{app_root}/app/models/" Dir["#{base}**/*.rb"].each do |file| model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1') next if model_name.nil? next if ::ActiveRecord::Base.send(:subclasses).detect { |model| model.name == model_name } begin model_name.camelize.constantize rescue LoadError model_name.gsub!(/.*[\/\\]/, '').nil? ? next : retry rescue NameError next end end end |
#reset ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/thinking_sphinx/configuration.rb', line 77 def reset self.app_root = RAILS_ROOT if defined?(RAILS_ROOT) self.app_root = Merb.root if defined?(Merb) self.app_root ||= app_root self.database_yml_file = "#{self.app_root}/config/database.yml" self.config_file = "#{self.app_root}/config/#{environment}.sphinx.conf" self.searchd_log_file = "#{self.app_root}/log/searchd.log" self.query_log_file = "#{self.app_root}/log/searchd.query.log" self.pid_file = "#{self.app_root}/log/searchd.#{environment}.pid" self.searchd_file_path = "#{self.app_root}/db/sphinx/#{environment}" self.address = "127.0.0.1" self.port = 3312 self.allow_star = false self.bin_path = "" self. = {} self. = { :charset_type => "utf-8", :morphology => "stem_en" } self. = {} self. = {} parse_config self end |