我正在寻找解决更改与查询对应的文档分数的问题的方法: 我需要通过增加与查询对应的文档的“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;
ScriptData scriptData = new ScriptData(ScriptType.INLINE , "painless" , "score += doc['booster'].value" , "newScore-script" , Collections.emptyMap());
结果,这一切都在下面的代码中:
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”
通过增加它来更改主要分数与查询对应的文档的“助推器字段”的值
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
}
}
}
}