2017-12-06 3 views
0

ElasticSearch를 사용 중이고 동적 유형 속성이있는 클래스로 색인을 만들려고합니다. 이 속성에는 문자열이나 날짜가있을 수 있습니다. 인덱싱 할 때 아래 코드를 사용했습니다.ElasticSearch에서 날짜를 색인으로 매핑하려고 시도했습니다.

dynamic instance = MyObject.GetDynamicJson(); 
var indexResponse = client.Index((object) instance, i=>i 
       .Index("myIndex") 
       .Type("MyObject") 
      ); 

다음은 GetDynamicJson() 코드입니다. MyObject는 속성으로 이름과 값만 있습니다. (사과, 나는 탄성 내가 \ 문자로 이스케이프 한 모든 따옴표없이 JSON에 질식과 과거에 문제를 했어) : 어떤 이유

String json = "{ \"Name\":\" + Name + "\",\"DateValue\":\""; 
try { 
    var date = DateTime.parse(Value); 
    json += DateTime.ToString("yyyy/MM/dd HH:mm:ss Z") + "\", \"Value\":\"\"}"; 
} catch { //If the DateTime parse fails, DateValue is empty and I'll have text in Value 
    json += "\",\"Value\":\"" + Value + "\"}"; 
} 
return json; 

는 문자열을 좋아하지 않는 것 DateValue에서 나는 완전히 그 속성을 오류로 빠뜨리는 이유를 확실히 알지 못합니다 :

어떤 이유로 든 ElasticSearch는 DateValue 속성을 완전히 덤프하고 있으며, DateValue 속성을 전혀 보이지 않습니다.
{ "이름": "CreatedDate", "값": "2017-11-07T13 : 37 : 11.4340238-06 : 00"}

나는 오류를 받고 있어요 [지수 : 데이터/쓰기/"type": "class_cast_exception", "reason": "org.elasticsearch.index.mapper.TextFieldMapper는 org.elasticsearch.index.mapper.DateFieldMapper로 형변환 될 수 없습니다"}, "상태": 500

이상 주 : 이름, 값, DATEVALUE :. 나는 특성을 가지고 그래서 지금, 내가 개체에 세 번째 필드를 추가 매핑을 업데이트 할 수있는 인덱스 작성자 방법을 변경 한

public static void CreateRecordsIndex(ElasticClient client) 
    { 
     client.CreateIndex("myIndex", i => i 
      .Settings(s => s 
       .NumberOfShards(2) 
       .NumberOfReplicas(0) 
      ) 
      .Mappings(x => x 
       .Map<MyObject>(m => m.AutoMap()))); 
    } 

이제는 매번 성공적으로 매핑하고 속성을 만들지 만 여전히 json에서 보내는 속성을 삭제하는 것으로 보입니다. 모든 날짜를 기본 datetime : "dateValue": "0001-01-01T00 : 00 : 00"으로 설정하면됩니다. 이것은 이상한 일입니다. 왜냐하면 동적 인스턴스를 만들어 Elastic에 전송할 때 MyObject.GetDynamicJson() 메서드 만 사용하기 때문입니다. 더 이상 매핑 오류가 발생하지 않지만 탄성은 여전히 ​​"dateValue"를 모르는 것처럼 보입니다.

답변

0

그래, 나는 동적 인 객체 유형을 없앴습니다. 궁극적으로 json 메서드에서 실제로 데이터를 얻지 못했습니다. 오타가 있었고 탄성은 원래의 객체를 직접 얻었습니다. 여전히 처리 중이었습니다. . 그래서 Elastic이 매핑을 사용하여 구문 분석을 수행하도록했습니다. 그렇게하기 위해 먼저 입력 속성이 될 수있는 각 유형별로 여러 속성을 포함하도록 MyObject를 업데이트했습니다.이 경우 텍스트와 날짜 만 처리합니다. MyObject의 DateValue 속성은 다음과 같습니다.

public DateTime DateValue { 
     get 
     { 
      try 
      { 
       return DateTime.Parse(Value); 
      } catch 
      { 
       return new DateTime(); 
      } 
     } 
     set 
     { 
      try { 
       DateValue = value; 
      } catch 
      { 
       DateValue = new DateTime(); 
      } 
     } 
    } 

이제 값이 날짜 인 경우 내 DateValue 필드가 설정됩니다. 그렇지 않으면 기본 날짜 (매우 이른 날짜 "0001-01-01T00 : 00 : 00")가됩니다. 이렇게하면 나중에 해당 동적 필드에 대한 텍스트를 검색 할 수 있습니다. 또는 날짜가 설정되어 있으면 날짜 및 날짜 범위 쿼리를 수행 할 수 있습니다 (기술적으로는 두 개의 다른 필드로 끝나지만 같은 손상된 데이터에서 오는 것입니다) . 이것에

키는 질문에서이 방법에서 볼 수 있듯이, 인덱스 매핑 설정을 가지고있다 :

업데이트 MyObject를 가진 인덱스를 재현하기 위해
public static void CreateRecordsIndex(ElasticClient client) 
{ 
    client.CreateIndex("myIndex", i => i 
     .Settings(s => s 
      .NumberOfShards(2) 
      .NumberOfReplicas(0) 
     ) 
     .Mappings(x => x 
      .Map<MyObject>(m => m.AutoMap()))); 
} 

,이 한 :

if (client.IndexExists("myIndex").Exists) 
     { 
      client.DeleteIndex("myIndex"); 
      CreateRecordsIndex(client); //Goes to the method above 
     }