小编Prz*_*ita的帖子

ElasticSearch默认评分机制

我正在寻找的是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发现的每个文件的分数吗?最终,这个评分机制如何改变?

lucene search scoring elasticsearch

10
推荐指数
1
解决办法
1万
查看次数

ASP.NET MVC消息处理程序与Web API消息处理程序

我创建了2个项目:

  1. 正常的,基本的ASP.NET MVC 4应用程序
  2. 基本的ASP.NET WebAPI应用程序

我做的是我添加了我的自定义消息处理程序,派生自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断点.

c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

10
推荐指数
2
解决办法
8228
查看次数

ASP.NET Web API从响应中删除HttpError

我正在使用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?所有我希望用户回复他的错误请求是响应代码.

asp.net response http-error asp.net-web-api

6
推荐指数
1
解决办法
1208
查看次数