• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Обновление Индексов Бд

  • Автор темы JohnLemon
  • Дата начала
J

JohnLemon

Здравствуйте, существует небольшая проблемка, использую поиск по вьюшке на xpages :
Код:
var tmpArray = new Array("");
var cTerms = 0;
if(sessionScope.searchFIO != null & sessionScope.searchFIO != "") {
tmpArray[cTerms++] = '(FIELD NamePatient = "*' + sessionScope.searchFIO + '*")';
}

if(sessionScope.searchNapr != null & sessionScope.searchNapr != "") {
tmpArray[cTerms++] = '(FIELD NDirection = "*' + sessionScope.searchNapr + '*")';
}

if(requestScope.dateStart != null & requestScope.dateStart != "") { 
var d = requestScope.dateStart;
//tmpArray[cTerms++] = "(FIELD Date = "*' + @Day(d)+"/"+@Month(d)+"/"+@Year(d) + '*")";
tmpArray[cTerms++] = "(FIELD DDirection >= " + @Day(d)+"/"+@Month(d)+"/"+@Year(d) + ")";
}

if(requestScope.dateEnd != null & requestScope.dateEnd != "") { 
var d = requestScope.dateEnd;
//tmpArray[cTerms++] = "(FIELD Date = "*' + @Day(d)+"/"+@Month(d)+"/"+@Year(d) + '*")";
tmpArray[cTerms++] = "(FIELD DDirection <= " + @Day(d)+"/"+@Month(d)+"/"+@Year(d) + ")";
}

qstring = tmpArray.join(" AND ").trim();
sessionScope.queryString = qstring; 
return qstring
После добавления новых данных, постоянно необходимо обновлять индексы в ручную иначе не находит, как сделать обновление в автомате, при загрузке страницы например ????
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ну по идее сервер сам должен обновлять виды.
Ну а если не случилось - у страницы есть серверное событие до загрузки. Там бери объект вида и обновляй... как LotusScript
 
J

JohnLemon

Ну по идее сервер сам должен обновлять виды.
Ну а если не случилось - у страницы есть серверное событие до загрузки. Там бери объект вида и обновляй... как LotusScript
А поподробнее можно ? Дело я думаю не в видах а индексах, во вьюхе на xpages я вижу это значение, а когда пытаюсь найти у меня пустая вьюшка, если захожу в properties бд, в индексы и делаю update то все находит норм.
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
67
Поиск полнотекстовый что ли? Дык полнотекстовый индекс мгновенно не обновляется.
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
3
Почитайте тут:

ну и тут

последние рекомендации имхо спорны - на счет db.updateFTIndex(true), использование FTUPDATE_IDLE_TIME_MS более правильно.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Так.. код поиска это хорошо, но давай процесс по порядку!
Откуда создается документ? Каким образом?
В нормальном виде новый документ созданный из web появляется сразу.. достаточно просто обновить контрол вида, но в поиске отобразится через n-времени после обновления индекса базы.
 
T

ty3uk

может начнём по другому, а что это за поиск такой?
как видно из начального поста, это фио+что-то+дата старт+дата енд.
Вот есть такая дикая необходимость создать документ и тут же его искать? Темболее по таким нехилым 4-рёхслойным запросом?
Ещё раз хочется напомнить, что это не реалиционка, и применять запросы можно, но не так часто. Если для реалиационки это единственный сопсоб показать инфу, это сделать запрос, то для лотусов есть вьюхи!!!
 
J

JohnLemon

Поиск полнотекстовый что ли? Дык полнотекстовый индекс мгновенно не обновляется.
Да полнотекстовый, а через сколько он обновляется и где можно настроить?
Вот есть такая дикая необходимость создать документ и тут же его искать?
Да есть необходимость, один человек будет заводить сотрудника, а второй потом искать минут через 5 максимум )
Откуда создается документ? Каким образом?
Через data, doc.save() сохраняю
 
T

ty3uk

а вот когда создаёшь полнотекстовый индекс, в окошке, внимательней посмотри ;-)
 
T

ty3uk

а как вы дожидаетесь? Как это выглядит? Что должно произойти? Сервак подойдёт к вам со спины, пошлёпает по плечу и скажет: "Мой генерал, по вашему заданию печенюшки были захвачены!" Так чтоли? Опиши как обязан выглядеть момент того, что сервак создал индексы. Также опиши как ты проверяешь, что у тебя все документы проиндексированны.
 
J

JohnLemon

