Elasticsearch自定义算法-FunctionScoreQueryBuilder

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();
       }
   }
### 回答1: 在使用Java的Elasticsearch High Level REST Client,可以在构建查询请求时通过设置权重来影响_score分数。 例如,可以使用带有boost参数的match query来设置字段的权重: ``` QueryBuilder qb = QueryBuilders.matchQuery("fieldName", "value").boost(2); ``` 这将导致匹配该字段的文档获得高于其他字段的分数。 你也可以使用 function_score query 来设置字段的权重,并且可以使用多种权重类型,例如: ``` QueryBuilder qb = QueryBuilders.functionScoreQuery( QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.fieldValueFactorFunction("fieldName").modifier(FieldValueFactorFunction.Modifier.LN1P).factor(2) ) ``` 这将对字段进行对数加权处理,其中权重为2。 请注意,在实际应用中,您需要根据您的数据和需求来调整权重。 ### 回答2: 在restHighLevelClient中,使用es _score分数设置权重可以通过设置查询条件来实现。 首先,我们需要创建一个QueryBuilder对象来构建我们的查询条件。可以使用MatchQueryBuilder、TermQueryBuilder、MultiMatchQueryBuilder等不同的查询构造器根据具体需求来构建查询条件。 接下来,在构建查询条件之后,我们可以通过调用QueryBuilder的boost方法来为特定的查询条件设置权重。boost方法接受一个浮点数参数,该参数用于指定查询条件的权重值,值越高代表权重越大。 例如,假设我们想要通过MatchQueryBuilder来设置某个字段的权重,可以按照以下方式进行设置: ``` MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("字段名", "查询词"); matchQueryBuilder.boost(2.0f); // 设置权重为2.0 ``` 这样,查询条件中包含该字段的文档将会被赋予较高的权重。权重越大,匹配结果的_score分数就会越高。 最后,我们可以将构建好的查询条件传递给SearchRequest来执行查询操作,通过调用restHighLevelClient的search方法并将SearchRequest作为参数传递进去。查询结果中的每个文档都会有一个_score分数,代表了该文档与查询条件的匹配程度。 需要注意的是,es _score分数是通过算法计算得出的,并不是我们直接设置的值。权重值的设置只是影响_score分数的计算过程。 ### 回答3: 在restHighLevelClient中,我们可以通过使用SearchRequest来设置查询的权重,而不是直接设置es _score分数的权重。 首先,创建一个SearchRequest对象,并设置索引名称和查询条件等相关参数。然后,创建一个SearchSourceBuilder对象,并使用QueryBuilders提供的各种查询方法来构建查询。这些查询方法包括matchQuery,termQuery,boolQuery等等,你可以根据自己的需求选择适合的查询方法。 在构建查询条件时,我们可以通过设置Boost属性来给某个字段设置权重。例如,通过调用field.boost(X)方法,可以给字段设置一个权重值X。这样,在计算es _score分数时,该字段的权重值会被考虑在内,对排序结果产生影响。 另外一个设置权重的方法是使用FunctionScoreQueryBuilder实现,其中可以使用各种函数来定义权重计算方式,例如将_es_score乘以一个权重因子或使用其他自定义函数进行计算。 最后,使用SearchRequest对象执行查询,并获取查询结果。在结果中,每个文档都会有一个es _score分数,该分数通过计算各个字段的权重得到,可以根据该分数对查询结果进行排序或过滤。 总结来说,虽然不能直接设置es _score分数的权重,但我们可以通过设置查询条件中各个字段的权重,以及使用函数计算等方式来间接影响es _score分数的计算结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值