2014-05-15 4 views
3

의 특정 필드를로드하면 설명서에 전체 문서 대신 필드의 하위 집합을 반환 할 수 있음이 나타납니다. 여기 내 코드 :Elasticsearch Nest 쿼리

var result = client.Search<MyObject>(s => s 
       .Fields(f => f.Title) 
       .Query(q => q 
        .QueryString(qs => qs 
         .OnField("title") 
         .Query("the")))); 

'제목'필드에서 'the'단어를 검색하고 'title'을 (를) 반환하고 싶습니다. 내 result.Documents 객체에는 각각 null 인 10 개의 객체가 포함되어 있습니다.

내가 원하는 값을 참조 할 수 있지만 검색 응답에 깊은입니다 : result.Hits [0] .Fields.FieldValues ​​[0] ...

이 얻을 수있는 더 좋은 방법이 'title'필드 목록이 반환 되었습니까?

(절단) 데이터에 대한 내 매핑이 ...

{ 
    "myidex": { 
     "mappings": { 
     "myobject": { 
      "properties": { 
       "title": { 
        "type": "string" 
       }, 
       "artists": { 
        "properties": { 
        "id": { 
         "type": "string", 
         "index": "not_analyzed", 
         "analyzer": "fullTerm" 
        }, 
        "name": { 
         "type": "string", 
         "index": "not_analyzed", 
         "analyzer": "fullTerm" 
        } 
        } 
       }        
      } 
     } 
     } 
    } 
} 

내 클래스 객체는 다음과 같이되어있다

:

[Table("MyTable")] 
[Serializable] 
[ElasticType(Name="myobject")] 
public class MyObject 
{ 
    [ElasticProperty] 
    public string Title { get; set; } 

    [JsonIgnore] 
    public string Artistslist { get; set; } 
    [ElasticProperty(Analyzer = "caseInsensitive")] 
    public List<Person> Artists { get; set; }   
} 

[Serializable] 
public class Person 
{ 
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)] 
    public string Name { get; set; } 
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)] 
    public string Id { get; set; } 
} 

Artistslist 내 데이터 소스 (SQL)에서 유래 한 후 데이터를 인덱싱하기 전에 새 List 객체로 파싱합니다.

+0

어떤 NEST 버전을 사용하고 있습니까? –

+0

nest 및 elasticsearch.net의 시험판 (누겟을 통해). 나는 그것이 1.0.0 beta1이라고 믿는다. – bigerock

+0

'result.Documents' 객체가 null 인 경우 매핑 문제 일 수 있습니다. MyObject 클래스 정의를 질문에 추가 할 수 있습니까? –

답변

4

이 중첩 된 값은 Elasticsearch 1.0의 변경과 부분 배열 필드가 배열로 반환되는 방식입니다 (자세한 내용은 1.0 Breaking Changes - Return Values 참조). 이 내용은 NEST 1.0 Breaking Changes 설명서에서 다룹니다. 필드()와 SourceIncludes() 섹션. 이 값에 액세스하기 위해 FieldValue 도우미 메서드를 사용하는 예를 보여줍니다. 특정 항목에 대해

foreach (var hit in result.Hits) 
{ 
    var title = hit.Fields.FieldValue<MyObject, string>(f => f.Title); 
} 

: 모든 항목의

: 그 바탕으로, 다음을 시도 나는 여전히 조금 자세한 것을 알고

var title = result.Hits.ElementAt(0) 
        .Fields.FieldValue<MyObject, string>(f => f.Title); 

을하지만 당신을 위해 작동해야하며, Elasticsearch 1.0의 새 배열 반환 형식을 처리합니다.

+1

이 바로 여기에 있습니다. 'FieldValue'의 문법은 차기 베타 버전에서 업데이트 될 예정입니다. https://github.com/elasticsearch/elasticsearch-net/pull/619 –

+0

이 작동하는 것처럼 보이지만 그 코드는 그렇지 않습니다. 컴파일 ... \t \t result.Hits [0] .Fields.FieldValue (f => f.Title) ... \t 형식이 'System.Collections.Generic'인 식에 []을 (를) .IEnumerable > ' – bigerock

+0

당신이 맞습니다,'Hits'가 IEnumerable이라는 것을 잊었습니다. 대신에 각 항목을 foreach해야합니다. 답변을 업데이트했습니다. –

2

Nest의 Github 레포에서 해결책을 발견했습니다. 그들은이 문제에 관한 문제를 만들었습니다. Fields 대신 FielddataFields를 사용해야합니다.

var result = client.Search<MyObject>(s => s 
       .FielddataFields(f => f.Title) 
       .Query(q => q 
        .QueryString(qs => qs 
         .OnField("title") 
         .Query("the")))); 

하고 FieldSelections을 볼 응답

https://github.com/elastic/elasticsearch-net/issues/1551

. 당신은 당신이 원하는 분야를 얻습니다.

관련 문제