а как вы дожидаетесь? Как это выглядит? Что должно произойти? Сервак подойдёт к вам со спины, пошлёпает по плечу и скажет: "Мой генерал, по вашему заданию печенюшки были захвачены!" Так чтоли? Опиши как обязан выглядеть момент того, что сервак создал индексы. Также опиши как ты проверяешь, что у тебя все документы проиндексированны.
В том то и дело что я не знаю как проверять и как обновлять, я создал индекс там указал обновление immediate. Добавляю запись, во вьюшке она есть, а если в поиске забиваю это значение - вьюшка становиться пустой, то есть не находит. Вообще необходимо так, есть сотрудник, он забивает карточку сотрудника, далее в в другом кабинете другой пользователь уже будет искать эту карточку. Поиск необходим по нескольким полям например по дате и фио и статусу и т.д. Может быть есть более простое решение ? без индексов ?
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
67
Вообще необходимо так, есть сотрудник, он забивает карточку сотрудника, далее в в другом кабинете другой пользователь уже будет искать эту карточку.
Есть еще 3 варианта (как минимум).
1. Нарисовать красивый вид со всеми нужными полями и сортировками - пусть смотрят в нем.
2. Использовать метод Search - медленный, но не требует полнотекстового индекса.
3. Написать свой поиск - перебирать документы, проверять поля. В случае с XPages, наскока я понимаю, можно хранить коллекцию док-тов (или даже массивы значений их полей) в глобальной переменной. Т.е., можно иметь кэш...
 
H

hosm

>Вообще необходимо так, есть сотрудник, он забивает карточку сотрудника, далее в в другом кабинете другой пользователь уже будет искать эту карточку.
Если используется одна и та же БД и у пользователей настроена почта - можно прислать письмо другому пользователю о том, что создана/заполнена карточка сотрудника со ссылкой на документ и ему достаточно пройти по ссылке и искать не надо будет.
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
67
Если используется одна и та же БД и у пользователей настроена почта - можно прислать письмо другому пользователю о том, что создана/заполнена карточка сотрудника со ссылкой на документ и ему достаточно пройти по ссылке и искать не надо будет.
Или завести папку - "Новые докуметы", и все вновь созданные кидать в нее. Ночью чистить.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Странный какой-то процесс.
Ну вместо полнотекстового поиска можно попробовать обойтись ключами. У вида свойства keys.
Это может быть одно поле или группа полей.
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
JohnLemon, похоже Вы не врубаетесь в сам процесс.
"Вьюшка" на странице (как Вы её называете) может не иметь ничего общего с notesView - это просто таблица с данными. И не важно, как она нарисована: штатными контролами - repeat, view, datatable ... или хоть врукопашную - сами из строк\полей составили. И неважно, как её набили данными.
При использовании отбора данных в неё с помощью полнотекстового поиска перед отбором надо обновлять полнотекстовый индекс.
Если база на сервере - он это делает сам, но не сразу. Если на клиенте - надо вручную (кнопой или скриптом). В любом случае, такая работа очень накладна по ресурсам. В вашем случае не надо так делать.
Если Source для "вьюшки" notesView, индекс View (не путать с полнотекстовым), обновляется автоматом, если в view попадает новый док (или удаляется).
Можно, например так, берёте notesView где отобраны ВСЕ нужные Вам доки (SELECT Form = "моя форма" + ещё что-то, например), перебираете все доки оттуда, сравнивая нужные поля по критерию отбора.
"Правильные" доки собираете в какой нибудь Array, который и скармливаете репитеру (или dataTable или ещё как...).
Получается полная аналогия Folder из классики.
Можно использовать просто штатные контролы (что логичнее всего) View или dataTable (c Source = Ваш notesView) сразу отфильтровав (by category name or by column value).
ЗЫ
если by column value, в колонке можно "собрать" инфу из всех нужных полей и использовать частичное сравнение (без exact match).
Сравнивается строка с шаблоном слева-направо.
 
S

susinmn

После добавления новых данных, постоянно необходимо обновлять индексы в ручную иначе не находит, как сделать обновление в автомате, при загрузке страницы например ????
Попробуй так -
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
67
susinmn, подозреваю, что полнотекстовое индексирование все-таки задумывалось как неспешная, фоновая задача.
Иначе наверняка существовал бы метод у NotesDocument типа PutInFullTextIndex (ну как PutInFolder, скажем :) Т.е., сохранил док-т, тут же (синхронно) его включил в поиск.
NickProstoNick, вот-вот - у БАЗЫ-то есть метод, у ДОКУМЕНТА нет. Это значит, что процесс пройдется по базе, отберет коллекцию новых/измененных документов и будет их индексировать, но фиг знает в каком порядке и с каким приоритетом... Не случайно обычная переиндексация видов как бы состоит из 3-х подсистем...
ЗЫ. В принципе, Update и потом сразу Select было бы неплохо, но... не наши это методы, не лотусовые...
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
susinmn, подозреваю, что полнотекстовое индексирование все-таки задумывалось как неспешная, фоновая задача.
Иначе наверняка существовал бы метод у NotesDocument типа PutInFullTextIndex (ну как PutInFolder, скажем :) Т.е., сохранил док-т, тут же (синхронно) его включил в поиск.
Ну у базы данных есть принудительное обновление индекса
JavaScript:
if (database.isFTIndexed()) {
database.updateFTIndex(false)
} else {
database.createFTIndex(0, true)
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!