我正在使用Sunspot生成很多我的应用程序索引和概述.
在这个应用程序中,我有2个模型,它们具有父/子一对多的关系.使用太阳黑子我索引父母拥有的孩子数量,因此可用于排序,范围等.
但是,当我更改子模型时,父模型不会自动重新编制索引(因为它没有更改).通过子节点上的call_back强制parent.save也不会强制索引.
所以在我开始乱砍之前:
当子模型被更改/添加时,在Sunspot中强制对父类执行索引操作的最佳方法是什么?
我正在尝试执行搜索,随机排序结果,并且只返回一些结果,而不是所有匹配.类似限制的东西(2)我尝试过使用Solr param'rows',但似乎没有做任何事情:
@featured_articles = Article.search do
with(:is_featured, true)
order_by :random
adjust_solr_params do |params|
params[:rows] = 2
end
end
Run Code Online (Sandbox Code Playgroud)
@ featured_articles.total应为2,但返回的次数超过2
如何获得随机固定数量的结果?
我一直试图找出一个工作流程,即使开发实例正在运行,我的 Minitest 套件也会启动第二个 Solr 实例进行功能测试。但是,我在启动服务器时遇到了问题(即当我在测试之外启动它们时)。
要启动我正在使用的服务器:
RAILS_ENV=development bin/rake sunspot:solr:start
RAILS_ENV=test bin/rake sunspot:solr:start
Run Code Online (Sandbox Code Playgroud)
但是,无论哪个服务器第二次启动都会被锁定。任何在测试中或仅在开发中访问服务器的尝试都会产生此错误:
RSolr::Error::Http - 500 Internal Server Error
Error: {msg=SolrCore 'test& 'is not available due to init failure: Index locked for write for core 'test'. Solr now longer supports forceful unlocking via 'unlockOnStartup'. Please verify locks manually!,trace=org.apache.solr.common.SolrException: SolrCore 'test' is not available due to init failure: Index locked for write for core 'test'. Solr now longer supports forceful unlocking via 'unlockOnStartup'. Please verify locks manually!
at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:974) …
Run Code Online (Sandbox Code Playgroud) 有没有办法在运行时确定是否应该对模型编制索引?就像是:
class Article < ActiveRecord::Base
searchable :if => :indexable? do
...
end
private
def indexable?
...
end
end
Run Code Online (Sandbox Code Playgroud) 在太阳黑子solr中,我们可以通过facet对具有相似属性的记录进行分组.但是有可能从两个属性做一个facet过滤器吗?
我尝试在我的搜索中执行此操作:
facet_search = User.search do
facet :attribute1, :attribute2
end
facet_search.facet(:attribute1, :attribute2)
Run Code Online (Sandbox Code Playgroud)
有了这个,我一直得到nil值,我确信在attribute1和attribute2上有类似值的记录.
假设有两条记录在attribute1处的值为"orange".并且这两个记录在attribute2处的值为"eagles".
在太阳黑子中是否有一个功能可以用来根据两列分组记录,我该怎么做?
我在这里先向您的帮助表示感谢.
好的,所以我有一个单独的服务器与solr,这与应用程序完全正常.使用通常的sunspot.yml我们有类似的东西:
production:
solr:
hostname: domain
port: 8080
log_level: WARNING
path: path/to/data
Run Code Online (Sandbox Code Playgroud)
问题是我想授权我的tomcat应用程序.看来只要你知道域名和端口就可以去访问solr/admin.所以在我的tomcat web.xml中我添加了:
<security-constraint>
<web-resource-collection>
<web-resource-name>
Solr authenticated application
</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>role</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>REALM</realm-name>
</login-config>
<security-role>
<description>ROLE NAME</description>
<role-name>role</role-name>
</security-role>
Run Code Online (Sandbox Code Playgroud)
这将要求任何人在被授予访问权限之前访问solr/admin用户名和密码.问题是如何告诉我的rails应用程序?执行此操作后,当我的rails应用程序尝试访问solr服务器时,我得到了预期的"未授权"响应.我知道它可能会进入sunspot.yml文件,但我需要添加什么?
tomcat solr ruby-on-rails production-environment sunspot-rails
所以看起来Sunspot-Solr正在吃很多记忆.它可能是由于我作为程序员分配正确使用它的弊端.
首先,我不允许太阳黑子自行重新索引.
searchable :auto_index => false do
Run Code Online (Sandbox Code Playgroud)
仅此一点我认为是阻止它重新索引.相反,我在一个每天早上运行一次的cron-tab上运行reindex进程.
我开始这样做的原因是因为随着应用程序的扩展,数据似乎非常依赖于机器,只需加载主页就需要一段时间.
我做错了什么导致下面的错误?我能做得更好吗?
有问题的错误:
ActionView::TemplateError (Solr Response: Lock_obtain_timed_out_NativeFSLocktmpindexlucenede61b2c77401967646cf8916982a09a0writelock__orgapachelucenestoreLockObtainFailedException_Lock_obtain_timed_out_NativeFSLocktmpindexlucenede61b2c77401967646cf8916982a09a0writelock__at_orgapachelucenestoreLockobtainLockjava85__at_orgapacheluceneindexIndexWriterinitIndexWriterjava1545__at_orgapacheluceneindexIndexWriterinitIndexWriterjava1402__at_orgapachesolrupdateSolrIndexWriterinitSolrIndexWriterjava190__at_orgapachesolrupdateUpdateHandlercreateMainIndexWriterUpdateHandlerjava98__at_orgapachesolrupdateDirectUpdateHandler2openWriterDirectUpdateHandler2java173__at_orgapachesolrupdateDirectUpdateHandler2addDocDirectUpdateHandler2java220__at_orgapachesolrupdateprocessorRunUpdateProcessorprocessAddRunUpdateProcessorFactoryjava61__at_orgapachesolrhandlerXMLLoaderprocessUpdateXMLLoaderjava139__at_orgapachesolrhandlerXMLLoaderloadXMLLoaderjava69__at_orgapachesolrhandlerContentStreamHandlerBasehandleRequestBodyContentStreamHandlerBasejava54__at_orgapachesolrhandlerRequestHandlerBasehandleRequestRequestHandlerBasejava131__at_orgapachesolrcoreSolrCoreexecuteSolrCorejava1316__at_orgapachesolrservletSolrDispatchFilterexecuteSolrDispatchFilterjava338__at_orgapachesolrservletSolrDispatchFilterdoFilterSolrDispatchFilterjava241__at_orgmortbayjettyservletServletHandler$CachedChaindoFilterServletHandlerjava1089__at_orgmortbayjettyservletServletHandlerhandleServletHandlerjava365__at_orgmortbayjettysecuritySecurityHandlerhandleSecurityHandlerjava216__at_orgmortbayjettyservletSessionHandlerhandleSessionHandlerjava181__at_orgmortbayjettyhandlerContextHandlerhandleContextHandlerjava712__at_orgmortbayjettywebappWebAppContexthandleWebAppContextjava405__at_orgmortbayjettyhandlerContextHandlerCollectionhandleContextHandlerCollectionjava211__at_orgmortbayjettyhandlerHand) on line #24 of app/views/main/_main_nav.html.haml:
21: %br
22: community calendars
23:
24: - if (current_user.blank? || current_user.card_signup.blank?)
25: %li
26: - if current_user.blank?
27: = link_to 'Get Your HQcard', signup_path, :title => "Signup for your free HQcard and redeem local deals and promotions."
rsolr (0.12.1) [v] lib/rsolr/connection/requestable.rb:39:in `request'
rsolr (0.12.1) [v] lib/rsolr/client.rb:34:in `request_without_rails_logging'
/usr/lib/ruby/gems/1.8/gems/sunspot_rails-1.2.1/lib/sunspot/rails/solr_logging.rb:25:in `request'
/usr/lib/ruby/gems/1.8/gems/sunspot_rails-1.2.1/lib/sunspot/rails/solr_logging.rb:24:in `request'
rsolr (0.12.1) [v] lib/rsolr/client.rb:22:in `update'
rsolr …
Run Code Online (Sandbox Code Playgroud) 我有一些测试用RSpec运行Rails站点,但是尽管遵循了说明,事情本身并不是很好.
我通过工厂创建一篇文章,运行Sunspot.commit,然后检查结果.我似乎总是画一个空白.当我通过控制台或通过网站手动测试时,所有工作都可以找到.
有任何想法吗?如何输出太阳黑子日志以查看发生了什么?
我的Gemfile有以下内容,我正在运行Rails 3.1.1
gem 'sunspot', '1.2.1'
gem 'sunspot_rails'
gem 'sunspot_test'
Run Code Online (Sandbox Code Playgroud)
非常感谢,格雷姆
我的申请已经开始,然后我继续注册.输入我的信息后,我收到一个错误页面说:
用户控件#creore中的Errno :: ECONNREFUSED
Connection refused - {:data=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?><add><doc><field name=\"id\">User 1</field><field name=\"type\">User</field><field name=\"type\">ActiveRecord::Base</field><field name=\"class_name\">User</field><field name=\"username_text\">mikeadeleke</field><field name=\"bio_text\">Founder of Edopter</field></doc></add>", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :params=>{:wt=>:ruby}, :query=>"wt=ruby", :path=>"update", :uri=>#<URI::HTTP:0x007fb6c3c911d0 URL:http://localhost:8982/solr/update?wt=ruby>, :open_timeout=>nil, :read_timeout=>nil, :retry_503=>nil, :retry_after_limit=>nil}
Run Code Online (Sandbox Code Playgroud)
消息:
app/controllers/users_controller.rb:14:in `create'
Run Code Online (Sandbox Code Playgroud)
所以这是我的代码导致了阻塞.我看到没有问题,并通过roodi验证器运行它.
class UsersController < ApplicationController
before_filter :get_user, except: [:new, :create]
def get_user
@user = User.find_by_username(params[:user_name])
end
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Woohoo! Thanks for creating an account. Feel free to edit your profile or look …
Run Code Online (Sandbox Code Playgroud) 缺省情况下,sunspot solr gem作为保存回调的一部分向solr服务器发出索引命令。这种行为在我的大多数应用程序中都是可以接受的,但是在它的某些部分(尤其是用于大量处理的rake任务中),我希望在不与solr服务器进行任何交互的情况下保存我的模型实例。我该如何实现?
ruby-on-rails ×10
sunspot-rails ×10
solr ×5
sunspot ×5
sunspot-solr ×4
controllers ×1
lucene ×1
rspec ×1
search ×1
tomcat ×1