我正在寻找的是ElasticSearch(Lucene)的默认评分机制如何真正起作用的简单清晰的解释.我的意思是,它是否使用Lucene得分,或者它可能使用自己的得分?
例如,我想通过例如"名称"字段搜索文档.我使用.NET NEST客户端来编写查询.我们来考虑这种类型的查询:
IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s =>
s.From(0)
.Size(300)
.Explain()
.Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName")))
);
Run Code Online (Sandbox Code Playgroud)
这被转换为这样的JSON查询:
{
"from": 0,
"size": 300,
"explain": true,
"query": {
"match": {
"Name": {
"query": "ExampleName"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
搜索执行的文档大约有110万个.我得到的回报是(这只是结果的一部分,我自己格式化):
650 "ExampleName" 7,313398
651 "ExampleName" 7,313398
652 "ExampleName" 7,313398
653 "ExampleName" 7,239194
654 "ExampleName" 7,239194
860 "ExampleName of Something" 4,5708737
Run Code Online (Sandbox Code Playgroud)
其中第一个字段只是一个Id,第二个是ElasticSearch执行搜索的名称字段,第三个是得分.
如您所见,ES索引中有许多重复项.由于一些已发现的文档具有不同的分数,尽管它们完全相同(只有不同的Id),我得出结论,不同的分片在整个数据集的不同部分上进行搜索,这使我得出结论,分数在某种程度上基于整体给定分片中的数据,而不仅仅是搜索引擎实际考虑的文档.
问题是,这个得分究竟是如何运作的?我的意思是,你能告诉我/给我看/给我一个确切的公式来计算ES发现的每个文件的分数吗?最终,这个评分机制如何改变?
我创建了2个项目:
我做的是我添加了我的自定义消息处理程序,派生自DelegatingHandler它们.这里是:
public class MyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
我global.asax在两者中注册了它:
GlobalConfiguration.Configuration.MessageHandlers.Add(new MyHandler());
Run Code Online (Sandbox Code Playgroud)
我把断点放进去了
return base.SendAsync(request, cancellationToken);
Run Code Online (Sandbox Code Playgroud)
ASP.NET MVC和ASP.NET WebAPI之间的区别在于,当我调用ASP.NET MVC application(http://localhost:4189/Something)时,不会触发断点.当我调用Web API(http://localhost:7120/api/values)时,会触发断点.
这是为什么?这些应用程序类型执行流程是否有任何差异?
另外,当我尝试请求正常Controller而不是ApiControllerWebAPI应用程序时,不会触发http://localhost:7120/Home断点.
我正在使用Microsoft ASP.NET Web API构建RESTful服务.
我的问题涉及Web API在出现问题时返回给用户的HttpErrors(例如400 Bad Request或404 Not Found).
问题是,我不希望得到系列化HttpError响应内容,因为它有时会提供太多的信息,因此它违反了OWASP安全规则,例如:
请求:
http://localhost/Service/api/something/555555555555555555555555555555555555555555555555555555555555555555555
Run Code Online (Sandbox Code Playgroud)
作为回复,我当然得到400,但有以下内容信息:
{
"$id": "1",
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'MyNamespaceAndMethodHere(Int32)' in 'Service.Controllers.MyController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
Run Code Online (Sandbox Code Playgroud)
这样的事情不仅表明我的WebService基于ASP.NET WebAPI技术(也不是那么糟糕),而且还提供了有关我的命名空间,方法名称,参数等的一些信息.
我试图在Global.asax中设置IncludeErrorDetailPolicy
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;
Run Code Online (Sandbox Code Playgroud)
是的,这确实很好,现在结果不包含MessageDetail部分,但仍然,我根本不想得到这个HttpError.
我还构建了自定义DelegatingHandler,但它也影响了我自己在控制器中生成的400和404,我不想发生这种情况.
我的问题是:是否有任何方便的方法来摆脱响应内容中的序列化HttpError?所有我希望用户回复他的错误请求是响应代码.