当前位置: 首页 > 面试题库 >

使用NEST Field Boosting进行elasticsearch

连俊智
2023-03-14
问题内容

我正在使用NEST强类型客户端在C#中使用Elastic Search。我有一个包含条目的索引:

[ElasticType(Name = "Entry", IdProperty = "Id")]
public class Entry
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Award { get; set; }
    public int Year { get; set; }
}

其中Year是输入项的年份,例如2012,Award是输入项获得的奖励类型,可以为空。

然后,我想使用增强的不同属性搜索这些条目。在下面的代码中,我希望在标题上匹配的结果比在描述上匹配的结果排名更高。

private IQueryResponse<Entry> GetMatchedEntries(string searchText)
{
    return _elasticClient.Search<Entry>(
                body =>
                body.Query(q => 
                           q.QueryString(qs => 
                                         qs.OnFieldsWithBoost(d => 
                                                              d.Add(entry => entry.Title, 5.0)
                                                              .Add(entry => entry.Description, 2.0))
                           .Query(searchText))));
}

现在,已经有人要求我提高成绩,也要提高新的参赛作品(即按年份)。

我该怎么做呢?是否需要将其作为索引服务的一部分或作为搜索的一部分?


问题答案:

您可以通过结合boosting查询和custom_score查询来实现

与其提高年份,不如根据年份更改分数,因为:

(_score + 2013) > (_score + 1999)

较新的结果将浮动到顶部。

通过使用增强查询,我们可以有效地将缺少奖励字段的结果降级。

请参阅:http : //www.elasticsearch.org/guide/reference/query-dsl/boosting-
query.html
http://www.elasticsearch.org/guide/reference/query-dsl/custom-
score-query.html

_client.Search<Entry>(s=>s
    .Query(q =>q
        .Boosting(bq=>bq
            .Positive(pq=>pq
                .CustomScore(cbf=>cbf
                    .Query(cbfq=>cbfq
                        .QueryString(qs => qs
                            .OnFieldsWithBoost(d =>
                                d.Add(entry => entry.Title, 5.0)
                                .Add(entry => entry.Description, 2.0)
                            )
                            .Query(searchText)
                        )
                    )
                    .Script("_score + doc['year'].value")
                )
            )
            .Negative(nq=>nq
                .Filtered(nfq=>nfq
                    .Query(qq=>qq.MatchAll())
                    .Filter(f=>f.Missing(p=>p.Award))
                )
            )
            .NegativeBoost(0.2)
        )
    )
);


 类似资料:
  • 问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是首先了解他们的知识,然后通

  • 我的要求是存储所有日期 这是不是正确的 如果没有,我应该回到使用好的旧(或遗留?) 或者我应该使用Java 8的?如果使用,是否可以只存储日期部分而不存储时间? 数据库是MySQL

  • 问题内容: 我有一个测试,可以从数据提供者那里接收数据。我希望此测试与数据提供者的不同值并行运行。 我尝试了类似的方法: } 我收到的输出是: 你好:10 你好:12 你好:17 你好:11 你好:16 你好:14 你好:13 你好:15 产生10个线程,而我在线程池大小中指定5个。您能否告诉我们必须在上述代码段中添加哪些内容来控制数据提供程序线程池的大小。 问题答案: 您需要使用。在和不需要的值

  • 如何用vscode选择多行? 在Visual Studio上,您可以按左alt键并选择多行,但它不适用于vscode。

  • 我正在使用DataTables,并将这个有点尴尬的Javascript拼凑在一起,以允许行和列高亮显示。它基于本页的示例(http://datatables.net/release-datatables/examples/api/highlight.html ). 下面是dataTable配置的相关部分: 服务器上的模板代码插入了一些常量。这是列数。以下是DataTables调试输出:http:/

  • 问题内容: NumPy / SciPy或相关库中是否有类似Matlab的函数? 以供参考。Procrustes分析的目的是对齐2组点(换句话说,是2个形状),以通过消除缩放,平移和旋转扭曲分量来最小化它们之间的平方距离。 Matlab中的示例: NumPy中的相同任务: 注意:我只对对齐的形状感兴趣,因为平方误差(在Matlab代码中可变)很容易从2个形状中计算出来。 问题答案: 我不知道Pyth