如何通过增加与查询对应的文档的“booster”字段的值来更改主要分数

问题描述 投票:0回答:1

我正在寻找解决更改与查询对应的文档分数的问题的方法: 我需要通过增加与查询对应的文档的“booster”字段的值来更改主要分数。要请求文档搜索,我使用 NativeQuery.builder:

Query filmQuery = NativeQuery.builder()
            .withQuery(...)
    ...
    .build();

要更改估计,可以在 NativeQuery“.withRescorerQuery()”中应用一个选项,将 RescorerQuery rescorerQuery 传递给该选项, 包括 查询 rescoreQuery:

private final ***Query query***;
private ScoreMode scoreMode = ScoreMode.Default;
@Nullable private Integer windowSize;
@Nullable private Float queryWeight;
@Nullable private Float rescoreQueryWeight;
  1. 不清楚这个查询rescoreQuery中需要哪个查询来改变分数。 我假设可以应用“withScriptedField”,应将 ScriptedField 类型的对象传递给它。 反过来,scriptedField 由 String fieldName 和 ScriptData scriptData 组成。
  2. 不清楚fieldName中需要指定哪个字段名。 我已经直观地指定了名称“booster”,因为不清楚需要指定所需文档的哪些字段(如果我们正在谈论文档字段)。 ScriptData 的情况更有趣:当打开 ScriptData 类时,IDEA 开发环境会发出警告“Library source does not match the bytecode for class Script Data”。 我不知道JVM将如何编译代码, 但我已经以这种形式编译了脚本数据对象:
ScriptData scriptData = new ScriptData(ScriptType.INLINE
            , "painless"
            , "score += doc['booster'].value"
            , "newScore-script"
            , Collections.emptyMap());
  1. 如果 scriptData 有问题,我很乐意发表评论。

结果,这一切都在下面的代码中:

ScriptData scriptData = new ScriptData(ScriptType.INLINE
            , "painless"
            , "score += doc['booster'].value"
            , "newScore-script"
            , Collections.emptyMap());

    Query scriptQuery = NativeQuery.builder()
            .withScriptedField(new ScriptedField("booster", scriptData))
            .build();
    RescorerQuery rescorerQuery = new RescorerQuery(scriptQuery);

    Query filmQuery = NativeQuery.builder()
            .withQuery(q -> q.bool(b -> {...}))
    .withRescorerQuery(rescorerQuery)
            .withSort(sortParam.get())
            .withPageable(Pageable.ofSize(pageSize))
            .build();

//接下来,此请求将作为此代码中的 List QueryList 的一部分传递:

    List<SearchHits<?>> searchHits = operations.multiSearch(queryList, classes, indexCoordinatesList);

关于此代码,“searchHits”会出现错误: 2023-10-14T11:43:13.972 + 05:00错误13640 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]:servlet [dispatcherServlet]的Servlet.service()在路径 [] 的上下文中抛出异常 [请求处理失败:co.elastic.clients.util.MissingRequiredPropertyException:缺少必需的属性“RescoreQuery.query”],其根本原因 如上所述:

RescorerQuery rescorerQuery = new RescorerQuery(scriptQuery);

如果您能帮助解决问题,我将不胜感激。

附注 最初,这样的请求被发送到索引,这给出了预期的结果:

{ "from": 0, "size": 100, "query": {
    "function_score": {
        "query":{
            "bool":{ 
                "must": {
            "match": {
              "title": {
                "query": "Fan"
              }
            }
          },
            "filter":[
                {"match":{"age":18}},
                {"bool":{
                "filter":[
                    { "terms":
                    { "genres.uuidGenre": ["c6bee588-3b47-4307-ba00-40764d50a57a", "fe6b5d15-bf73-4b34-a02e-13d110c89a3f"] } },
                    { "terms": { "countries.uuidCountry": ["24cb3786-d85c-418c-af90-c719c2a5a796" , "ee88f16d-8492-42d8-8dff-3cd0f10d7121"] } }
                    ] 
                }
                } 
            ]
            }
        },
        "field_value_factor": {
            "field": "booster",
            "modifier": "log2p"
        }
    }    } }

结果,我找到了使用“FunctionScoreQueryBuilder”的解决方案,但我不知道如何实现它,更不用说如何将此函数传递给查询或“operations.multiSearch”

elasticsearch spring-data-elasticsearch
1个回答
0
投票

通过增加它来更改主要分数与查询对应的文档的“助推器字段”的值

如果你想调整原始分数而不是替换它,你应该使用

function_score
而不是查询重新评分。我没有 Spring 数据设置,但这里有一个示例,您可以在 Kibana 控制台中运行来看看我的意思:

PUT test/_bulk?refresh
{"index": {}}
{"foo": "bar", "val": 10 }
{"index": {}}
{"foo": "bar", "val": 2 }
{"index": {}}
{"foo": "bar", "val": 0 }
{"index": {}}
{"foo": "baz", "val": 10000 }

GET test/_search
{
  "query": {
    "function_score": {
      "boost_mode": "sum",
      "query": {
        "match": {
          "foo": "bar"
        }
      },
      "field_value_factor": {
        "field": "val",
        "missing": 1
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.