我正在使用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查询来实现
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) ) ) );