我正在尝试创建这个自定义分析器,由于某些原因我得到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
答案 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)
这解决了我遇到的错误。
(我的例子在我的情况下仍然不起作用,因为我的情况可能会破坏分析器,但我只想帮助可能有类似问题的用户)
谢谢你,
维拉德