NEST FunctionScore() returns 添加函数前的所有索引项,添加后抛出异常

NEST FunctionScore() returns all indexed items before adding functions, throws exceptions after adding them

好的,所以查询在 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 中匹配自定义类型的索引 "name" 属性,优先考虑最近添加的项目并支持 "suggestions as you type" - 因此是前缀查询。它工作得很好,按原样调整,所以我的下一步是在 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\Field\FieldResolver.cs:line 31 中的 Nest.FieldResolver.Resolve(Field field) 得到一个带有 NullReference 内部异常的 UnexpectedElasticsearchClientException。

我对这一切感到困惑,似乎没有类似的问题可以作为我的起点。我可以做些什么来获得 运行 上面的查询,还是应该求助于手动执行 restful API 调用?

几乎正确,但您遗漏了指数日期衰减函数应该 运行 的字段。假设你的 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 查询,方法是 &&ing 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)
                )
            )
        )
    )
);