Как отсортировать несколько полей с условием исключения - PullRequest
1 голос
/ 16 апреля 2019

Я не могу использовать 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 является необязательным.Я хочу отсортировать все профили в startTime по asc, эти профили имеют только 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:???)

Но я не знаю, как установить значение.Я пытался с «ноль» «ложь» «ScoreMode.None».Все не удалось.

1 Ответ

0 голосов
/ 17 апреля 2019

Вот то, что я придумал.Сначала позвольте мне поделиться с вами запросом Elasticsearch о том, как это можно сделать.

Обратите внимание, что я использовал Запрос к существованию .

Запрос Elasticsearch DSL

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "endTime"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "startTime": {
        "order": "desc"
      }
    }
  ]
}

Я просто выполнилусловие фильтрации на уровне запроса , что означает использование вышеупомянутого запроса, я получаю только документы без endTime и на этих документах фактически выполняю операцию сортировки на поле startTime.

Ниже описано, как это делается через Java API.

API Java:

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);

Дайте мне знать, если это то, что вы ищете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...