Запрос Для Ftsearch

ezhov

Active member
28.02.2013
37
0
#1
Товарищи, возникла необходимость оптимизации работы агента, долго выполняется обновление,при анализе кода было выявлено что большая часть времени тратится на операции поиска
DocumentCollection dc = database.search( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\"");
DocumentCollection dc = database.search( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\"");
DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");

Если верить интернетам метод FTSearch работает быстрее, но вот любой из этих запросов уже не работает если его вставить в FTSearch:

DocumentCollection dc = database.FTSearch( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\"");
DocumentCollection dc = database.FTSearch( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\"");
DocumentCollection dc = database.FTSearch("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");

эти варианты выдают ошибку типа error message: NotesException: Notes error: Query is not understandable ((Form ="Department" Form ="Subdivision") & @IsUnavailable($Conflict) & met!="1"& ID= "1000

Подскажите как правильно написать эти запросы для метода FTSearch или может какие нибудь еще варианты есть поиска ?
 

duchan

Well-known member
20.09.2006
110
3
#2
У FTSearch свой язык запросов, он не понимает @функции, см.Help Дизайнера, например, "Refining a search query using operators"
 

ezhov

Active member
28.02.2013
37
0
#3
У FTSearch свой язык запросов, он не понимает @функции, см.Help Дизайнера, например, "Refining a search query using operators"
Весь Help перерыт уже, но про синтаксис ничего не могу найти. Можете подсказать как тогда переделать хотя бы запрос DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");? тут вроде только поля без @функций
 

savl

Lotus team
28.10.2011
2 131
102
#4
для FTSearch попробуй:
Код:
searchQ$ = {Field Form ="Person" AND Field met !="1" AND Field TabNum = "} & tabNum & {"}
DocumentCollection dc = database.FTSearch( searchQ$, 0);
' Аналогично:
searchQ$ = {Field Form ="Department" OR Field Form = "Subdivision" AND Field met !="1" AND Field ID= "} & depID & {"}
searchQ$ = {Field Form ="Department" OR Field Form = "Subdivision" AND Field met !="1" AND Field ID= "} & parentId & {"}
Конфликты отобрать нельзя по идее, так как служебные поля могут не индексироваться, но в процессе перебора можно проверять так:
Код:
Set doc = dc.getfirstdocument
While not doc is nothing 
if not doc.hasitem("$Conflict") then
' Тут что-то делаем с документом
End if
Set doc = dc.getnextdocument(doc)
wend
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Не забываем, что без правки ini-файла, FTSearch вернёт только 5000 документов.
Можно создать три представления с формулами из запроса и брать документы из них.
 

Kizarek86

Lotus team
20.07.2007
864
4
#7
Medevic, дело говорит про представления.
Сделайте представление и берите по ключу, судя по запросам у Вас как раз случай с одним ключом.

А вообще все зависит от конкретной ситуации, может вообще стоит взять сразу бОльшу коллекцию документов и работать уже с ними.

Также проверьте базу на "стабы" (инфы на форуме много).
 

ezhov

Active member
28.02.2013
37
0
#8
для FTSearch попробуй:
Код:
searchQ$ = {Field Form ="Person" AND Field met !="1" AND Field TabNum = "} & tabNum & {"}
DocumentCollection dc = database.FTSearch( searchQ$, 0);
' Аналогично:
searchQ$ = {Field Form ="Department" OR Field Form = "Subdivision" AND Field met !="1" AND Field ID= "} & depID & {"}
searchQ$ = {Field Form ="Department" OR Field Form = "Subdivision" AND Field met !="1" AND Field ID= "} & parentId & {"}
Конфликты отобрать нельзя по идее, так как служебные поля могут не индексироваться, но в процессе перебора можно проверять так:
Код:
Set doc = dc.getfirstdocument
While not doc is nothing 
if not doc.hasitem("$Conflict") then
' Тут что-то делаем с документом
End if
Set doc = dc.getnextdocument(doc)
wend
А какой тип переменной searchQ$ ? т.к. эта срока

searchQ$ = {Field Form ="Person" AND Field met !="1" AND Field TabNum = "} & tabNum & {"}
DocumentCollection dc = database.FTSearch( searchQ$, 0);

в java коде и я должен передать tabNum в качестве параметра для поиска
 

savl

Lotus team
28.10.2011
2 131
102
#9
searchQ$ - строка, значок $ как идентификатор типа.
 

ezhov

Active member
28.02.2013
37
0
#10
searchQ$ - строка, значок $ как идентификатор типа.
Т.е. строка

String searchQ = "{Field Form =\"Department\" OR Field Form = \"Subdivision\" AND Field met !=\"1\" AND Field ID= \"} & "+parentId+" & {\"}";
DocumentCollection dc = database.FTSearch(searchQ,0);

Должна нормально отработать, но валится ошибка

: NotesException: Notes error: Query is not understandable ({Field Form ="Department" OR Field Form = "Subdivision" AND Field met !="1" AND Field ID= "} & 10000000 & {"})
at lotus.domino.local.Database.NFTSearch(Native Method)
at lotus.domino.local.Databrch(Unknown Source)
at lotus.domino.local.Database.FTSearch(Unknown Source)

Такой вариант String searchQ = "{Field Form =\"Department\" OR Field Form = \"Subdivision\" AND Field met !=\"1\" AND Field ID= \""+parentId+"\"}";
тоже выдает такую же ошибку
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#11
когда ТС дойдёт до вариант, что больше 5 ФТ запросов в секунду не отрабатывается или отрабатываются с ошибкой - маякуй ;)
 

