弹性搜索无法更改_parent字段的类型选项:[null] - > [metadata]

时间:2016-06-14 19:48:58

标签: java elasticsearch elasticsearch-java-api elasticsearch-mapping

这是我的情景: 我在elasticsearch中创建了两个索引,类型为“data”和“metadata”。 我正在尝试在数据和元数据之间建立父子映射,其中元数据是数据的父级。 我正在使用elasticsearch传输客户端java api来执行此操作。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="300dp"
android:layout_height="500dp"
android:id="@+id/galaxy_info_popup"
android:background="#ffffff">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/nameText"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<ImageView
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:id="@+id/infoPicture"
    android:layout_below="@+id/nameText"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="infoText"
    android:id="@+id/infoText"
    android:layout_below="@+id/infoPicture"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

但是我收到以下错误 -

              //parent mapping json
                 String parentMapping = XContentFactory.jsonBuilder()
                            .startObject()
                                .startObject(parentType)
                            .endObject()
                            .string();
                 //child mapping json
                 String childMapping = XContentFactory.jsonBuilder()
                            .startObject()
                                .startObject(childType)
                                     .startObject("_parent")
                                         .field("type", parentType)
                                     .endObject()
                                .endObject()
                            .endObject()
                            .string();
                 System.out.println("childMapping="+childMapping);
                 System.out.println("parentMapping="+parentMapping);
                 client.admin().indices().preparePutMapping(indexName).setType(parentType)
                 .setSource(parentMapping).execute().actionGet();
                  //This does the mapping
                  PutMappingRequestBuilder putMappingRequestBuilder = client.admin().indices().preparePutMapping(indexName).setType(childType);
                    putMappingRequestBuilder.setSource(childMapping);
                    PutMappingResponse response = putMappingRequestBuilder.execute().actionGet();
                    if(!response.isAcknowledged()) {
                        LogManager.log("Could not define mapping for type ["+indexName+"]/["+childType+"]",LogManager.DEBUG);
                        tries=tries+1;
                    } else {
                        mapLoop=true;
                        LogManager.log("Successfully put mapping for ["+indexName+"]/["+childType+"]",LogManager.DEBUG);
                    }

我尝试在线搜索但无法得到具体答案。 我不想删除现有索引并添加带有映射的索引,因为我在索引中需要使用现有信息。(有人建议这样做)

这是elasticsearch中的错误吗?

如果不是我的代码不正确,我该如何解决?

1 个答案:

答案 0 :(得分:0)

它是否是一个&#34; bug&#34;我不能说,这肯定是一种限制,另见https://github.com/elastic/elasticsearch/issues/9448

实现这项工作的唯一方法是在索引创建时间而不是之后添加_parent(刚才用5.2.2验证)。

使用像锯齿这样的工具,可以在不必先删除当前索引的情况下执行这些操作,但需要对步骤进行良好规划,并且应该进行适当的测试。