Запрос Для Ftsearch

Тема в разделе "Lotus - Программирование", создана пользователем ezhov, 28 фев 2013.

  1. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Товарищи, возникла необходимость оптимизации работы агента, долго выполняется обновление,при анализе кода было выявлено что большая часть времени тратится на операции поиска
    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 или может какие нибудь еще варианты есть поиска ?
     
  2. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    105
    Симпатии:
    2
    У FTSearch свой язык запросов, он не понимает @функции, см.Help Дизайнера, например, "Refining a search query using operators"
     
  3. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Весь Help перерыт уже, но про синтаксис ничего не могу найти. Можете подсказать как тогда переделать хотя бы запрос DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\"");? тут вроде только поля без @функций
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    для FTSearch попробуй:
    Код (LotusScript):
    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 & {"}
    Конфликты отобрать нельзя по идее, так как служебные поля могут не индексироваться, но в процессе перебора можно проверять так:
    Код (LotusScript):
    Set doc = dc.getfirstdocument
    While not doc is nothing
    if not doc.hasitem("$Conflict") then
    ' Тут что-то делаем с документом
    End if
    Set doc = dc.getnextdocument(doc)
    wend
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Не забываем, что без правки ini-файла, FTSearch вернёт только 5000 документов.
    Можно создать три представления с формулами из запроса и брать документы из них.
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    ezhov
    Да, Medevic прав.
    На сервере надо выставить вот эту переменную: FT_Max_Search_Results
    Подробнее
     
  7. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Medevic, дело говорит про представления.
    Сделайте представление и берите по ключу, судя по запросам у Вас как раз случай с одним ключом.

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

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

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    А какой тип переменной searchQ$ ? т.к. эта срока

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    searchQ$ - строка, значок $ как идентификатор типа.
     
  10. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Т.е. строка

    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+"\"}";
    тоже выдает такую же ошибку
     
  11. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    когда ТС дойдёт до вариант, что больше 5 ФТ запросов в секунду не отрабатывается или отрабатываются с ошибкой - маякуй ;)
     
  12. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Непонял) что значит ТС и ФТ ?

    Добавлено:
    Непонял) что значит ТС и ФТ ?
     
  13. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    #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 идем? Вариант с представлениями не нравится?
     
  14. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    не забываем еще что длинна FT тоже ограничена
    отсюда нужно делать море оптимизаций:

    Код (LotusScript):
    String searchQ = {[Form]="Department" OR [Form]="Subdivision" AND [met]!="1" AND [ID]="} & parentId & {"}
     
  15. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Сейчас вариант такой:

    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
     
  16. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    ezhov
    FT быстрее, но капризный.
    Сакраментальный смысл какой у такой конструкции?
    Почему через представления нельзя? Как я понимаю parentID не меняется в коде, а передается.
     
  17. ezhov

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    происходит синхронизация департаментов и сотрудников, их xml берется тот самый parentID, ищется в базе лотуса и обновляется и т.д., в xmlке куча этих parentID, циклом пробегаемся по всем и для каждого делаем такой поиск,поэтому parentID в каждой итерации цикла разный, он передается в метод, в котором и вызывается поиск по базе, который нужно оптимизировать,что б быстрее искал
     
  18. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    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 не надо.
     
  19. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    быстрее их обоих будет
    set col = view.GetAllDocumentbyKey...

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

    ezhov Active Member

    Регистрация:
    28 фев 2013
    Сообщения:
    37
    Симпатии:
    0
    Для этого метода тоже надо же создать представление в БД? Получается быстрее всего поиск происходит не по самой таблице а по представлению ? А кто нибудь может объяснить почему так происходит?
     
Загрузка...

Поделиться этой страницей