ezhov

Active member
28.02.2013
37
0
#12
когда ТС дойдёт до вариант, что больше 5 ФТ запросов в секунду не отрабатывается или отрабатываются с ошибкой - маякуй ;)
Непонял) что значит ТС и ФТ ?

Добавлено:
когда ТС дойдёт до вариант, что больше 5 ФТ запросов в секунду не отрабатывается или отрабатываются с ошибкой - маякуй ;)
Непонял) что значит ТС и ФТ ?
 

savl

Lotus team
28.10.2011
2 131
102
#13
#Offtop: ТС - Топик стартер, ФТ - FTSearch
{ - это как кавычка в LS
<!--shcode--><pre><code class='java'>String searchQ = "Field Form =\"Department\" OR Field Form = \"Subdivision\" AND Field met !=\"1\" AND Field ID= \"" + parentId+ "\"";[/CODE]

Почему в сторону FT идем? Вариант с представлениями не нравится?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#14
#Offtop: ТС - Топик стартер, ФТ - FTSearch
{ - это как кавычка в LS
<!--shcode--><pre><code class='java'>String searchQ = "Field Form =\"Department\" OR Field Form = \"Subdivision\" AND Field met !=\"1\" AND Field ID= \"" + parentId+ "\"";[/CODE]

Почему в сторону FT идем? Вариант с представлениями не нравится?
не забываем еще что длинна FT тоже ограничена
отсюда нужно делать море оптимизаций:

Код:
String searchQ = {[Form]="Department" OR [Form]="Subdivision" AND [met]!="1" AND [ID]="} & parentId & {"}
 

ezhov

Active member
28.02.2013
37
0
#15
не забываем еще что длинна FT тоже ограничена
отсюда нужно делать море оптимизаций:

Код:
String searchQ = {[Form]="Department" OR [Form]="Subdivision" AND [met]!="1" AND [ID]="} & parentId & {"}
Сейчас вариант такой:

DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");

parentId передается как параметр для поиска, в варианте String searchQ = {[Form]="Department" OR [Form]="Subdivision" AND [met]!="1" AND [ID]="} & parentId & {"} этот параметр не передается же,получается просто строка "parentId"

Необходимо проверить какой метод будет быстрее работать, database.search или database.FTSearch
 

savl

Lotus team
28.10.2011
2 131
102
#16
ezhov
FT быстрее, но капризный.
Сакраментальный смысл какой у такой конструкции?
Почему через представления нельзя? Как я понимаю parentID не меняется в коде, а передается.
 

ezhov

Active member
28.02.2013
37
0
#17
ezhov
FT быстрее, но капризный.
Сакраментальный смысл какой у такой конструкции?
Почему через представления нельзя? Как я понимаю parentID не меняется в коде, а передается.
происходит синхронизация департаментов и сотрудников, их xml берется тот самый parentID, ищется в базе лотуса и обновляется и т.д., в xmlке куча этих parentID, циклом пробегаемся по всем и для каждого делаем такой поиск,поэтому parentID в каждой итерации цикла разный, он передается в метод, в котором и вызывается поиск по базе, который нужно оптимизировать,что б быстрее искал
 

savl

Lotus team
28.10.2011
2 131
102
#18
ezhov
Через вьюху надо, получение документа по вьюхе быстрее пройдет.
Создай представление, формула отбора: Select Form="Department" | Form="Subdivision" & [met]!="1"
Первая колонка, сортированная, ключ колонки ID
В java получи NotesView из базы, ищи по вью документ по ключу parentID, через
<!--shcode--><pre><code class='java'>public Document getDocumentByKey(java.util.Vector keys)
throws NotesException[/CODE]
И никаких Search не надо.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#19
Необходимо проверить какой метод будет быстрее работать, database.search или database.FTSearch
быстрее их обоих будет
set col = view.GetAllDocumentbyKey...

но с другой стороны если так нужны приключения на свою Ж... то пробуйте оба ;)
 

ezhov

Active member
28.02.2013
37
0
#20
быстрее их обоих будет
set col = view.GetAllDocumentbyKey...

но с другой стороны если так нужны приключения на свою Ж... то пробуйте оба ;)
Для этого метода тоже надо же создать представление в БД? Получается быстрее всего поиск происходит не по самой таблице а по представлению ? А кто нибудь может объяснить почему так происходит?