0

我正在尝试创建这个自定义分析器,但由于某种原因我得到了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它会起作用吗?(我在其他人发布代码片段时看到过这个......)

谢谢!

-弗拉德

4

1 回答 1

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给我的新索引。我只是mappings从 MyModel 传递它,而不是settings. 所以,正确的做法是这样

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

这解决了我遇到的错误。

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

谢谢你,
弗拉德

于 2013-06-17T14:35:41.017 回答