Elasticsearch自定义算法-FunctionScoreQueryBuilder-程序员宅基地

技术标签: JAVA  

GET /user_info/_search
{
    
  "explain": true, 
  "query": {
    
    "function_score": {
    
      "query": {
    
        "bool": {
    
          "should": [
            {
    "range": {
    "age": {
    "gte": 18,"lte": 38}}},
            {
    "range": {
    "height": {
    "gte": 160,"lte": 175}}},
            {
    "range": {
    "weight": {
    "gte": 45,"lte": 65}}},
            {
    "match_phrase": {
    "roley_type": "VIP用户"}},
            {
    "match_phrase": {
    "roley_type": "VIP用户"}},
            {
    "match": {
    "emotional_state": 4}},
            {
    "match": {
    "purpose": "聊天,朋友,约会"}}
          ],
          "filter": [
            {
    "term": {
    "gender": "女"}},
            {
    "term": {
    "status": 0}},
            {
    "term": {
    "user_status": 999}}
          ]
        }
      },
      "functions": [
        {
    
          "gauss": {
    
            "age": {
    
              "origin": 22,
              "scale": 4,
              "offset": 2
            }
          },
          "weight": 10
        },
        {
    
          "gauss": {
    
            "height": {
    
              "origin": 160,
              "scale": 10,
              "offset": 5
            }
          },
          "weight": 10
        },
        {
    
          "gauss": {
    
            "weight": {
    
              "origin": 60,
              "scale": 10,
              "offset": 3
            }
          },
          "weight": 10
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}
   public void seltest(){
    
       try {
    
           SearchRequest searchRequest = new SearchRequest("user_info");
           SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
           BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
           boolQueryBuilder.should(QueryBuilders.rangeQuery("age").gte(18).lte(38));
           boolQueryBuilder.should(QueryBuilders.rangeQuery("height").gte(160).lte(175));
           boolQueryBuilder.should(QueryBuilders.rangeQuery("weight").gte(45).lte(65));
           boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("roley_type","VIP"));
           boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("roley_type","VIP"));
           boolQueryBuilder.should(QueryBuilders.matchQuery("emotional_state",4));
//           String[] purposes = new String[]{"聊天","朋友","约会"};
//           List<String> purposesList = Arrays.asList(purposes);
           boolQueryBuilder.should(QueryBuilders.matchQuery("purpose","聊天,朋友,约会").operator(Operator.AND));
           boolQueryBuilder.filter(QueryBuilders.termsQuery("gender","女"));
           boolQueryBuilder.filter(QueryBuilders.termsQuery("status","0"));
           boolQueryBuilder.filter(QueryBuilders.termsQuery("user_status","999"));


           GaussDecayFunctionBuilder age = ScoreFunctionBuilders.gaussDecayFunction("age", 22, 4, 2).setWeight(10);
           GaussDecayFunctionBuilder height = ScoreFunctionBuilders.gaussDecayFunction("height", 160, 10, 5).setWeight(10);
           GaussDecayFunctionBuilder weight = ScoreFunctionBuilders.gaussDecayFunction("weight", 60, 10, 3).setWeight(10);
           FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders =
                   new FunctionScoreQueryBuilder.FilterFunctionBuilder[3];

           filterFunctionBuilders[0] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(age);
           filterFunctionBuilders[1] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(height);
           filterFunctionBuilders[2] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(weight);


           FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, filterFunctionBuilders).scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM);
           searchSourceBuilder.query(functionScoreQueryBuilder);

           //向搜索请求对象中设置搜索源
           searchRequest.source(searchSourceBuilder);
           //发送搜索请求
           log.info("查询准备     ");

           SearchResponse searchResponse = null;
           //此处未做ES Client的吊起 所以做try catch
           try {
    
               log.info("client为"+client);
               searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
           } catch (Exception e) {
    
               log.info("重新发起查询------");
               searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
           }

           log.info("查询已完成  - 查询社区首页    -- searchResponse "+searchResponse);
           SearchHit[] searchHits = searchResponse.getHits().getHits();
           if (searchHits == null || searchHits.length <= 0) {
    
               log.info("--------------搜索结果为空 ---------- ");
           }
           for (SearchHit hit : searchHits) {
    
               String sourceAsString = hit.getSourceAsString();
               log.info("当前查询结果 :" + JSON.toJSON(sourceAsString));
           }
       } catch (Exception e) {
    
           e.printStackTrace();
       }
   }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43292052/article/details/112297768

智能推荐

C语言作业(四)-程序员宅基地

文章浏览阅读70次。【代码】C语言作业(四)

JavaScript语法高亮库highlight.js使用_语法高亮js css文件-程序员宅基地

