我无法使用 FieldSortBuilder 按多个字段排序并执行异常条件。所以我想知道我们可以使用无痛来做到这一点吗?
下面是数据模型。
{ "name" : "string",
"email" : "string",
"schoolNumber" : "number",
"startTime" : "number",
"endTime" : "number",
}
示例:
{ "name" : "Micheal",
"email" : "mi@gmail.com",
"schoolNumber": 1,
"startTime" : 123,
}
{ "name" : "Racheal",
"email" : "ra@gmail.com",
"schoolNumber": 1,
"startTime" : 456,
"endTime" : 789,
}
{ "name" : "Racheal",
"email" : "ra@gmail.com",
"schoolNumber": 2,
"startTime" : 987,
}
只有 endTime 是可选的。我想按 asc 对 startTime 中的所有配置文件进行排序,这些配置文件只有 startTime,endTime 应该处于非 Activity 状态,并且它们应该具有相同的 schoolNumber。
public static final String SORT_SCRIPT =
"if (doc['endTime.raw'].value == null) {
//sort by startTime which have same schoolNumber
} else {
//sort by endTime which have same schoolNumber
}";
另一个解决方案:我想使用 FieldSortBuilder 设置nestedFiler 以排除 endTime
sortBuilder.setNestedFilter(new TermQueryBuilder(LICENSE_ASSIGNMENT_ACTIVATION_TIME_PROPERTY, value:???)
但我不知道如何设置值。我尝试过“null”“false”“ScoreMode.None”。全部失败。
这是我的想法。首先让我向您分享 Elasticsearch 查询如何完成此操作。
请注意,我使用了 Exists Query .
Elasticsearch DSL 请求
POST <your_index_name>/_search
{
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "endTime"
}
}
]
}
},
"sort": [
{
"startTime": {
"order": "desc"
}
}
]
}
我所做的只是在查询级别执行过滤条件,这意味着使用上述查询,我最终只会得到没有endTime
的文档,并且在这些文档上实际上对startTime
字段执行排序操作。
下面是如何通过 Java API 完成的。
Java API:
SearchRequest searchRequest = new SearchRequest("<your_index_name>");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//Exists Query
searchSourceBuilder.query(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("endTime")));
//Sort Logic
FieldSortBuilder mySort = SortBuilders.fieldSort("startTime").order(SortOrder.DESC);
searchSourceBuilder.sort(mySort);
searchRequest.source(searchSourceBuilder);
请告诉我这是否是您正在寻找的内容!
我是一名优秀的程序员,十分优秀!