我开发了一个带有rails和solr太阳黑子全文搜索的应用程序。
此处用户可以发布主题。用户需要等待管理员批准该帖子。
例如:如果用户在domain.com
中发布主题并且是从admin.domain.com
@search = Post.where(status: 1).search do
fulltext params[:search] do
minimum_match 1
end
with :status, 1
paginate page: params[:page], per_page: 15
end
@posts = @search.results
除非管理员批准,否则帖子状态为2
。在管理员中,如果我从admin将状态从2更改为1,则无法找到结果。我怎样才能与它相互联系。
我该如何处理这类问题。任何人都可以提供帮助
修改-1
我将把这作为一个赏金问题。我面临很多困难。任何人都可以通过更好的解决方案解决这个问题,否则任何人都知道执行此类搜索的任何其他方式
答案 0 :(得分:2)
如果您有2个应用程序,我认为他们使用相同的数据库,但只有您的主应用程序使用太阳黑子。
问题是当管理员更新对象时,此对象未在sunspot / solr中重新编制索引。
选项1 在您的管理应用上添加太阳黑子,使用相同的可搜索模块,并使用相同的solr服务器配置。
选项2
在主应用程序上创建自定义控制器方法(如api)。此方法强制像Sunspot.index Post.find(params[:id])
这样的对象重新索引
在管理员应用上发布每次更新后,您需要调用主应用的reindex post方法。
选项3 (最简单) 删除您的范围:状态如下:
@search = Post.where(status: 1).search do
fulltext params[:search] do
minimum_match 1
end
paginate page: params[:page], per_page: 15
end
@posts = @search.results
修改强>
此更新为使用选项1添加了更多信息:
我用一个模型创建一个应用程序:文章
class Article < ActiveRecord::Base
searchable do
text :title, :boost => 5
text :content
integer :status
end
end
我想在我的管理应用上显示所有文章,并且只显示我的用户应用中状态为1的文章。两个应用程序都使用相同的数据库和相同的solr服务器。
两个应用程序的配置
我使用sunspot_rails(https://github.com/sunspot/sunspot)和sunspot_solr进行此测试。
#Gemfile
gem 'sunspot_rails'
group :development do
gem 'sunspot_solr'
end
#config/database.yml
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
#config/sunspot.yml use same host and same port for both applications
development:
solr:
hostname: localhost
port: 8982
log_level: INFO
path: /solr/development
注意:我使用此命令在用户应用上启动solr只有一次
bundle exec rake sunspot:solr:start
管理员应用的文章控制器
我想在我的管理员应用上显示所有文章:
def index
@search = Article.search do
fulltext params[:search]
end
@articles = @search.results
end
用户应用的文章控制器
在我的用户应用中,我只想查看带有statuts == 1
的文章def index
@search = Article.search do
fulltext params[:search]
with :status,1
end
@articles = @search.results
end
现在,当我使用我的管理应用程序时,我更新文章的状态solr会同时更新。 如果我在主应用程序上刷新我的文章索引页面,则会出现这篇文章。
我希望你现在有更多的信息。