首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEST FunctionScore()在添加函数之前返回所有索引项,添加函数后抛出异常

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

Stack Overflow用户
提问于 2016-08-29 02:56:31
回答 1查看 143关注 0票数 0

好的,那么这个查询在Chrome中可以完美地工作。我使用以下查询:

代码语言:javascript
复制
{
"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“属性,优先考虑最近添加的项,并支持”输入时建议“-因此是前缀查询。它工作得很好,因为它已经调优了,所以我的下一步将是在NEST中重现。

但是,我在下面的.NET嵌套代码中遇到了一些问题:

代码语言:javascript
复制
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(字段字段)处得到一个带有NullReference内部异常的UnexpectedElasticsearchClientException。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-29 06:39:22

几乎是正确的,但是您遗漏了指数日期衰减函数应该运行的字段。假设你的POCO看起来像

代码语言:javascript
复制
public class customDataType
{
    public string Name { get; set; }

    public DateTime Date { get; set; }
}

该查询将为

代码语言:javascript
复制
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)
                )
            )
        )
    )
);

哪一项会产生

代码语言:javascript
复制
{
  "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"
    }
  }
}

通过&& prefixmatch查询,您可以利用嵌套中的运算符重载进一步缩短bool查询

代码语言:javascript
复制
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)
                )
            )
        )
    )
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39194737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档