Формулировка проблемы: при поиске большого
количества данных по форме или записей реестра метод
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"} ] }