无法在Elasticsearch中更新映射

时间:2019-03-06 16:59:32

标签: elasticsearch

使用 require 'nokogiri' def see_error(response_xml.xml) doc = Nokogiri::XML(File.open(response_xml.xml)) #it shows me the file doc.xpath('//dms:ComplexResponse/ErrorCode/ErrorDescription') end 将分析仪放置到映射中时发生冲突。 但是映射中没有分析器。

AtomicReference<Boolean> first = new AtomicReference<Boolean>(Boolean.TRUE);
stream.forEach(e -> 
         System.out.println("First == " + first.getAndUpdate(b -> false)));
PUT /job/_mapping/doc/
PUT /job/_mapping/doc/
{
    "properties":{
        "title": {
            "type": "text",
            "analyzer":"ik_smart",
            "search_analyzer":"ik_smart"
        }
    }
}

输出配置是这样的。

{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
    },
    "status": 400
}

2 个答案:

答案 0 :(得分:0)

您无法在elasticsearch中更新映射,可以添加映射,但不能更新映射。 Elasticsearch在索引编制时使用映射,这就是为什么您无法更新现有字段的映射的原因。分析器是映射的一部分,实际上,如果您不指定默认值,则分析器会告诉Elastic如何索引文档。

1)使用新映射(包括分析器)创建新索引 2)将文档从现有索引重新索引到新索引(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html

答案 1 :(得分:0)

更新映射:

一旦文档被索引到索引,即在给定类型下生成映射,就像在我们的情况下EmployeeCodeEmployeeNameisDevelopers'的映射是在类型“ customtype”,之后我们将无法对其进行修改。如果我们要修改它,我们需要先删除索引,然后手动应用修改后的映射,然后对数据重新索引。但是,如果要在给定类型下添加新属性,则可行。例如,我们的文档在类型“ customtype”下附加了索引“ inkashyap-1002”,如下所示:

{
  "inkashyap-1002": {
    "mappings": {
      "customtype": {
        "properties": {
          "EmployeeCode": {
            "type": "long"
          },
          "isDeveloper": {
            "type": "boolean"
          },
          "EmployeeName": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

现在让我们添加另一个属性“ Grade”:

curl -XPUT localhost:9200/inkashyap-1002(IndexName)/customtype(TypeName)/2 — d '{
 "EmployeeName": "Vaibhav Kashyap",
 "EmployeeCode": 13629,
 "isDeveloper": true,
 "Grade": 5
}'

现在点击GET映射API。在结果中,您可以看到还有一个名为“成绩”的字段。

常见错误:

到目前为止,在索引“ inkashyap-1002”中,我们已经索引了2个文档。两个文档的“ EmployeeCode”字段具有相同的类型,并且类型为“ Long”。现在,让我们尝试为以下文档建立索引:

curl -XPUT localhost:9200/inkashyap-1002/customtype/3 -d '{
"EmployeeName": "Vaibhav Kashyap",
 "EmployeeCode": "onethreesixtwonine",
 "isDeveloper": true,
 "Grade": 5
}'

请注意,此处的“ EmployeeCode”以字符串类型给出,这表明它是一个字符串字段。对以上请求的响应如下:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "failedtoparse[
          EmployeeCode
        ]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "failedtoparse[
      EmployeeCode
    ]",
    "caused_by": {
      "type": "number_format_exception",
      "reason": "Forinputstring: \"onethreesixtwonine\""
    }
  },
  "status": 400
}

在上述响应中,我们在字段“ EmployeeCode”上看到错误“ mapper_parsing_exception”。这表明此处的期望字段是另一种类型,而不是字符串。在这种情况下,请使用适当的类型重新索引文档