【发布时间】:2014-09-17 21:30:32
【问题描述】:
我在我的 rails 4 应用程序中创建了一个运行良好的搜索引擎,但我很难让 asciifolding 过滤器正常工作。我的模型有很多带有口音的术语,除非它们拼写完全正确,否则它们不会出现,即:我想要搜索“Rodriguez”以显示带有“Rodriguez”的结果。我尝试了许多不同的示例,但是由于某种原因,当我使用以下代码重置数据库时,搜索根本不起作用(我没有收到错误,但无论查询如何都没有出现)。
这是我的模型:
class Product < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
settings :analysis => {
:analyzer => {
:default => {
:tokenizer => "standard",
:filter => ["standard", "asciifolding"]
}
}
} do
mapping do
indexes :id, type: 'integer', index: :not_analyzed
indexes :name, boost: 5, analyzer: 'default'
indexes :website, index: :not_analyzed
indexes :price, type: 'integer', index: :not_analyzed
indexes :artist, boost: 3, analyzer: 'default'
indexes :company, boost: 4, analyzer: 'default'
indexes :date, type: 'date', index: :not_analyzed
end
end
def self.search(params)
tire.search(page: params[:page], per_page: 12) do
query { string params[:query], default_operator: "AND" } if params[:query].present?
end
end
在测试之前,我使用以下命令清除数据库:
rake db:setup
然后我运行:
rake environment tire:import CLASS=Product FORCE=true
我查看了许多不同的资源,包括 elasticsearch 和轮胎文档,但无论出于何种原因(我预计会犯一个愚蠢的错误),它根本不起作用。小提示,为了填充我的数据库,我一直在导入一个 csv 文件,但我不明白为什么这会产生任何影响,特别是考虑到在这种形式的搜索中没有出现任何内容(当我删除时它工作正常,没有重音问题设置部分,只有映射块和搜索方法)。我需要调用某种 Tire.index 并导入吗?任何帮助表示赞赏!
更新
所以我对搜索查询进行了编辑,修复了问题,但又提出了一个新问题:
def self.search(params)
tire.search(page: params[:page], per_page: 12) do
query { string params[:query], analyzer: :search_analyzer, :default_field => 'name' } if params[:query].present?
end
end
通过识别默认字段,我现在可以搜索不可知的重音,但现在我的搜索仅限于名称,并且我无法接收以前工作的其他索引属性的结果。有谁知道如何设置多个默认字段?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 elasticsearch tire