精华内容
下载资源
问答
  • 以前总是写点东西就想着发布, 然而看过太多为了世界奉献自己, 最终被世界人抛弃的故事了, 以后就想着,随便写写吧,管他...感慨到:原来人可以读这么多书,,,原文链接 惭愧惭愧,,, 吾日三省吾身···...
    以前总是写点东西就想着发布,
    
    然而看过太多为了世界奉献自己,
    最终被世界人抛弃的故事了,
    
    
    以后就想着,随便写写吧,管他呢,
    今天看到一个个人博客,
    然后看到人家读的书单,
    感慨到:原来人可以读这么多书,,,原文链接
    惭愧惭愧,,,

    吾日三省吾身···

    展开全文
  • ,ElasticSearch字段权重排序居然可以这么
    展开全文
  • 在很复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。首先初始化三条测试数据,方便查看效果:{id: 1,title: "Java怎么学...

    背景

    读者提问:ES 的权重排序有没有示列,参考参考?

    刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下。

    在很多复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。

    首先初始化三条测试数据,方便查看效果:

    {

    id: 1,

    title: "Java怎么学",

    type: 3,

    userId: 1,

    tags: [

    "java"

    ],

    textContent: "我要学Java",

    status: 1,

    heat: 80

    }

    {

    id: 2,

    title: "Java怎么学",

    type: 2,

    userId: 1,

    tags: [

    "java"

    ],

    textContent: "我要学Java",

    status: 1,

    heat: 99

    }

    {

    id: 3,

    title: "Java怎么学",

    type: 1,

    userId: 1,

    tags: [

    "java"

    ],

    textContent: "我要学Java",

    status: 1,

    heat: 100

    }

    type:1 为翻译,2 为转载,3 为原创

    需求是查询 userId=1 的所有文章,按照热度降序排序,但是原创类型的文章要显示在前面,优先级高于热度。

    如果我们简单的按照热度排序的话,那么顺序肯定是 id 为 3(热度:100),2(热度:99),1(热度:80)这样排列的。

    但是原创类型的要在前面,那么结果应该是 1(热度:80,类型:原创),3(热度:100,类型:翻译),2(热度:99,类型:转载)。

    排序条件肯定是以热度来进行的,这个是肯定的。唯一需要处理的就是怎么将原创类型的排在前面,如果只考虑实现,方式还是有很多种的。

    比如:原创类型的热度值可以调的比较高,但是呢,热度值要重新弄一个字段,只用于排序,给用户展示的还是之前的热度值,这样排序就简单了,还是根据热度排就可以实现效果。

    weightFactorFunction

    在 ES 搜索结果中_score 这个字段相信大家并不陌生,这是 ES 给出的评分,我们可以根据评分来排序,然后将原创类型的评分提高就可以实现想要的效果。

    直接看 Java 代码吧,通过 FunctionScoreQueryBuilder 来构建查询。

    @Test

    public void testSort() {

    FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{

    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 3), ScoreFunctionBuilders.weightFactorFunction(100)),

    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 2), ScoreFunctionBuilders.weightFactorFunction(1)),

    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("type", 1), ScoreFunctionBuilders.weightFactorFunction(1))

    };

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    boolQuery.must(QueryBuilders.termQuery("userId", 1));

    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);

    searchSourceBuilder.query(functionScoreQueryBuilder)

    .sort("_score", SortOrder.DESC)

    .sort("heat", SortOrder.DESC);

    SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());

    searchRequest.types(EsConstant.DEFAULT_TYPE);

    searchRequest.source(searchSourceBuilder);

    List searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);

    searchResults.forEach(doc -> {

    System.out.println(doc.getId() + "\t" + doc.getType() + "\t" + doc.getHeat());

    });

    }

    通过 ScoreFunctionBuilders.weightFactorFunction 为文章类型设置对应的权重,原创文章权重为 100,其他的都为 1,这样原创文章的得分就高于其他类型的文章。

    在排序的时候优先得分排序,然后热度排序。就可以得到我们想要的结果了。

    scriptFunction

    除了使用 weightFactorFunction 来设置权重,另外介绍一种灵活度更高,适用于更复杂的排序场景的方式 scriptFunction。

    scriptFunction 允许我们通过脚本的方式来实现权重,直接看代码:

    @Test

    public void testSort() {

    String scoreScript = "if (doc['type'].value == 3) {" +

    " return 100;" +

    "} else {" +

    " return 1;" +

    "}";

    FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{

    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.scriptFunction(new Script(scoreScript)))

    };

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    boolQuery.must(QueryBuilders.termQuery("userId", 1));

    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);

    searchSourceBuilder.query(functionScoreQueryBuilder)

    .sort("_score", SortOrder.DESC)

    .sort("heat", SortOrder.DESC);

    SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());

    searchRequest.types(EsConstant.DEFAULT_TYPE);

    searchRequest.source(searchSourceBuilder);

    List searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);

    searchResults.forEach(doc -> {

    System.out.println(doc.getId() + "\t" + doc.getType() + "\t" + doc.getHeat());

    });

    }

    scoreScript 就是控制权重的脚本,也就是一段代码(脚本默认是 groovy),是不是方便的多。

    关于作者:

    展开全文
  • 在很复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。首先初始化三条测试数据,方便查看效果:{ id: 1, title: "Java怎么...

    背景

    读者提问:ES 的权重排序有没有示列,参考参考?

    刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下。

    在很多复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。

    首先初始化三条测试数据,方便查看效果:

    {    id: 1,    title: "Java怎么学",    type: 3,    userId: 1,    tags: [        "java"    ],    textContent: "我要学Java",    status: 1,    heat: 80}{    id: 2,    title: "Java怎么学",    type: 2,    userId: 1,    tags: [        "java"    ],    textContent: "我要学Java",    status: 1,    heat: 99}{    id: 3,    title: "Java怎么学",    type: 1,    userId: 1,    tags: [        "java"    ],    textContent: "我要学Java",    status: 1,    heat: 100}

    type:1 为翻译,2 为转载,3 为原创

    需求是查询 userId=1 的所有文章,按照热度降序排序,但是原创类型的文章要显示在前面,优先级高于热度。

    如果我们简单的按照热度排序的话,那么顺序肯定是 id 为 3(热度:100),2(热度:99),1(热度:80)这样排列的。

    但是原创类型的要在前面,那么结果应该是 1(热度:80,类型:原创),3(热度:100,类型:翻译),2(热度:99,类型:转载)。

    排序条件肯定是以热度来进行的,这个是肯定的。唯一需要处理的就是怎么将原创类型的排在前面,如果只考虑实现,方式还是有很多种的。

    比如:原创类型的热度值可以调的比较高,但是呢,热度值要重新弄一个字段,只用于排序,给用户展示的还是之前的热度值,这样排序就简单了,还是根据热度排就可以实现效果。

    weightFactorFunction

    在 ES 搜索结果中_score 这个字段相信大家并不陌生,这是 ES 给出的评分,我们可以根据评分来排序,然后将原创类型的评分提高就可以实现想要的效果。

    直接看 Java 代码吧,通过 FunctionScoreQueryBuilder 来构建查询。

    @Testpublic void testSort() {    FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{            new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 3), ScoreFunctionBuilders.weightFactorFunction(100)),            new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 2), ScoreFunctionBuilders.weightFactorFunction(1)),            new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("type", 1), ScoreFunctionBuilders.weightFactorFunction(1))    };    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();    boolQuery.must(QueryBuilders.termQuery("userId", 1));    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);    searchSourceBuilder.query(functionScoreQueryBuilder)            .sort("_score", SortOrder.DESC)            .sort("heat", SortOrder.DESC);    SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());    searchRequest.types(EsConstant.DEFAULT_TYPE);    searchRequest.source(searchSourceBuilder);    List searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);    searchResults.forEach(doc -> {        System.out.println(doc.getId() + "" + doc.getType() + "" + doc.getHeat());    });}

    通过 ScoreFunctionBuilders.weightFactorFunction 为文章类型设置对应的权重,原创文章权重为 100,其他的都为 1,这样原创文章的得分就高于其他类型的文章。

    在排序的时候优先得分排序,然后热度排序。就可以得到我们想要的结果了。

    scriptFunction

    除了使用 weightFactorFunction 来设置权重,另外介绍一种灵活度更高,适用于更复杂的排序场景的方式 scriptFunction。

    scriptFunction 允许我们通过脚本的方式来实现权重,直接看代码:

    @Testpublic void testSort() {    String scoreScript = "if (doc['type'].value == 3) {" +            "   return 100;" +            "} else {" +            "   return 1;" +            "}";    FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{            new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.scriptFunction(new Script(scoreScript)))    };    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();    boolQuery.must(QueryBuilders.termQuery("userId", 1));    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);    searchSourceBuilder.query(functionScoreQueryBuilder)            .sort("_score", SortOrder.DESC)            .sort("heat", SortOrder.DESC);    SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());    searchRequest.types(EsConstant.DEFAULT_TYPE);    searchRequest.source(searchSourceBuilder);    List searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);    searchResults.forEach(doc -> {        System.out.println(doc.getId() + "" + doc.getType() + "" + doc.getHeat());    });}

    scoreScript 就是控制权重的脚本,也就是一段代码(脚本默认是 groovy),是不是方便的多。

    关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号猿天地发起人。

    我整理了一份很全的学习资料,感兴趣的可以微信搜索「猿天地」,回复关键字 「学习资料」获取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分库分表,任务调度框架 XXL-JOB,MongoDB,爬虫等相关资料。

    展开全文
  • 最近公司内部在搞一个有意思的活动,内部模拟面试。 本次活动内容侧重Java相关的生态圈。不过其他的语言生态圈和领域,思路和道理也可以借鉴 目的 让小伙伴更清晰的知道自己当前的情况。包括技术、项目、管理及...
  • 自 6 月 30 日开售以来,《Visual Studio Code 权威指南》受到了许多读者朋友的青睐。在京东和当当两大平台上,都分别取得了不错的成绩:当当:计算机新书热卖榜第一名京东...
  • 在很复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。 首先初始化三条测试数据,方便查看效果: { id: 1, title: “Java...
  • 在很复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。首先初始化三条测试数据,方便查看效果:{id: 1,title: "Java怎么学...
  • 在很复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。首先初始化三条测试数据,方便查看效果:{ id: 1, title: "Java怎么...
  • :shortcake: 这么强大的音乐API框架 介绍 强大的音乐API框架可加速您的开发 优雅-易于使用,适用于所有音乐平台的标准化格式。 轻量级-单个文件库小于46KB。 强大-支持各种音乐平台,包括腾讯,网易,夏米,...
  • 雷达图可以同时对单个系列或个系列进行个类别的对比,尤其适用于系列之间的综合对比。 需注意的是,必须有3个及以上的维度,才适合制作雷达图。当然,维度也不宜过多,否则既影响美观,也会大大降低图表的...
  • 雷达图可以同时对单个系列或个系列进行个类别的对比,尤其适用于系列之间的综合对比。 需注意的是,必须有3个及以上的维度,才适合制作雷达图。当然,维度也不宜过多,否则既影响美观,也会大大降低图表的...
  • 点名咯: [color=#FF0000]迷雾、敏敏、半夏、旋律、依依、小梦梦、杯杯、鑫儿、 杨MM 、沐沐、倩倩、忆晨、毛球、小珍、丽丽、小懒、[/color] 排名部分先后、还有部分不是太熟的木有点名、反正以后慢慢就熟...
  • 但是如果这个对象有很属性呢? 那岂不是太麻烦了,针对这种情况就可以使用我们的原型模式来实现。 原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝原型,从而创建新的对象。 原型模式是一种创建型的...
  • 一个Aria的小demo,主要是下载的使用,
  • 部分代码如下: String hql=" select min(e.age),max(age) from Emp e "; Query query=session.createQuery(hql); List emps=query .list(); ... for (Iterator iterator = emps.iterator();...
  • 之前有提到过小红书一直都在扶持视频笔记的流量,也有越来越的创作者愿意尝试用视频笔记的形式来发布内容、分享生活。那么在我们创作小红书视频笔记的时候,有没有什么好方法可以快速get爆款视频呢?到底什么样的...
  • 我就觉得好风光,好厉害,好牛逼,好想认识! 于是我统统舔脸挨着加微信,本以为会交上一波好资源, 但80%的人一周后毫无交集,剩下20%的人连招呼都没来得及打, 就已消失在我的朋友圈。 而后来我才发现: 成年人之间的...
  • 心上一画前言动画作为一个团队艺术,包含的东西且广,想要一下子说完肯定不现实。(随便一个镜头的成片都包含着所有工作人员的努力和心血。)所以今后也还会不定期地和小伙伴们一起探讨,并告诉大家我所知道的一切...
  • 可是当我们有很多图片,并且每个图片都有一个loaddingview作为加载标识的时候,我们的loaddingview就需要性能优化一下了,因为如果这么多loaddingview同时出现,因为我们是在属性动画中不断更新view的,
  • 说到高薪职业,想必很职场朋友都会想到程序员,程序员的工资究竟有高呢?其实现在网络发展的这么快,工资也很透明了,都说程序员这份工作是既能赚钱又有工作保障的金饭碗,这份高薪职业真的是让很多人都为之心动...
  • 不过,目前的笔记本电脑市场让很萌妹子和二次元的小姐姐们完全接受不了。千篇一律的日系“性冷淡”风格,家家主打纯色调的靓丽银灰色配色,这当然与将“粉嘟嘟”作为日常的女生们格格不入。那怎么办呢?当然是将...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 419
精华内容 167
关键字:

哇这么多