我是Rails开发人员。我的任务是在大型且非常老的Rails应用程序中从0.9升级Elasticsearch。
此应用程序在当前状态下运行在Elasticsearch 0.90.7上并使用已退役的gem Tire。我将切换到官方支持的elasticsearch-ruby(和elasticsearch-model)宝石,但与此同时,我需要解决Rails模型中定义的索引定义的重大变化。
我的问题是我不明白Tire(或Elasticsearch - 不确定这里做什么)是如何定义从具有明确定义的{{1}的类继承的类的映射阻止。
所以,代码:
有一个拥有大量孩子的模特。 '标签'可以是多种类型。所以映射看起来像这样:
mapping
我们有一些不同类型的标签:
class Tag < ActiveRecord::Base
mapping do
# some mappings that aren't causing me any problems
# and then there's these guys
indexes :name, analyzer: 'snowball', boost: 100
indexes :type
# more mappings that are happily being good, understandable mappings
end
end
因此,当我运行class ATagType < Tag
# absolutely no code regarding mappings, index definition, or the like
end
class BTagType < Tag
# still no code regardining mappings, index definitions, or the like
end
class CTagType < Tag
# ... just, yeah. nothing helpful here either.
end
然后查看已创建的新索引时(现在只需添加相关属性):
Tag.create_elasticsearch_index
然后我运行$ $elasticsearch.indices.get_mapping["application_development_tags"]
=> { "tag" => {
"properties" => {
"name" => { "type" => "string", "boost" => 100.0, "analyzer" => "snowball" },
"type" => { "type" => "string" }
}
}
}
以索引数据库中的所有标记。
这改变了&#34; application_development_tags&#34;索引映射:
Tag.import
这就是索引目前在生产中的存在方式。
然后在升级过程中,我遇到了一个问题:不同类型的索引具有相同的属性(&#34;名称&#34;),具有不同的&#34; boost&#34;和&#34;分析仪&#34;设置。
事情是,我不能为我的生活找出导入所有标签后重新整形索引的代码。我认为$ $elasticsearch.indices.get_mapping["application_development_tags"]
=> { "tag" => {
"properties" => {
"name" => { "type" => "string", "boost" => 100.0, "analyzer" => "snowball" },
"type" => { "type" => "string" }
}
},
"atagtype" => {
"properties" => {
"name" => { "type" => "string" },
"type" => { "type" => "string" }
}
},
"btagtype" => { etc. }
}
可能是罪魁祸首,我将类型转换为Elasticsearch索引类型作为特征。但是,为什么不是以与#34;标记&#34;相同的方式从Tag映射继承的每种类型标记的名称?理想的情况使得所有标签及其所有子系统具有相同的分析器和提升,因为这将保持当前行为(或接近当前行为,因为我们将要获得)并使其成为我能够在较新版本的Elasticsearch中重新创建索引。
我已经尝试向每个Tag模型的孩子明确添加indexes :type
块 - 但这根本不会改变行为(不会调用mapping do
和所以忽略TagType1中的映射定义)。如果我从标签映射中删除分析器并提升定义,一切都很好,但是......我非常确定我们仍然需要分析器和提升,并且最好将它们添加到所有标签中类型比完全摆脱它们。 (相关:this - 但提供的答案“实际上并没有解决问题”。
为了使这更复杂,我已经列出了所有TagTypes中的所有属性,并且每种类型都具有与最初定义的&#34;标记不同的属性&#34;类型。
那么有没有人可以帮助我弄清楚发生了什么,并在新版本的Elasticsearch中成功重建我的索引?
修改
我刚学到的其他内容:TagType1.create_elasticsearch_tag
更改Tag.import
的映射,但application_development_tags
不会返回任何结果。仅按其他类型搜索实际上会返回结果。