2016-08-10 4 views
1

그림과 같이 문자열 값 배열이있는 그룹 필드가 있습니다. 그러나 List<string> 속성에 매핑하려고 할 때 예외가 발생합니다.Elasticsearch를 사용하여 배열 필드를 C# 문자열 목록에 매핑

뭔가

Error converting value \"[134706634,134706635]\" to type System.Collections.Generic.IList[System.String]'처럼 나는 아무도 일하지 제외한 elasticsearch가 제공하는 몇 가지의 다양한 속성을 사용했습니다. json 변환기 속성은 제대로 작동하지만 원하는 방식으로 작동하도록 많은 코드를 작성해야합니다.

NEST에서 더 명확하고 자연스러운 방법이 있습니까?

C# 코드 :

var groupQuery = await 
    elastic.SearchAsync<CorrelationGroup>(s => s 
      .Query(q => q 
      .Bool(b => b 
      .Must(
        m => m.ConstantScore(c => c 
         .Filter(f => f 
         .Term(x => x.Type, counterType)) 
        ), 
        m => m.ConstantScore(c => c. 
         Filter(f => f 
         .Term(x => x.TypeValue, counterTypeValue)))))) 
      .Index("correlation-groups").AllTypes()); 

public class CorrelationGroup 
{ 
    [Text(Name = "type")] 
    public string Type { get; set; } 

    [Text(Name = "type_value")] 
    public string TypeValue { get; set; } 

    public List<string> Groups { get; set; } 
} 

소스 JSON 파일 :

[ { "type": "APN", "type_value": "internet", "groups": [150994936,150994940] }, { "type": "APN", "type_value": "internet", "groups": [150984921,150984922] }, { "type": "APN", "type_value": "internet", "groups": [150984917,150984918,150984921,150984922] } ]

내 템플릿은 다음과 같습니다

{ 
    "template": "correlation-groups", 
    "settings" : { 
     "number_of_shards" : 2, 
     "number_of_replicas" : 0, 
     "index" : { 
      "store" : { "compress" : { "stored" : true, "tv": true } } 
     } 
    }, 
    "dynamic_templates": [ 
    { 
     "string_template" : { 
      "match" : "*", 
      "mapping": { "type": "string", "index": "not_analyzed" }, 
      "match_mapping_type" : "string" 
     } 
    } 
    ], 
    "mappings": { 
     "_default_": { 
      "properties": { 
       "type": { "type": "string", "index": "not_analyzed" }, 
       "type_value": { "type": "string", "index": "not_analyzed" }, 
       "groups": { "type": "string"} 
      } 
     } 
    } 
} 

LOGSTASH CONF

INDEX

+0

배열이 실제로 문자열 인 것 같습니다. 배열'\ "[134706634,134706635] \"주위의 이스케이프 된 이중 따옴표를 참조하십시오. 'groups' 배열이 어떤 시점에서 문자열 화되어 문자열로 저장되었을 가능성이 큽니다. – Val

+0

인덱스 매핑을 어떻게 만들고 인덱스 데이터를 어떻게 작성하는지 확인하는 것이 좋습니다. – Rob

+0

@Val 템플릿에서 타입 문자열을 지정했습니다. (내가 문서에서 이해 한 것) 대신 다른 것을 사용해야합니까? – Cemre

답변

1

문제는 템플릿과 관련이 있습니다. __default__ 매핑 내에서 형식으로 groups을 지정 했으므로 들어오는 속성은 문자열로 바뀌고이고 Elasticsearch에서 문자열로 유지됩니다. Logstash 코덱은 발신 번호 json의 groups 속성을 번호 배열로 올바르게 전송하지만 기본 매핑 때문에 문자열로 유지됩니다. 당신은 단지 인덱스 내에서 한 가지 유형이있는 경우 시정

"mappings": { 
    "_default_": { 
     "properties": { 
      "type": { "type": "string", "index": "not_analyzed" }, 
      "type_value": { "type": "string", "index": "not_analyzed" }, 
      "groups": { "type": "integer" } 
     } 
    } 
} 

__default__ 매핑을 변경, 당신은 명시 적으로 대신 해당 유형에 대한 매핑을 정의 할 수 있습니다. 일단 당신이 이것을하면

, 당신은 Elasticsearch 전 5.x를 사용하는 경우, 당신은 이전 not_analyzedstring 유형에 매핑되는 keyword 형식을 사용한다

public class CorrelationGroup 
{ 
    [Keyword] 
    public string Type { get; set; } 

    [Keyword(Name = "type_value")] 
    public string TypeValue { get; set; } 

    public List<int> Groups { get; set; } 
} 

에 C#을 POCO을 변경합니다. 또한 뱀 케이싱을 사용하기 때문에 TypeValue의 이름을 지정하기 만하면됩니다 (NEST 클라이언트는 Elasticsearch에서 제공되는 낙타의 경우 이름 지정을 이해하고 파스칼 케이스의 POCO 속성 이름에 매핑합니다). 마지막으로 Groups 속성을 int 목록으로 변경했습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신의 제안을 시도했지만 지금은 logstash가 int로 문자열을 변환 할 수 없다는 불평입니다. – Cemre

+0

당신은 그 색인을 지우고 그것을 다시 만들 필요가있을 것입니다 (나는 이것이 지금 당신이 할 수 있다고 생각합니다). Logstash는 올바른 json을 통해 전송되어야합니다. 확인하기 위해'stdout'에 출력 할 수 있습니까? –

+0

좋아, stdout을 보면서 그것이 작동하는 것처럼 보입니다. 한 가지해야 할 일은 json 파일을 한 줄로 만듭니다. 그러나 GUI (head plugin)에서'groups' 컬럼을 보지 못했습니다. 왜 그런지 알기나 해? – Cemre