我应该如何使用 Elasticsearch 索引视图内容?
How should I index view content with Elasticsearch?
我有一个显示多个视图的控制器,但没有模型支持,这些视图只是从 erb 呈现为 html。
我需要做的是从 Elasticsearch 中索引的这些视图中获取文本,但我遇到了缺乏相关文档的问题。
另一个复杂因素是视图是翻译的,因此它们不直接包含文本。
我应该怎么做才能将这些页面编入索引并可搜索?以及我应该如何维护索引,因为我不能依赖 activerecord 回调?
基于抓取站点想法的解决方案:
在 WelcomeController 中:
format.json { render json: {body:view_to_text(view), title:@title, url:request.original_url.gsub(/\.json$/,'')} }
...
def view_to_text(view)
html = render_to_string view, layout: false, formats: :html
strip_tags(html).strip.gsub(/^[\s]+/,'').squeeze("\n")
end
并且在 rake 任务中:
require 'open-uri'
namespace :scrape do
desc "scrape view content and send to elasticsearch"
task scrape: :environment do
client = Elasticsearch::Model.client
session = ActionDispatch::Integration::Session.new(Rails.application)
session.host! Rails.application.config.action_mailer.default_url_options[:host]
Rails.application.routes.routes.to_a.select{|r| r.defaults[:controller] == 'welcome'}.map{|r| r.path.spec.to_s.gsub( /\(\.\:format\)/, '.json') }.reject{|r| '/'==r}.each_with_index{|path,i|
session.get path
page_string = session.response.body
client.index index: Rails.env, type: 'welcome', id: i, body: page_string
}
end
end
我有一个显示多个视图的控制器,但没有模型支持,这些视图只是从 erb 呈现为 html。
我需要做的是从 Elasticsearch 中索引的这些视图中获取文本,但我遇到了缺乏相关文档的问题。
另一个复杂因素是视图是翻译的,因此它们不直接包含文本。
我应该怎么做才能将这些页面编入索引并可搜索?以及我应该如何维护索引,因为我不能依赖 activerecord 回调?
基于抓取站点想法的解决方案:
在 WelcomeController 中:
format.json { render json: {body:view_to_text(view), title:@title, url:request.original_url.gsub(/\.json$/,'')} }
...
def view_to_text(view)
html = render_to_string view, layout: false, formats: :html
strip_tags(html).strip.gsub(/^[\s]+/,'').squeeze("\n")
end
并且在 rake 任务中:
require 'open-uri'
namespace :scrape do
desc "scrape view content and send to elasticsearch"
task scrape: :environment do
client = Elasticsearch::Model.client
session = ActionDispatch::Integration::Session.new(Rails.application)
session.host! Rails.application.config.action_mailer.default_url_options[:host]
Rails.application.routes.routes.to_a.select{|r| r.defaults[:controller] == 'welcome'}.map{|r| r.path.spec.to_s.gsub( /\(\.\:format\)/, '.json') }.reject{|r| '/'==r}.each_with_index{|path,i|
session.get path
page_string = session.response.body
client.index index: Rails.env, type: 'welcome', id: i, body: page_string
}
end
end