求大神指导!!
我的环境:
听说过 solr, sphinx, sunspot, elasticsearch 等等。。
他们的关系是什么?怎么用?
而且好像上面都是要用到 Java 的?
推荐 sunspot,是目前最好的 Rails 上的 search/full-text-search 解决方案了 http://railscasts.com/episodes/278-search-with-sunspot sunspot 是对 Solr 的 ruby 封装,而 sphinx 和 elasticsearch 是另外两个其他解决方案。
@Rei @huacnlee @lgn21st @visionwang @aNdReW_Qx
就我目前的了解,似乎有两种常见的方式:
(搜索引擎 -> 搜索服务器 -> 搜索服务器的客户端封装 -> 客户端)
这两种方法似乎是:Solr 擅长建立好索引以后的简单的搜索,速度很快;但是在有频繁修改索引的情况下 Solr 表现很差。而 ES 在一般搜索时稍慢于 Solr,但在频繁修改索引的情况下 ES 要强于 Solr 很多。也就是之前有人提到过的实时性问题。
另外,这两种方法都是基于 Lucene 的,而 Lucene 是 Java 的,建立索引的性能上相比 C++ 的 Sphinx 差很多,搜索的性能也差一些。但是在数据量不是特别大的时候应该这种优势不明显。
如果想用 Sphinx 的话,能不能自己在 Rails 上写点东西作为 Sphinx 的 xmlpipe 的 source,从而把 Sphinx 和 Rails, MongoDB 结合起来?这种层面的结合会不会有性能问题?
不知道我以上的理解有没有什么问题?
Sphinx 之前我研究过,和 MongoDB 整合主要的问题是 Sphinx 目前版本不支持字符型的主键,所以 MongoDb 的 ObjectId 就搞不了。 据我的使用感觉,Sphinx 相比 Solr 和 Eladticsearch 是最快的。
增加 find_in_batches 的方法
def find_in_batches(opts = {})
batch_size = opts[:batch_size] || 1000
start = opts.delete(:start).to_i || 0
objects = self.limit(batch_size).skip(start)
t = Time.new
while objects.any?
yield objects
start += batch_size
# Rails.logger.debug("processed #{start} records in #{Time.new - t} seconds") if Rails.logger.debug?
break if objects.size < batch_size
objects = self.limit(batch_size).skip(start)
end
end
增加 tire.rake 的任务
# coding: utf-8
require 'benchmark'
namespace :tire do
desc 'Create Tire Index'
task :create_settings => :environment do
if Tire.index('movies').create Movie.settings
puts Tire.index('movies').settings
else
"false"
end
end
desc 'Destroy Tire Index'
task :drop_settings => :environment do
puts Tire.index('movies').delete
end
desc 'Regenerate Tire Index for all models'
task :update_index => :environment do
Movie.find_in_batches(:batch_size => 1000) do |movies|
movies.each do |movie|
movie.update_index
puts "#{movie.id} [Indexed]"
movie = nil
end
movies = nil
end
end
end
我们现在是用 sunsport, 点击结果加权,以及人工调整来改善结果。比较费力,也不能应付大规模。 有没有什么可以配置更多功能的搜索代码 比如多个标签如果搜索一个 其他也命中。语义库,展现但没点击的降权 这一类功能