NEST FunctionScore()在添加函数之前返回所有索引项,在添加函数后抛出异常

时间:2016-08-28 18:56:31

标签: c# elasticsearch nest

好吧,所以查询在Chrome中的Sense中完美运行。我使用以下查询:

{
"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"
                    }
                }
            }
        ]
    }
}
}

简而言之,我匹配索引的"名称" ES中自定义类型的属性,优先考虑最近添加的项目,并在您键入时提供支持"建议" - 因此前缀查询。它工作得很好,按原样调整,所以我的下一步就是在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))
        )*/)));

我无法弄清楚为什么尝试使用&#34; FunctionScore&#34;方法导致MatchAll()将执行的操作 - 返回所有记录。

同时,在添加函数时(上面评论过),我在C:\ code \ elasticsearch-net \ src \ Nest \ CommonAbstractions \ Infer \中的Nest.FieldResolver.Resolve(字段字段)中得到一个带有NullReference内部异常的UnexpectedElasticsearchClientException。 Field \ FieldResolver.cs:第31行。

我对这一切感到困惑,似乎并没有类似的问题可以作为起点。我可以做些什么来使上面的查询运行,或者我应该手动执行一个宁静的API调用?

1 个答案:

答案 0 :(得分:2)

差不多正确,但你错过了应该运行指数日期衰减函数的字段。假设您的POCO看起来像

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

    public DateTime Date { get; set; }
}

查询将是

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)
                )
            )
        )
    )
);

产生

{
  "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"
    }
  }
}

您可以利用NEST中的运算符重载来进一步缩短bool查询,&& 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)
                )
            )
        )
    )
);