文章浏览阅读9.9k次。highlight.js是一款基于JavaScript的语法高亮库,目前支持125种编程语言,有63种可供选择的样式,而且能够做到语言自动识别,和目前主流的JS框架都能兼容,可以混合使用。这款高亮库可以用在博客系统中,其使用方法及其简单,几乎不需要任何学习成本,下面介绍highlight.js的使用。1.获取highlight.js库,用户可以从官网获取:地址:https://highlightjs_语法高亮js css文件

【笔记】strftime的使用方法-程序员宅基地

文章浏览阅读5.1k次。strftimestrftime是C语言标准库中用来格式化输出时间的的函数。下面是strftime的用法各参数意义代码使用示例#include<stdio.h>#include<time.h>#define print(s1, s2,s3) \ printf("%-20s%-30s%s\n",s1, s2,s3);int main(){ time_t rawtime; struct tm* timeinfo; char timE[80]; /

2018.09.12 poj3621Sightseeing Cows(01分数规划+spfa判环)-程序员宅基地

文章浏览阅读147次。传送门 01分数规划板题啊。 发现就是一个最优比率环。 这个直接二分+spfa判负环就行了。 代码:#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#include&lt;cmath&gt;#define N 1005#define...

hive sql的常用日期处理函数总结_hive sql 日期函数-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏14次。1)date_format函数(根据格式整理日期)  作用:把一个字符串日期格式化为指定的格式。select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss'); --日期字符串必须满足yyyy-MM-dd格式   结果:2017-01-01 00:00:002)date_add、date_sub函数(加减日期)  作用:把一个字符串日期格式加一天、减一天。select date_add('2019-01-01',1); ..._hive sql 日期函数

Android Studio使用百度语音合成是TTS时报错: ****.so文件找不到的有关问题_旧版的百度语言合成报错-程序员宅基地

文章浏览阅读2.1k次。使用百度语音合成过程时,一直error : notfint libgnustl_shared.so在项目工程gradle文件中添加如下代码段:sourceSets { main { jniLibs.srcDirs = ['libs'] } }..._旧版的百度语言合成报错

随便推点

探索Camera2Demo:一款深入理解Android Camera2 API的开源示例项目-程序员宅基地

文章浏览阅读267次,点赞5次,收藏9次。探索Camera2Demo:一款深入理解Android Camera2 API的开源示例项目项目地址:https://gitcode.com/wangshengyang1996/Camera2Demo项目简介Camera2Demo 是一个由wangshengyang1996开发并维护的Android应用示例,旨在帮助开发者更好地理解和使用Android的Camera2 API。该项目通过提供..._android camera2 demo

iOS10 适配、Xcode8配置总结①-程序员宅基地

文章浏览阅读121次。2019独角兽企业重金招聘Python工程师标准>>> ...

微信API证书过期,获取API证书_微信 apiv3证书 过期-程序员宅基地

文章浏览阅读10w+次。在做微信如:(退款、企业红包、企业付款)提现这些操作的时候,微信返回(具体哪个字段我忘记了)的信息是:证书过期,那么就需要重新获取证书,证书的获取前提条件:1:你需要有微信商户平台的商户号(类似电话号码的数字),和商户名称(比如公司名称)2:按照官方说明文档进行相应操作即可(按照这个做就行了)http://kf.qq.com/faq/161222NneAJf161222U7fARv.h..._微信 apiv3证书 过期

雷达探测项目仿真代码(Matlab代码实现)_探地雷达成像matlab-程序员宅基地

文章浏览阅读2.2k次。雷达探测是电磁威慑的重要组成。国外发达国家正从体系、平台、频段、架构、硬件、处理等方面开发新一代雷达技术。针对高超声速目标、弹道导弹、无人集群目标、隐身飞机等新型极高速、极隐身、极庞大目标,将以网络为基础,整合各类探测手段,实现对目标的全球预警、全程连续跟踪、全维协同精确打击,形成全域全时全维的体系化探测感知能力。对深空目标、临空目标、隐身目标、集群目标的探测研究新型威胁目标是驱动雷达探测技术前进的原动力之一,而新时期的新型威胁目标呈现“高、低、快、慢、小、隐、群”等特征。_探地雷达成像matlab

kali 安装取证工具volatility_kali安装volatility-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏12次。计算机取证 volatility_kali安装volatility

html禁止图片缓存(刷新网站)_html禁止浏览器缓存图片-程序员宅基地

文章浏览阅读2.1k次。地址:https://blog.csdn.net/fareast_mzh/article/details/81464031_html禁止浏览器缓存图片

推荐文章

热门文章

相关标签