2016-08-28 2 views
0

좋아요, Sense in Chrome에서는 쿼리가 완벽하게 작동합니다. 따라서 접두사 - 나는 최근에 추가 된 항목에 우선 순위를 부여하고 "입력 할 때 제안을"지원 인덱스 "이름"ES에서 사용자 지정 유형의 특성에 맞게 짧은에서NEST FunctionScore()는 함수를 추가하기 전에 인덱싱 된 모든 항목을 반환하고 예외를 추가 한 후 예외를 throw합니다.

{ 
"size":127, 
"query": { 
    "function_score": { 
     "query": { 
      "bool": { 
       "must": [ 
        { 
         "prefix": { 
          "name": { 
           "value": "incomp" 
          } 
         } 
        }, 
        { 
         "match": { 
          "name": "a word that is" 
         } 
        } 
       ] 
      } 
     }, 
     "functions": [ 
      { 
       "exp": { 
        "date": { 
         "origin": "now/d", 
         "scale": "3w", 
         "offset": "10d", 
         "decay": "0.88" 
        } 
       } 
      } 
     ] 
    } 
} 
} 

: 나는 다음과 같은 쿼리를 사용 질문. 그것은 완벽하게 잘 작동하고, 그대로 조정되므로 다음 단계는 NEST에서 재생산하는 것입니다.

그러나, 나는 아래의 .NET NEST 코드와 함께 몇 가지 문제에 직면하고 있습니다 :

var results4 = _client.Search<customDataType>(
s => s.Size(5030) 
.Query(q => q 
    .FunctionScore(fs => fs 
     .Name("another_named_query") 
     .BoostMode(FunctionBoostMode.Multiply) 
     .ScoreMode(FunctionScoreMode.Multiply) 
     .Query(qu => qu 
      .Bool(b => b 
       .Must(m => m 
        .Prefix(p => p 
         .Field(ff => ff.Name) 
         .Value(prefixVal))) 
       .Must(m2 => m2 
        .Match(mh => mh 
         .Field(f2 => f2.Name) 
         .Query(stringBeforePrefixVal)))))         
     /*.Functions(fcs => fcs.ExponentialDate(
      exp => exp 
      .Origin(DateMath.Now) 
      .Scale(new Time(1814400000)) 
      .Offset(new Time(864000000)) 
      .Decay(0.88d)) 
     )*/))); 

내가 알아낼 수없는 이유 "FunctionScore"방법의 결과를 사용하려는 모든 시도 무엇에 MatchAll() 그러면 모든 레코드가 반환됩니다.

한편 위에서 언급 한 함수를 추가 할 때 C : \ code \ elasticsearch-net \ src \ Nest \ CommonAbstractions \ Infer의 Nest.FieldResolver.Resolve (필드 필드)에서 NullReference 내부 예외가있는 UnexpectedElasticsearchClientException이 발생합니다. \ Field \ FieldResolver.cs : line 31.

나는이 모든 것에 대해 당혹스럽고, 내가 출발점으로 사용할 수있는 비슷한 문제가없는 것 같습니다. 위의 쿼리를 실행하기 위해 할 수있는 일이 있습니까? 아니면 수동으로 편안한 API 호출을해야합니까?

답변

2

거의 정확하지만 지수 감쇠 기능을 실행해야하는 필드가 누락되었습니다. 쿼리가

{ 
    "size": 5030, 
    "query": { 
    "function_score": { 
     "_name": "another_named_query", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "name": { 
        "query": "a word that is" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "functions": [ 
     { 
      "exp": { 
      "date": { 
       "origin": "now/d", 
       "scale": "3w", 
       "offset": "10d", 
       "decay": 0.88 
      } 
      } 
     } 
     ], 
     "score_mode": "multiply", 
     "boost_mode": "multiply" 
    } 
    } 
} 

당신은 &&에 의해, 더 bool 쿼리를 단축하는 NEST에서 연산자 오버로딩을 활용할 수 산출

var prefixVal = "incomp"; 
var stringBeforePrefixVal = "a word that is"; 

var results4 = client.Search<customDataType>(s => s 
    .Size(5030) 
    .Query(q => q 
     .FunctionScore(fs => fs 
      .Name("another_named_query") 
      .BoostMode(FunctionBoostMode.Multiply) 
      .ScoreMode(FunctionScoreMode.Multiply) 
      .Query(qu => qu 
       .Bool(b => b 
        .Must(m => m 
         .Prefix(p => p 
          .Field(ff => ff.Name) 
          .Value(prefixVal))) 
        .Must(m2 => m2 
         .Match(mh => mh 
          .Field(f2 => f2.Name) 
          .Query(stringBeforePrefixVal))))) 
      .Functions(fcs => fcs 
       .ExponentialDate(exp => exp 
        .Field(f => f.Date) 
        .Origin("now/d") 
        .Scale("3w") 
        .Offset("10d") 
        .Decay(0.88) 
       ) 
      ) 
     ) 
    ) 
); 

public class customDataType 
{ 
    public string Name { get; set; } 

    public DateTime Date { get; set; } 
} 

처럼 POCO 보이는 가정 prefixmatch 쿼리

var results4 = client.Search<customDataType>(s => s 
    .Size(5030) 
    .Query(q => q 
     .FunctionScore(fs => fs 
      .Name("another_named_query") 
      .BoostMode(FunctionBoostMode.Multiply) 
      .ScoreMode(FunctionScoreMode.Multiply) 
      .Query(qu => qu 
       .Prefix(p => p 
        .Field(ff => ff.Name) 
        .Value(prefixVal) 
       ) && qu 
       .Match(mh => mh 
        .Field(f2 => f2.Name) 
        .Query(stringBeforePrefixVal) 
       ) 
      ) 
      .Functions(fcs => fcs 
       .ExponentialDate(exp => exp 
        .Field(f => f.Date) 
        .Origin("now/d") 
        .Scale("3w") 
        .Offset("10d") 
        .Decay(0.88) 
       ) 
      ) 
     ) 
    ) 
); 
+0

고마워요! 나는 아주 작은 것을 찾고있는 나이를 보냈다 : ( – nikovn

+0

아무런 문제도 도와주지 않았다. :) –