我在C#中使用弹性搜索,使用的是嵌套强类型客户端。我有一个包含条目的索引:
[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是条目获得的奖励类型,可以为空。
然后,我想使用boosting搜索这些条目以查找不同的属性。在下面的代码中,我希望匹配标题的结果比匹配描述的结果排名更高。
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))));
}我现在已经被要求提高那些已经获奖的人的结果,也提高新的条目(即按年)。
我该怎么做呢?它是需要作为索引服务的一部分,还是作为搜索的一部分?
发布于 2013-01-17 19:42:05
您可以通过组合使用boosting查询和custom_score查询来实现此目的
我们基于年份来改变分数,而不是提升年份,因为:
(_score + 2013) > (_score + 1999)较新的结果将浮动到顶部。
通过使用boosting查询,我们可以有效地将缺少奖励字段的结果降级。
请参阅: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)
)
)
);https://stackoverflow.com/questions/14358630
复制相似问题