java - java中的Elasticsearch条件评分
问题描述
我是 Elastic Search 的新手,我想问一下如何根据某些条件从查询中提升某些结果。具体来说,Elastic Search 中的项目具有以下格式:
"name":"item1",
"desc":"desc1",
"brand":"brandname"
我想让某些项目(带有 的项目"brand" = "nike"
)的分数低于其他品牌的分数。有没有办法使用 java 用于弹性搜索的 QueryBuilders 类来做到这一点?
解决方案
要提升某个字段的某个值(反之亦然),您可以使用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
_score
nike
maker
在 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
,例如乘法(默认),替换,求和,平均,最大值,最小值。因此,您可以将此代码应用于您的需求。
希望这就是你要找的。
推荐阅读
- python - 围绕乳房 X 光检查对象裁剪图像
- python - 根据python中的另一个数组值从数组中选择元素
- css - CSS网格,组件占用可变数量的正方形
- android - 无法通过 Tecmanic(Evanto) 构建项目 Gogrocery
- javascript - 如何将自定义光标移动到文本上
- r - Rshiny - Plotly 添加水印徽标以仅在下载启动时进行绘图
- python - 如何在 python 中使用 Selenium 打开 URL?
- typescript - TypeScript 字典中的类型推断
- ios - 代号一在崩溃后检索日志
- spring-data - 如何拥有多个 Spring Boot Repository(Interface) 实例以进行完整的测试状态隔离?