为STI创建轮胎索引不会将分析器和提升传递给类型

时间:2017-08-15 18:37:20

标签: ruby-on-rails elasticsearch tire

我是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不会返回任何结果。仅按其他类型搜索实际上会返回结果。

0 个答案:

没有答案