当前位置: 首页 > 面试题库 >

在Elasticsearch中将字段重命名为新索引

尹兴生
2023-03-14
问题内容

我有此映射的索引:

curl -XPUT 'http://localhost:9200/origindex/_mapping/page' -d '
   {
    "page" : {
        "properties" : {
            "title" : {"type" : "text"},
            "body" : {"type" : "text"},
            "other": {"type": "text"}
        }
     }
   }'

在新索引中,我想将“ title”复制到“ title1”和“ title2”,将“ body”复制到“ body1”和“ body2”(不考虑“
other”),并将类型从“ page”更改为“ Articles_eng”。新索引具有以下映射:

curl -XPUT 'http://localhost:9200/newindex/_mapping/articles_eng' -d '                             
{                                                                                                  
    "articles_eng" : {                                                                             
        "properties" : {                                                                           
            "title1" : {                                                                     
                 "type" : "text",                                                                  
                 "analyzer" : "my_analyzer1"                                                    
             },                                                                                     
            "title2" : {                                                                   
                 "type" : "text",                                                                  
                 "analyzer": "my_analyzer2"                                                    
             },                                                                                     
            "body1": {                                                                       
                "type" : "text",                                                                  
                "analyzer": "my_analyzer1"                                                     
            },                                                                                     
            "body2" : {                                                                     
                "type" : "text",                                                                  
                "analyzer": "my_analyzer2" 
            }                                                   
        }                                                                                      
    }                                                                                          
}'

通过查看此答案和Elasticsearch重新索引文档,我得出了类似以下内容:

curl -XPOST http://localhost:9200/_reindex -d '{                                                   
    "source": {                                                                                    
        "index": "origindex",                                                                          
        "type": "page",                                                                            
        "query": {                                                                                 
           "match_all": {}                                                                         
        },                                                                                         
        "_source": [ "title", "body" ]                                                             
    },                                                                                             
    "dest": {                                                                                      
        "index": "newindex"                                                                        
    },                                                                                             
    "script": {                                                                                    
        "inline": "ctx._type = \"articles_eng\"";                                                  
                  "ctx._title1 = ctx._source._title";                                         
                  "ctx._title2 = ctx._source._title";                                       
                  "ctx._body1 = ctx._source._body";                                          
                  "ctx._body2 = ctx._source._body"                                                                                                   
    }                                                                                              
}'

我在脚本行上遇到了麻烦。如果仅执行第一行(更改文档类型),则一切正常。如果我添加其余的行,则会出现错误

“ [reindex]无法解析字段[脚本]”

由…引起

“意外的字符(’;’(代码59)):期望逗号分隔[输入源:org.elasticsearch.transport.netty4.ByteBufStreamInput@37649463;第14行,第50列]中的对象项\
n”

即使我可以使用多条语句来解决问题,也只需在第二行中输入错误即可

“无效的字段已添加到上下文[title1]”}]

谁能帮我吗?看来这不是不可能做到的。


问题答案:

如果仅执行第一行(更改文档类型),则一切正常。如果我添加其余的行,则会出现错误

您不需要将所有内联语句都放在双引号中,而是可以将所有内联脚本语句都用分号(;)分隔并用双引号(")括起来,如下所示:

"script": {
    "inline": "ctx._source.title1 = ctx._source.title; ctx._source.title2 = ctx._source.remove(\"title\");ctx._source.body1 = ctx._source.body; ctx._source.body2 = ctx._source.remove(\"body\");ctx._type=\"articles_eng\""
}

即使我可以使用多条语句来解决问题,也只需在第二行中输入错误即可

您试图以错误的方式访问源字段。元数据字段(如_id, _type, _index ..)应作为ctx._type/
访问ctx._id,而源字段(如title, body, other您的情况)应作为ctx._source.title/
访问ctx._source.body

因此,最后,您的ReIndex查询应如下所示:

POST _reindex
{
  "source": {
    "index": "origindex",
    "_source": [ "title", "body" ]
  },
  "dest": {
    "index": "newindex"
  },
  "script": {
    "inline": "ctx._source.title1 = ctx._source.title; ctx._source.title2 = ctx._source.remove(\"title\");ctx._source.body1 = ctx._source.body; ctx._source.body2 = ctx._source.remove(\"body\");ctx._type=\"articles_eng\""
  }
}

希望这可以帮助!



 类似资料:
  • 问题内容: 我有这样的文件 我需要更改为 为此,首先将字段映射添加到现有索引 然后尝试重新索引 错误是 问题答案: 该字段在您的文档中尚不存在,因此您的脚本需要首先创建它: 或更短一些:

  • 问题内容: 无论如何,我可以在现有的Elasticsearch映射中重命名元素而不必添加新元素?如果是这样,为了避免破坏现有映射,最好的方法是什么? 例如从fieldCamelcase到fieldCamelCase 问题答案: 您可以通过创建一个Ingest管道来做到这一点,该管道包含一个Rename Processor 和Reindex API 。 请注意,您需要运行Elasticsearch

  • 问题内容: 我正在使用带有NEST的C#.NET应用程序来创建索引。 我创建了一个Elasticsearch索引,客户可以查询该索引,称为index_1。然后,我使用应用程序的不同实例构建索引的另一个版本,并将其称为index_1_temp。 我将index_1_temp重命名为index_1然后删除原始index_1的最安全方法是什么? 我知道ES具有别名,但是我不确定如何将其用于此任务 编辑:

  • 在elasticsearch的索引中有两个字段field1和field2 我需要重命名字段1到字段2,我也想重命名字段2到字段1 这就是我当前映射的样子,我已经为此映射索引了许多文档 我需要下面的地图 是否有任何可能,我可以重命名字段和做重新索引? 我使用的是elasticsearch 7.4版

  • 问题内容: 通过使用,我们可以向Logstash添加新字段。 但是,在这里,我想知道如何为该特定领域设置分析仪。 例如:,我有一个新的id字段,其字段类似于,但Elasticsearch提供的常规分析器会将其分为和。因此,我无法将术语功能有效地应用于该特定领域并使之有用。 在这里,对于ID字段,我想应用我自己的自定义分析器,该分析器不标记值,而是应用小写过滤器。 如何在logstash中完成此操作

  • 我正在使用Spring Data ElasticSearch执行CRUD操作。默认情况下,当用@Document注释的POJO写入ElasticSearch索引时,索引字段名称与POJO的Java属性名称相同。如何将索引字段名称配置为不同的名称?例如,对于本文档POJO: 我如何配置它,使ElasticSearch中的索引字段被序列化为county_name而不是countyName?