换用sphinx后,产品同事发现旧的数据也能搜索出新数据来,查了下官方文档 http://sphinxsearch.com/docs/manual-0.9.9.html#index-merging, 发现更新索引时thinking-sphinx没有把它自定义的sphinx_deleted属性同时更新上去,导致在执行增量索引时用的--merge-dst-range选项无效。现解决方案如下:
1,在config/production.sphinx.conf的searchd部分加上 attr_flush_period = 5 ,让sphinx在更新sphinx_deleted属性后写入到磁盘里。
2,因为sphinx要部署在另外一台独立的机子上,为了方便运维部署和维护,不用安装其他的类似rmagick之类和sphinx无关的软件,就写了一个ruby脚本,用bundler配置安装下gem包,放在cron里定时跑,部分代码如下:
#!/usr/bin/env ruby -rubygems
RAILS_ROOT = File.expand_path(File.dirname(__FILE__)) unless defined?(RAILS_ROOT)
sphinx_config_yml = RAILS_ROOT + '/config/sphinx.yml'
mysql_config_yml = RAILS_ROOT + '/config/database.yml'
production_sphinx_conf = RAILS_ROOT + '/config/production.sphinx.conf'
gem 'rails', '2.3.4'
require 'initializer'
%w[active_record active_support action_view action_controller action_mailer].map {|act| require act}
gem "thinking-sphinx", "1.3.18", :lib => "thinking_sphinx"
%w[yaml riddle thinking_sphinx].map {|lib| require lib}
class Hash
def symbolize_keys
inject({}) do |options, (key, value)|
options[(key.to_sym rescue key) || key] = value
options
end
end
end
sphinx_config = YAML.load_file(sphinx_config_yml)['production'].symbolize_keys
ActiveRecord::Base.establish_connection(YAML.load_file(mysql_config_yml)['production'].symbolize_keys)
class ActiveRecord::Base
def self.has_attached_file(a, b = {}); end
def self.validates_attachment_content_type(a, b = {} ); end
end
files = Dir.glob(RAILS_ROOT + "/app/models/*/*.rb") + Dir.glob(RAILS_ROOT + "/app/models/*/*/*.rb")
model_strs = files.map {|path| path.scan(/app\/models\/(.*)\.rb/)[0][0].split('/').map(&:camelize).join('::') }
model_strs.each do |str|
arr = str.split("::")
arr.size.times do |x|
begin
eval("class #{arr[0..x].join('::')} < ActiveRecord::Base; end")
rescue TypeError
# FIX superclass mismatch for class Data (TypeError)
end
end
end
files.each do |x|
begin
load x
rescue TypeError
end
end
client = Riddle::Client.new(sphinx_config[:address], sphinx_config[:port])
indexes = []
models = ThinkingSphinx.context.indexed_models.each do |str|
prefix = str.split('::').map {|s| s.downcase }.join('_')
indexes << ( index = ["#{prefix}_core", "#{prefix}_delta"] )
attrs = {}
str.constantize.all(:select => "id", :conditions => ["updated_at > ?", Time.now - 3650]).each do |item|
attrs[item.id * 5] = [1]
end
unless attrs.blank?
puts attrs.inspect
puts "Updating #{client.update(index[0], ['sphinx_deleted'], attrs )} docs"
end
end
sleep 10 # 等待写入到磁盘里
# 只允许0出现在最终索引里
system "/usr/local/bin/indexer --rotate --config #{RAILS_ROOT}/config/production.sphinx.conf #{indexes.map {|x| x[1] }.join(' ')}"
sleep 2 # 马上执行以下会导致delta没有更新到main索引里
indexes.each do |index|
system "/usr/local/bin/indexer --rotate --config #{RAILS_ROOT}/config/production.sphinx.conf --merge #{index.join(' ')} --merge-dst-range sphinx_deleted 0 0"
end
分享到:
相关推荐
介绍sphinx实时索引的特点和工作机制
Sphinx是一个高性能、开源的全文搜索引擎,它为SQL数据库提供了强大的全文索引功能。Sphinx与SQL结合使用,可以显著提升大数据量下的检索效率,尤其适用于需要高效搜索的Web应用和信息检索系统。 1. **Sphinx简介**...
Sphinx 是一个高性能全文搜索引擎,尤其适用于需要实时更新索引的应用场景。它的核心特性包括高效、灵活的配置以及对多种数据源的支持。在本篇文章中,我们将深入探讨 Sphinx 的实时索引(Real-Time Indexing)功能...
windows 下 sphinx 增量索引配置文件 mssql
3. **创建索引**:定义Sphinx的索引结构,包括要索引的字段、权重等。 4. **设置实时更新**:配置Sphinx监听MySQL的binlog,或者设置定期同步数据的cron任务。 5. **编写PHP代码**:用PHP编写索引构建脚本和查询接口...
索引旋转是Sphinx在增量索引过程中的一部分,它涉及到将当前正在使用的索引文件(如`news_delta.spa`)重命名为旧版本(`news_delta.old.spa`),并将新构建的索引文件(`news_delta.new.spa`)重命名为当前版本。...
在实际应用中,Sphinx 还支持增量索引和实时更新,这意味着当数据源发生变化时,索引可以只更新新增或修改的部分,而无需重新构建整个索引,从而保持搜索服务的高效性和数据的最新性。例如,"sphinx增量索引的一个...
4. **构建和更新索引**:运行Sphinx命令行工具,对论坛数据进行初次索引,并设置定期自动更新。 5. **集成API**:在Discuz! 后台或插件中调用Sphinx的API,实现搜索功能的接入。 6. **测试和优化**:进行实际搜索...
1. **高速索引**:Sphinx能够快速地处理大量数据进行实时索引。 2. **高效率查询**:查询响应时间通常在毫秒级别,提高了用户体验。 3. **灵活的查询语法**:支持布尔、短语、前缀、范围、邻近等多种查询类型。 4. *...
- **实时更新**:Sphinx支持实时索引,这意味着添加、修改或删除数据后,无需重建整个索引,只需更新相关的部分。 - **排序与过滤**:Sphinx支持基于字段的排序和过滤,可以轻松实现按相关度、时间或其他自定义...
使用Sphinx时,需要注意索引优化,比如合理设置索引字段、控制内存使用、调整索引更新频率等。同时,定期检查和监控Sphinx服务的状态,确保其稳定运行。 总的来说,Java整合Sphinx是一项提升应用搜索功能的关键...
Sphinx是一个非常强大的开源全文搜索引擎,支持全文检索和搜索功能,它由俄罗斯人Andrew Aksyonoff开发,适用于大量的数据索引和高速搜索。全文检索的索引创建是Sphinx的一项核心功能,它能够有效地存储和快速检索...
1. **索引构建速度**:Sphinx在构建索引方面表现更为优秀,特别是在处理大规模数据集时,构建1000万条记录的索引所需时间远低于Lucene。 2. **API接口友好度**:Sphinx提供的API更加简洁易用,支持更多的编程语言,...
2. 实时索引:Sphinx支持实时索引,这意味着当数据源更新时,索引可以迅速更新,无需重新构建整个索引。 3. 高度可配置:Sphinx允许用户自定义搜索算法,调整相关性权重,以满足特定应用场景的需求。 4. 支持多种...
1. **实时索引**:Sphinx支持实时索引,这意味着新的数据可以即时添加到索引中,几乎无需延迟就能进行搜索。 2. **高性能**:Sphinx设计目标就是提供高速的搜索体验。它的索引速度极快,查询性能也非常优秀。 3. *...
Sphinx的核心特性包括实时索引、近实时搜索以及高度可扩展性,使得它在处理大数据量时表现优异。 1. **全文检索**: Sphinx支持对文本进行全文检索,能对文本内容进行分词、建立索引,从而在用户输入查询时提供相关...
2. **实时更新**:Sphinx 具有实时索引能力,这意味着当数据源发生变化时,如新增、删除或修改记录,索引可以立即更新,确保搜索结果的准确性。 3. **高效搜索**:Sphinx 使用倒排索引技术,能快速定位到包含查询...
1. **实时索引**:Sphinx 支持实时索引,这意味着它可以快速地添加、删除或更新索引中的文档,无需重新构建整个索引。 2. **高效搜索**:Sphinx 使用倒排索引技术,能够快速地进行全文搜索,提供毫秒级的搜索响应...
为了实现这一功能,需要在`sphinx.conf`配置文件中明确指定Sphinx的数据源,包括如何读取MySQL中的数据以及哪些表和字段需要被建立索引。例如,可以通过设置来让Sphinx对`cdb_threads`表的`subject`和`author`字段...