轮胎中的自定义分析器(ElasticSearch)

时间:2013-06-14 23:14:43

标签: ruby-on-rails ruby ruby-on-rails-3 elasticsearch tire

我正在尝试创建这个自定义分析器,由于某些原因我得到Analyzer [] not found for field []错误...我环顾了很多并尝试了不同的实现,我认为我有正确的语法...这是:

settings :number_of_shards => 5,
         :number_of_replicas => 2,
         :analysis => {
           :analyzer => {
             :ticker_analyzer => { 
               "type"      => 'custom',
               "tokenizer" => 'ticker_pattern',
               "filter"    => [ 'word_delimiter_filter', 'standard' ]
             }
           },
           :filter => {
             :word_delimiter_filter => {
               "type"                => 'word_delimiter',
               "preserve_original"   => true
             }
           },
           :tokenizer => {
             :ticker_pattern => {
               "type"      => 'pattern',
               "pattern"   => '\w+'
             }
           }
         } do
  mapping do
    # ... some more indexes that work fine, with regular analyzers
    indexes :company_ticker,      type: 'string',   boost: 5.0,   analyzer: 'ticker_analyzer',  as: 'index_company_ticker'
  end
end

所以我收到错误Analyzer [ticker_analyzer] not found for field [company_ticker]

任何想法为什么?

另外,我已经看到一些例子,我不需要将块传递给settings选项。我会关闭settings然后定义mapping,它会起作用吗? (我在其他人发布代码片段时看到了这一点......)

谢谢!

-Vlad

1 个答案:

答案 0 :(得分:3)

好的,这就是我遇到的实际问题,以及为什么这不起作用。
这是因为我试图创建一个索引来使用这个模型的映射(我没有尝试做Model.create_elasticsearch_index)但是有类似的东西

index = Tire::Index.new('swap_index')
index.create(:mappings => MyModel.tire.mapping_to_hash)
index.import(mymodel_entries)
# and then do some swapping between the old index and the new one, through alias'es

嗯,问题是我没有将settings传递给我的新索引。我只是从MyModel传递mappings,而不是settings。所以,正确的方法就是这样做

index.create(:settings => MyMode.tire.settings, :mappings => MyModel.tire.mapping_to_hash)

这解决了我遇到的错误。

(我的例子在我的情况下仍然不起作用,因为我的情况可能会破坏分析器,但我只想帮助可能有类似问题的用户)

谢谢你,
维拉德