1

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

我的模型有以下设置:

  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 测试了分析仪,分析仪似乎工作正常

➜  ~  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
  } ]
}%
4

2 回答 2

0

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

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

Model.search do
  query do
    string 'foo', :analyzer => 'bar'
  end
end
于 2013-06-05T19:21:42.340 回答
0

您还需要asciifolding在查询分析器上指定过滤器。就像 Frederick Cheung 说的那样,您需要为查询创建一个新的分析器或指定一个用于索引的分析器(我推荐前者,因为您通常不想像处理索引记录一样分解您的搜索查询) .

于 2014-02-06T22:09:35.153 回答