我有一个模型,它部署一个延迟的作业,更新它的一些属性.该模型被宣布为"可搜索"......
searchable do
text :content, :stored => true
end
Run Code Online (Sandbox Code Playgroud)
...我认为在保存后会重新索引.在测试中,似乎并非如此.如果我运行:rake sunspot:reindex
,那么一切都按预期工作.可能导致此问题的原因是什么?
假设我想在我的应用中搜索事件.当我显示结果时,我想显示例如创建事件的人.
有没有办法在.includes(:user)
某处添加,以避免不必要的查询(每个事件一个)?我在文档中找不到它.我应该用事件索引用户名吗?但我必须保持用户信息最新...
谢谢
ruby-on-rails sunspot model-associations ruby-on-rails-3 sunspot-rails
如果我错了,请告诉我,但我认为solr只需要schema.xml中已经提到过的字段.所以,如果我有一个名为'title'的字段,我需要在模式中提到它.
在Sunspot的文档中没有提到修改schema.xml.我只是想知道Sunspot如何修改schema.xml,允许自定义字段输入索引.
我也知道Sunspot使用RSolr来做事情.因此,如果有办法修改架构并使用RSolr将数据从DB重新加载到Solr,请告诉我.
我有一个带有searchable
块的模型,如下所示:
class Contact < ActiveRecord::Base
searchable do
text :contact_name, :company_name, :contact_email
end
end
Run Code Online (Sandbox Code Playgroud)
在控制器的index
操作中,我正在调用Contact.new
,它在页面上给出了一条错误消息,该消息当前正在我们的临时服务器上运行:
未定义的方法`searchable'用于#<Class:0xce0bf80>
堆栈跟踪searchable
通过Contact.new
控制器中的线指向模型中的块.
当我在本地(网页或控制台)或通过Staging服务器上的控制台运行代码时,此错误不会出现 - 仅在Staging网页上.
Solr服务在Staging服务器上正常运行,并且数据已成功编制索引.关于为什么它不在舞台上打球的任何理论都将被接受.
编辑
在回答Nick的问题时,Gemfile只有Sunspot的这一行: gem 'sunspot_rails'
对于Gemfile.lock,这些是我能看到的包含Sunspot或Solr引用的所有行:
GEM
rsolr (0.12.1)
builder (>= 2.1.2)
sunspot (1.2.1)
escape (= 0.0.4)
pr_geohash (~> 1.0)
rsolr (= 0.12.1)
sunspot_rails (1.2.1)
nokogiri
sunspot (= 1.2.1)
DEPENDENCIES
sunspot_rails
Run Code Online (Sandbox Code Playgroud) 使用Passenger,Capistrano,nginx和MySQL将我的rails 3.0.10应用程序部署到Ubuntu 10.04服务器时遇到了很多麻烦(而apache2则更麻烦).将rake降级到0.8.7之后它终于正常工作,但现在Sunspot/Solr在我的开发环境中不起作用.sunspot_solr服务器正在运行,我可以获取服务器的URL,并通过浏览器连接到它.该网址与sunspot.yml中的网址相同.我不知道我做了什么导致了这个问题.我之前遇到过与太阳黑子相同的问题(在降级rake之前).然后它突然又开始工作了.我不知道为什么......我试过两个版本的太阳黑子(1.2.1和1.3.0).两者都提前工作,但现在不再工作了.
这是我收到的错误消息:
SocketError (getaddrinfo: Name or service not known):
app/models/resource.rb:128:in `text_search'
app/controllers/search_controller.rb:21:in `index'
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (161.6ms)
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (168.9ms)
Run Code Online (Sandbox Code Playgroud)
控制器有点乱,所以我只包括相关部分:
@criterion = params[:criterion]
@sort_direction = params[:sort_direction]
if @criterion && @sort_direction
session["sort_search"] = @criterion + "|" + @sort_direction
elsif session["sort_search"]
@criterion = session["sort_search"].split("|")[0]
@sort_direction = session["sort_search"].split("|")[1]
else
@criterion = "updated_at"
@sort_direction = "desc"
end
@search = Resource.text_search(session[:search_params] || "", current_user, @criterion, @sort_direction)
@resources = @search.results
Run Code Online (Sandbox Code Playgroud)
我没有更改控制器中的任何内容,因为它正在工作.
我的gemfile:
source 'http://rubygems.org'
gem 'rake'
gem 'rails', '3.0.10' …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过强大的Sunspot gem for Rails实现全站搜索.这包括一次搜索多个非常不同的模型.我想要做的是使用分面功能允许用户在每个模型上过滤他们的搜索结果,或者默认查看同一页面上的所有内容,并通过:boost限定符排序.将来自Sunspot Railscast的分面代码与来自另一个Stackoverflow问题的多个模型搜索代码(来自Sunspot文档的"多种类型"代码的变体)结合起来,给了我一个我认为可行的解决方案,但却没有.
多方法搜索成功,但小平面总是变为空.我的基本方法是在每个模型上使用相同的名称提供虚拟属性:search_class,这只是模型的类名称呈现为字符串.然后我尝试将其用作一个方面.但是,在视图逻辑中,facet(@ search.facet(:search_class).rows)的结果始终是一个空数组,包括@ search.results在同一查询中返回许多不同的模型,尽管每个返回的实例都有一个完全可访问的Instance.search_class属性.
我正在使用Rails 3.1.0和sunspot-rails 1.2.1.
我该怎么做才能使这个分面代码有效?
控制器:
#searches_controller.rb
class SearchesController < ApplicationController
def show
@search = search(params[:q])
@results = @search.results
end
protected
def search(q)
Sunspot.search Foo, Bar, CarlSagan do
keywords q
#provide faceting for "search class", a field representing a pretty version of the model name
facet(:search_class)
with(:search_class, params[:class]) if params[:class].present?
paginate(:page => params[:page], :per_page => 30)
end
end
end
Run Code Online (Sandbox Code Playgroud)
楷模:
#Foo.rb
class Foo < ActiveRecord::Base
searchable do …
Run Code Online (Sandbox Code Playgroud) 我的mysql数据库中有数百万条记录.我在Rails 3中为iPhone应用程序实现了一个普通的REST api,但是SAYT功能响应非常慢.搜索数据库并返回结果需要花费大量时间.如何提高性能?
我索引了我的桌子.我应该将所有方面看作是MySQL调优,还是应该使用rails sphinx或sunspot?这会有所帮助请帮助我提供所有专业建议.
我正在将我的应用程序升级到Rails 4,现在得到了我的rails服务器,以及太阳黑子solr,经过大量的修补,运行后,我可以访问Solr管理页面.但是,当我尝试从我的rails开发应用程序访问solr进行搜索或索引时,我收到以下错误
RSolr::Error::Http (RSolr::Error::Http - 404 Not Found
Error: Not Found
Request Data: "fq=type%3AMatch&fq=date_in_utc_d%3A%7B2013%5C-11%5C-29T21%5C%3A00%5C%3A00Z+TO+%2A%7D&fq=approval__s%3AAPPROVED&sort=date_d+asc&q=london&fl=%2A+score&qf=caption_text%5E10+city_name_text%5E10+team_name_text%5E10+&defType=edismax&start=0&rows=30"
Backtrace: /Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/rsolr-1.0.9/lib/rsolr/client.rb:268:in `adapt_response'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/rsolr-1.0.9/lib/rsolr/client.rb:175:in `execute'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/rsolr-1.0.9/lib/rsolr/client.rb:161:in `send_and_receive'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/sunspot_rails-2.1.0/lib/sunspot/rails/solr_instrumentation.rb:16:in `block in send_and_receive_with_as_instrumentation'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/activesupport-4.0.1/lib/active_support/notifications.rb:159:in `block in instrument'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/activesupport-4.0.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/activesupport-4.0.1/lib/active_support/notifications.rb:159:in `instrument'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/sunspot_rails-2.1.0/lib/sunspot/rails/solr_instrumentation.rb:15:in `send_and_receive_with_as_instrumentation'
(eval):2:in `post'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/sunspot-2.1.0/lib/sunspot/search/abstract_search.rb:45:in `execute'
/Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/sunspot-2.1.0/lib/sunspot/session.rb:59:in `search'):
<a href="txmt://open?url=file:///Users/bashar/rails-projects/myapp/app/models/match.rb&line=474&column=1">app/models/match.rb:474:in `upcoming_games'</a>
<a href="txmt://open?url=file:///Users/bashar/rails-projects/myapp/app/controllers/tickets_controller.rb&line=34&column=1">app/controllers/tickets_controller.rb:34:in `search'</a>
Rendered /Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.4ms)
Rendered /Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)
Rendered /Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
Rendered /Users/bashar/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (17.3ms)
Run Code Online (Sandbox Code Playgroud)
这是sunspot.yml文件.
production:
solr:
hostname: ENV['WEBSOLR_URL']
port: 80
log_level: WARNING
path: /solr/production
# read_timeout: 2
# open_timeout: 0.5 …
Run Code Online (Sandbox Code Playgroud) ruby-on-rails sunspot sunspot-rails sunspot-solr ruby-on-rails-4
我们在最近的项目中使用太阳黑子进行搜索.我们还使用设计并将我们的用户模型编入索引,如下所示:
searchable do
text :fname
text :lname
text :email
text :description
text :twitter_username
end
Run Code Online (Sandbox Code Playgroud)
使用此设置,除非solr正在运行,否则用户甚至无法登录.这意味着在每次保存User模型时,都会与我们的solr服务器进行一些通信(重建索引?),即使可搜索的字段都没有更改.它是否正确?
我们还有许多其他模型被太阳黑子索引,这些模型具有经常更新的非可搜索字段.似乎太阳黑子在所有这些更新上重新索引它们.
当可搜索字段发生变化时,是否有办法将太阳黑子配置为仅与solr接口?
我在我的rails应用程序中使用solr via sunspot,我需要返回超过30条默认设置的记录.我可以在Sunspot solr中说到这一点, 但我不希望对数据进行分页.我想在一个页面中显示所有数据而不管行数.提供硬编码值也不是我正在寻找的可能解决方案.