轮胎搜索不会忽略重音

时间:2013-06-04 03:01:07

标签: ruby-on-rails ruby elasticsearch tire

我已经设置了弹性搜索和轮胎搜索。

我的模型上有以下设置:

  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
  } ]
}%

2 个答案:

答案 0 :(得分:0)

执行搜索时,您需要告诉elasticsearch如何分析您的搜索查询。

简短格式Model.search 'foo'不允许(我认为)允许您指定这些选项,但您可以使用较长版本:

Model.search do
  query do
    string 'foo', :analyzer => 'bar'
  end
end

答案 1 :(得分:0)

您还需要在查询分析器上指定asciifolding过滤器。就像Frederick Cheung所说的那样,你需要为查询创建一个新的分析器,或者指定你用于索引的分析器(我推荐前者,因为你通常不希望以与索引记录相同的方式分解搜索查询)