如何使用异常条件对多个字段进行排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用异常条件对多个字段进行排序相关的知识,希望对你有一定的参考价值。
我不能使用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应该处于非活动状态,并且它们应该具有相同的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);
如果您正在寻找,请告诉我们!
以上是关于如何使用异常条件对多个字段进行排序的主要内容,如果未能解决你的问题,请参考以下文章