我正在尝试使用ElasticSearch + Tire在我的应用中进行全文搜索。
目前,我通过Paperclip拥有Entry
的模型has_attached_file
。我已经安装并运行了最新版本的ElasticSearch / Tire,并且还安装了Attachment-mapping插件。
如果我的查询是针对可以在其他Entry
字段之一中找到的任何内容,则它可以完美地运行。我试图运行rake environment tire:import CLASS="Entry"
来更新索引,但我得到了
** Invoke environment (first_time)
** Execute environment
** Invoke tire:import (first_time)
** Execute tire:import
[IMPORT] Starting import for the 'Entry' class
--------------------------------------------------------------------------------
7/7 | 100% rake aborted!##############################################
stack level too deep
/home/capuser/.rvm/gems/ruby-1.9.2-p320/gems/rake-0.9.2.2/lib/rake/task.rb:162
Tasks: TOP => tire:import
我感觉问题在于编码文件或我的to_indexed_json
函数。
以下是一些代码:
class Entry < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
has_attached_file :document,
:url => "/assets/entries/:id/:basename.:extension",
:path => ":rails_root/public/assets/entries/:id/:basename.:extension"
before_post_process :image?
validates_presence_of :entry_type
attr_accessible :description, :title, :url, :category_ids, :subcategory_ids, :entry_type_id, :document
mapping do
indexes :title
indexes :description
indexes :categories do
indexes :name
end
indexes :subcategories do
indexes :name
end
indexes :entry_type
indexes :document, :type => 'attachment'
end
def to_indexed_json
{
:title => title,
:description => description,
:categories => categories.map { |c| { :name => c.name}},
:subcategories => subcategories.map { |s| { :name => s.name}},
:entry_type => entry_type_name,
:document => attachment
}.to_json
end
def self.search(params)
tire.search(load: true) do
query { string params[:query], default_operator: "AND" } if params[:query].present?
end
end
def attachment
if document.present?
path_to_document = "#{RAILS_ROOT}/app/assets/#{document}"
Base64.encode64(open(path_to_document) { |pdf| pdf.read})
end
end
end
答案 0 :(得分:0)
我有一些愚蠢的错别字,这搞砸了。我必须阅读一篇文章,他们以不同的格式编写了to_indexed_json函数,我感到困惑。我在写这个问题之前就把它修好了,所以这就是我之前所拥有的。
def to_indexed_json
{
:title => title,
:description => description,
:categories => categories.map { |c| { :name => c.name}},
:subcategories => subcategories.map { |s| { :name => s.name}},
:entry_type => entry_type_name,
:methods => [:attachment]
}.to_json
end
答案 1 :(得分:0)
你的方法hash在json中,应该在它之外,如果你想让方法实际命中的话。像这样:
assistant[phone]