首页 > 解决方案 > 如何使用 Ruby on Rails 将 ElasticSearch 从 6.8 升级到 7.X

问题描述

我有一个使用ElasticSearch服务器的 Rails 应用程序,它们都在各自的 Docker 映像中。

我想升级我的 ElasticSearch 服务器。实际上我正在跑步image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1,我想将其更新为7.X

使用第 7 版时,我在重建索引时遇到此错误:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Root mapping definition has unsupported parameters:  [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:  [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "Root mapping definition has unsupported parameters:  [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]"
    }
  },
  "status": 400
}

我知道错误是由重大更改引起的,但我不知道如何修复它。

我正在使用gem elasticsearch-model

我的定义如下所示:

    include Elasticsearch::Model

    after_destroy { |record| ElasticIndexer.new(:delete, record.class.name, record.id) }
    after_save     { ElasticIndexer.new(:index, self.class.name, self.id)}

    index_name "#{Rails.application.class.parent_name.underscore}_#{Rails.env} mydoc"
    document_type "mydoc"

def as_indexed_json(options={})
[....]
end

settings index: { number_of_shards:5, number_of_replicas:0 } do
      settings :analysis => {
        char_filter: {
          dash_remover: {
            type: "mapping",
            mappings: ["-=>"]
          }
        },
        filter: {
          english_stemmer: {
            type:       "stemmer",
            language:   "english"
          }
        },
        tokenizer: {
          id_tokenizer: {
            type: "ngram",
            min_gram: 3,
            max_gram: 3,
            token_chars: ["letter", "digit"]
          },
          address_tokenizer: {
              type: "edgeNGram",
              min_gram: 3,
              max_gram: 3,
              token_chars: ["letter", "digit"]
          }
        },
        analyzer: {
          description_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: ['asciifolding', 'lowercase']
          },
          id_analyzer: {
            tokenizer: "id_tokenizer",
            char_filter: ["dash_remover"],
            filter: ['asciifolding', 'lowercase']
          },
          english_description_analyzer: {
            tokenizer: "whitespace",
            char_filter: ["html_strip"],
            filter: ['asciifolding', 'lowercase', "english_stemmer"]
          },
          address_analyzer: {
            tokenizer: "address_tokenizer",
            filter: ['asciifolding', 'lowercase']
          },
        }
      }
      mappings dynamic: true do
        indexes :location, :type => 'geo_point'
        indexes :uid,     :analyzer => 'id_analyzer'
        indexes :bee_id,  :analyzer => 'id_analyzer'
        indexes :address, :analyzer => 'address_analyzer'
      end
    end

我应该应用哪些更改?

标签: ruby-on-railsdockerelasticsearch

解决方案


最后我转向别的事情。过了好久,是时候回过头来了。

读了很多之后,我在看我的代码时遇到了这行微妙的代码

我评论了它: document_type "mydoc" 我试一试。

当控制台中没有出现错误时,我感到很惊讶!有用。(好故事)


推荐阅读