首页 > 解决方案 > java中的Elasticsearch条件评分

问题描述

我是 Elastic Search 的新手,我想问一下如何根据某些条件从查询中提升某些结果。具体来说,Elastic Search 中的项目具有以下格式:

"name":"item1",
"desc":"desc1",
"brand":"brandname"

我想让某些项目(带有 的项目"brand" = "nike")的分数低于其他品牌的分数。有没有办法使用 java 用于弹性搜索的 QueryBuilders 类来做到这一点?

标签: javaelasticsearch

解决方案


要提升某个字段的某个值(反之亦然),您可以使用Function score query. 在这里查看官方文档

让我给你看一个例子:

    POST /goods/_search
    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "name": "shoes"
            }
          },
          "functions": [
            {
              "filter": {
                "term": {
                  "maker": "nike"
                }
              },
              "weight": 0
            }
          ],
          "boost_mode": "multiply"
        }
      },
      "sort": [
        {
          "_score": {
            "order": "desc"
          }
        }
      ]
    }

该查询是指“我正在寻找与字段中的关键字匹配的文档,shoes并以.等于 0)。”name_scorenikemaker

在 Java 代码中,

    String indexName = "goods"
    String nameField = "name";
    String makerField = "maker";

    String keyword = "shoes";
    String unnecessaryMaker = "nike";
    
    MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder(nameField, keyword);
    FilterFunctionBuilder[] filterFunctions = {
        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
            QueryBuilders.termQuery(makerField, unnecessaryMaker),
            ScoreFunctionBuilders.weightFactorFunction(0)
        )
    };
            
    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(matchQueryBuilder, filterFunctions);
    functionScoreQueryBuilder.boostMode(CombineFunction.MULTIPLY);

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(functionScoreQueryBuilder);
        
    SearchRequest request = new SearchRequest();
    request.indices(indexName);
    request.source(searchSourceBuilder);

有几个boost_mode,例如乘法(默认),替换,求和,平均,最大值,最小值。因此,您可以将此代码应用于您的需求。

希望这就是你要找的。


推荐阅读