gpt4 book ai didi

c# - 使用 NEST Field Boosting 的 Elasticsearch

转载 作者:可可西里 更新时间:2023-11-01 09:06:21 28 4
gpt4 key购买 nike

我正在使用 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)

较新的结果将浮到顶部。

通过使用提升查询,我们可以有效地降低缺少 award 字段的结果。

见: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-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)
)
)
);

关于c# - 使用 NEST Field Boosting 的 Elasticsearch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14358630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com