2014-06-14 1 views
10

Elasticsearch에 이상한 문제가 있습니다. 매핑은 특정 필드의 유형이 long임을 지정합니다. 이제 우연히 long 대신 해당 필드에 대해 string 유형의 문서를 색인화하려고했습니다. 나는 Elasticsearch에서 오류를 얻지 못했지만 문서는 절대로 색인 생성되지 않았습니다. 문제를 해결할 때 문서의 색인이 제대로 작성되었습니다.문서가 필드에 대해 매핑 불일치가있는 경우 Elasticsearch가 자동으로 실패합니다.

예 :

내 매핑 :이 문서를 보낼 때

{ 
    "field1": { 
     "type": "long" 
    } 
} 

그것은 자동으로 실패 :이를 보낼 때 예상대로

{ 
    "field1": "this is a string" 
} 

작동 :

{ 
    "field1": 12345 
} 

이런 종류의 오류를 감지 할 수있는 방법이 있습니까? 이 true by default하고 항상 숫자로 문자열을 변환하기위한 분수를 절단하려고하므로 그런 경우에는

{ 
    "long_field": { 
     "type": "long" 
    } 
} 

, 당신은 falsecoerce 플래그를 설정할 수 있습니다

+0

당신이 침묵 인덱스 실패가있을 때 당신이 Elasticsearch에서 다시 받고 응답을 공유 할 수 있습니까? –

+0

아마도 전역 수준에서 [ignore_malformed] (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#mapping-settings) 플래그가 true로 설정되어있을 것입니다. 색인을 생성 한 예제 문서를 제공하여 자동으로 실패하게 만들었습니까? 또한 elasticsearch의 버전입니다. – keety

+0

예를 보려면 업데이트 된 질문을 참조하십시오. 네가 방금 언급 한 깃발이 내가 찾고 있던 깃발일지도 모른다. 유일한 문제는 이것이 잘못된 필드를 무시하지만 그 필드가 필요하기 때문에 나에게 좋지 않은 나머지 문서의 색인을 생성한다는 것입니다. 잘못된 형식의 필드를 인덱싱하려고하면 오류를 반환하고 오류를 반환하고 싶습니다. 그렇게 할 수있는 방법이 있습니까? –

답변

4

false로 ignore_malformed 문자열을 설정합니다. 형식이 잘못되었지만 예외가 발생하면 문서의 색인을 생성하지 않습니다. 적어도 elasticsearch 1.6.0에서.

예 :

put test 

put test/test/_mapping 
{ 
    "properties" : { 
     "title" : {"type" : "string"}, 
     "data" : {"type": "long" ,"ignore_malformed":false} 

    } 
} 

put test/test/1 
{ 
    "data" : "1", 
    "title" : "valid coerce string to number" 
} 

put test/test/2 
{ 
    "data" : "hello", 
    "title" : "invalid number" 
} 

#Failed Response 
{ 
    "error": "MapperParsingException[failed to parse [data]]; nested: NumberFormatException[For input string: \"hello\"]; ", 
    "status": 400 
} 

Query with Get fails 

get test/test/2 


{ 
    "_index": "test", 
    "_type": "test", 
    "_id": "2", 
    "found": false 
} 
5

나는 당신의 매핑이 비슷합니다 의심 정수.

{ 
    "long_field": { 
     "type": "long", 
     "coerce": false 
    } 
} 

이렇게하면, 당신은 문자열로 인덱스로 긴 필드를 시도 할 다음 번에, ES 당신이 말할 것이다 :

MapperParsingException[failed to parse [long_field]]; nested: IllegalArgumentException[Long value passed as String]; 
+1

우수 Q & A +1 +1에서 배웠습니다 - 감사합니다 – Chris

+0

답변 해 주셔서 감사합니다. 예 내 매핑 긴 형식 (내 업데이트 된 질문 참조) 지정하지만 정수로 변환 할 수없는 문자열을 인덱스 싶습니다. 그래서 나는 이것이이 경우에는 효과가있을 것이라고 생각하지 않지만 다른 경우에는 유용합니다. 감사! –

+0

"할 수 없습니까"또는 "할 수 있습니까?" 이해할 수있는 방법은''123 "'(number as string)과'123' (number as long)이 성공하지만''number ''(bad string)가 실패하기를 원한다는 것입니다. 그 맞습니까? – Val

관련 문제