首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌套域Boosting的弹性搜索

使用嵌套域Boosting的弹性搜索
EN

Stack Overflow用户
提问于 2013-01-16 20:36:07
回答 1查看 6.7K关注 0票数 10

我在C#中使用弹性搜索,使用的是嵌套强类型客户端。我有一个包含条目的索引:

代码语言:javascript
复制
[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搜索这些条目以查找不同的属性。在下面的代码中,我希望匹配标题的结果比匹配描述的结果排名更高。

代码语言:javascript
复制
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))));
}

我现在已经被要求提高那些已经获奖的人的结果,也提高新的条目(即按年)。

我该怎么做呢?它是需要作为索引服务的一部分,还是作为搜索的一部分?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-17 19:42:05

您可以通过组合使用boosting查询和custom_score查询来实现此目的

我们基于年份来改变分数,而不是提升年份,因为:

代码语言:javascript
复制
(_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

代码语言:javascript
复制
_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)
        )
    )
);
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14358630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档