我已经设置了弹性搜索和轮胎搜索。
我的模型上有以下设置:
tire.settings :analysis => {
:analyzer => {
:spanish_snowball => {
:type => "snowball",
:language => "Spanish",
:filter => %w{asciifolding lowercase}
}
}
}
以下映射:
tire.mapping do
indexes :id, :index => :not_analyzed
indexes :name, :analyzer => 'spanish_snowball', :boost => 3
indexes :urbanization, :analyzer => 'spanish_snowball'
indexes :categories do
indexes :name, :analyzer => 'spanish_snowball'
end
indexes :tags do
indexes :name, :analyzer => 'spanish_snowball'
end
end
我还定义了to_indexed_json
方法
def to_indexed_json
to_json include: { categories: { only: [:name]}, tags: { only: [:name]} }
end
我想忽略搜索中的重音,因此我在asciifolding
分析器中使用了spanish_snowball
。但是,重音不会被忽略。
Business.tire.search("japonés").size
=> 10
Business.tire.search("japones").size
=> 0
我已经用卷曲测试了分析仪,分析仪似乎工作正常
➜ ~ curl -XGET 'localhost:9200/businesses/_analyze?pretty=1&text=Japonés%20nobu&analyzer=spanish_snowball'
{
"tokens" : [ {
"token" : "japones",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "nobu",
"start_offset" : 8,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 2
} ]
}%
答案 0 :(得分:0)
执行搜索时,您需要告诉elasticsearch如何分析您的搜索查询。
简短格式Model.search 'foo'
不允许(我认为)允许您指定这些选项,但您可以使用较长版本:
Model.search do
query do
string 'foo', :analyzer => 'bar'
end
end
答案 1 :(得分:0)
您还需要在查询分析器上指定asciifolding
过滤器。就像Frederick Cheung所说的那样,你需要为查询创建一个新的分析器,或者指定你用于索引的分析器(我推荐前者,因为你通常不希望以与索引记录相同的方式分解搜索查询)