Формулировка проблемы: при поиске большого
количества данных по форме или записей реестра метод
rest/api/asforms/search работает достаточно
медленно.
Решение: необходимо реализовать новый метод, который использует индекс. Для индекса должна быть создана отдельная папка в индексах.
URL метода: rest/api/asforms/search_index
Тип запроса: GET.
Метод принимает следующие входные параметры:
formUUID - идентификатор формы. Может быть
передано несколько значений;
formCode - код формы. Может быть передано
несколько значений;
search - поисковая строка. Может быть
передано несколько значений (необяз.);
field - названия компонентов. Может быть
передано несколько значений (необяз.);
type - тип сравнения (необяз.). Может
принимать значения:
exact - точное совпадение поискового
запроса и значения компонента;
partial - вхождения поискового запроса в
значение компонента;
sortField - название компонента, по которому
будет осуществлена сортировка. Может быть передано значений
(необяз.);
sortDir - направление сортировки. Может
принимать значения:
asc - по возрастанию;
desc - по убыванию;
Может быть передано несколько значений (необяз.). Любое другое
значение или его отсутствие будет интерпретировано как
asc.
sortType - тип сортировки содержимого поля.
Может принимать значения:
string - сортируется как строка;
decimal - сортируется как число;
Может быть передано несколько значений (необяз.). Любое другое
значение или его отсутствие будет интерпретировано как
string.
startRecord - номер записи результатов,
начиная с которого будут возвращены записи (отсчет с 0);
recordsCount - количество результатов,
которые надо вернуть;
showDeleted - необходимо ли в результатах
возвращать удаленные записи (по умолчанию
true).
searchInRegistry - необходимо передать
значение этого параметра false, если
осуществляется по данным форм, не входящим в реестр.
Метод возвращает следующие выходные параметры:
count - количество найденных совпадений;
data - массив, который состоит из следующих
параметров:
dataUUID - идентификатор данных формы;
documentID - идентификатор документа.
При формировании запроса все условия параметров поиска соединяются с
помощью оператора OR.
Например. В параметры поиска было передано:
два идентификатора формы (
formUUID1,formUUID2),два названия поля (
field1,field2),две поисковые строки (
search1,search2)тип сравнения
partial.Тогда в результатах поиска будут все записи по формам
formUUID1иformUUID2, у которых (field1содержитsearch1ИЛИfield2содержитsearch1ИЛИfield1содержитsearch2ИЛИfield2содержитsearch2).
Если не передать параметр field, то метод вернет
все данные данной формы.
Несколько наборов параметров поиска
Если необходимо наложить разные условия на разные поля формы, то
можно передать параметры поиска дополнительно, прибавив к названиям
параметров порядковый номер набора параметров. Количество наборов
параметров, которые можно добавить неограничено. Главное соблюдать
правильную нумерацию названий параметров: 1, 2, 3 и т.д. (первый
набор может не иметь порядкового номера). Таким образом, метод
должен получить дополнительный набор параметров
formUUID1, search1,
field1, type1, formUUID2, search2, field2, type2
и т.д. По-умолчанию условия различных наборов соединяются между
собой оператором ИЛИ, чтобы это изменить, необходимо передать
параметр term, который может принимать значения:
or - для объединения наборов условий оператором ИЛИ,
and - для объединения наборов условий
оператором И.
Пример запроса поиска всех записей реестра по форме
с идентификатором uuid, для
которых field1 равно
str1 и
field2 содержит
str2:
rest/api/asforms/search_index?formUUID=uuid&search=str1&field=field1&type=exact&formUUID1=uuid&search1=str2&field1=field2&type1=partial&term=and
Пример возвращаемого объекта:
{
count : 1000,
data :
[
{"dataUUID": "uuid1", "documentID": "docID1"},
{"dataUUID": "uuid2", "documentID": "docID2"},
{"dataUUID": "uuid3", "documentID": "docID3"}
]
}