2015-02-04 6 views
0

NEST .NET 라이브러리를 사용하여 쿼리를 실행합니다.탄성 검색 NEST 라이브러리, 유선 동작

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.Term("Name","Robert"))); 

7 개의 결과가 표시됩니다.

필드를 나타 내기 위해 maigic 문자열을 사용하는 대신 다음과 같이 expression을 사용하려고했습니다.

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.Term(t => t.Name,"Robert"))); 

결과가 없습니다.

또 하나의 예입니다.

작동.

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.MultiMatch(a => a.OnFields(new List<string{"Name"}).Query("Robert")))); 

작동하지 않습니다.

var result = client.Search<StudenntBrief>(s => s.Type("Students").Query(q => q.MultiMatch(a => a.OnFields(f=> f.Name).Query("Robert")))); 

필드를 나타내는 표현식을 사용하는 쿼리가 작동하지 않는 이유가 궁금합니다.

답변

2

bsarkar의 답변이 부분적으로 정확합니다.

기본적으로 NEST camelCases 필드 이름입니다. 이 동작을 사용자 정의하는 데는 몇 가지 방법이 있습니다.

고유 한 속성 이름 유추어 (How to disable camel casing Elasticsearch field names in NEST?)를 지정하여 기본 camelCasing을 재정의 할 수 있습니다. 이 접근법은 모든 필드와 모든 유형에 적용됩니다.

또 다른 방법은 언급 bsarkar으로 ElasticyProperty 속성을 사용하여, 또는 버전 1.3에 추가 된 새로운 유창 속성 매핑 API를 사용하거나 명시 적으로 필드 이름을 지정하는 것입니다 : 도움이 https://github.com/elasticsearch/elasticsearch-net/pull/1062

settings.MapPropertiesFor<MyClass>(props => props 
    .Rename(p => p.Foo, "bar") 
); 

희망.

0

Nest가 필드 이름을 기본적으로 소문자로 변경하기 때문에 이러한 현상이 발생합니다. 그러므로 t.Name은 사실 실제로는 "이름"으로 직렬화됩니다. 매핑은 Students (참고 : 필드 이름은 Elasticsearch에서 대소 문자를 구분 함)이므로 결과가 없습니다. 반면에 "이름"을 직접 사용하면 작동합니다. 이 문제를 해결하는 한 가지 방법은 필드를 클래스에 [ElasticProperty(Name = "Name")] 클래스로 꾸미는 것입니다.

더 좋게도 StudenntBrief 클래스를 [ElasticType(Name = "Students")] 속성으로 꾸밀 수 있습니다. 이렇게하면 Nest를 사용하여 검색 요청을 작성할 때 Type을 명시 적으로 지정하지 않아도됩니다.

+0

이렇게하는 유창한 API가 있습니까? 도메인 클래스를 기본 검색 기술과 분리하여 유지하고 싶습니다. –

+0

강력하게 형식화 된 필드 이름을 원하면 다른 방법이 없다고 생각합니다. 같은 필드를 가지고있는'IStudentBrief'와 같은 인터페이스를 가지고 그것을 노출시킬 수없는 이유는 무엇입니까? 그런 다음'StudentBrief' 클래스를'IStudentBrief'로 구현하고'Nest' 속성으로이 클래스를 꾸밀 수 있습니다. 그것은 당신의 문제를 해결해야합니다. – bittusarkar

+0

이 질문에 대한 답변이 있으면 답변으로 표시하십시오. – bittusarkar