Проблема с поиском с @contains

seoman2

Green Team
17.02.2010
507
1
BIT
72
Снова возникла данная проблема.
Есть база без полнотекстового индекса, создать его нельзя, нет доступа к ней. FTSearch - не подойдет.
Надо по полю Director типа Rich Text сделать поиск.
formula$ = |@Contains(@lowercase(Director); @lowercase({| & uidoc.FieldGetText("sDirector") & |}))|
Set dc=MUdb.Search(formula$,Nothing,0)
не находит ничего...
Что делать то?
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Создать индекс - самое простое.

Еще вариант сделать текстовое поле, которое дублирует информацию из RT, но только текст. И искать в нем.
Тут проблемы могут быть с размерами текста.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Я в чужой базе не могу ничего делать, в том числе текстовые поля.
 

Мыш

Lotus Team
12.02.2008
1 228
30
BIT
137
А если RichText перегнать в Text - скажем, через GetFormattedText?
 

Мыш

Lotus Team
12.02.2008
1 228
30
BIT
137
На собаках - @abstract или @text можно попробовать (не знаю, наверное, есть ограничения на длину).
UPD. Да, я уже понял - туплю чего-то... :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
создать копию базы (реплику) а ужо там...
 

erdi

Green Team
20.08.2008
264
17
BIT
0
можно собрать коллекцию из документов, которые содержат данное поле
Код:
Set dc = db.Search({@IsAvailable(TekNum)}, Nothing,0)
а потом уже в цикле брать это поле - брать текст с этого поля(sss=rtitem.Text) - и через через stringExpr Like patternString уже отсеивать нужные документы
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Да там база на несколько десятков тысяч доков... и все содержат это поле.
formula$ = |@Contains(@lowercase(@Abstract( [TEXTONLY]; 200; ""; "Director" )); @lowercase({| & uidoc.FieldGetText("sDirector") & |}))|
не помогло, как и @text
 

Мыш

Lotus Team
12.02.2008
1 228
30
BIT
137
seoman2, действительно, не пашет в Search, а в Evaluate работает. :huh:
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Потому что формула для Search все равно что SELECT во вьюхе.
@Abstract не работает там...
Критерии отбора: только магическое слово в RT-поле.
Тут только FTSearch пробьет, так что стоить индекс, но по словам ТС - нельзя

Тогда стоит расширять критерии отбора, взять по ним примерную коллекцию доков, скажем за текущий месяц, либо по одной форме, либо как-то еще.
Затем каждый док сканировать на слово в поле.
Да, это долго, чертовски долго.
Переводите это на сервер, чтобы клиент не подвисал. Агент ищет доки, строит excel и высылает результат, либо в папку кладет, либо одним письмом ссылки присылает.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Всё же через домино администратор под админом в своей реплике создал индекс. Надеюсь репликация не слетит, с учетом что у базы включен "Enforce a consistent access control list across all replicas of this database".
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Галка кажись только на ACL влияет, индекс должен сохраниться, но только на этой реплике.
Следовательно, если поиск из клиента, то его надо проводить именно на этой реплике.
А значит у пользователя должен быть доступ к серверу, ну и Location сервера.
Проверять/переключать можно так:
Код:
If Not db.IsFtIndexed Then
If db.OpenByReplicaID(<Сервер>, db.replicaID) Then Print "Открыли реплику на другом сервере."
End If
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
>> К тому же @Contains ищет вхождения, а = — точное совпадение.
Почему то
formula$ = {[Kod]="} & uidoc.FieldGetText("skod") & {"}
находит нестрогие соответствия.
при skod="123"
находит доки с Kod="123 324"
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
В help же сказано:
•Returns true (1) if any substring is contained in one of the strings
•Returns false (0) if no substrings are contained in any of the strings

Usage

This function is case-sensitive.
If either parameter is a list, the function returns 1 if any element of parameter 1 contains any element of parameter 2.
You cannot use this function to test for substrings in a rich text field.
Avoid using this function to test for an exact match (that is, parameter 2 equals parameter 1). The result will be wrong if parameter 1 is not an exact match but does contain parameter 2. Use the equal operator or @IsMember, which will give the desired result and are more efficient.
 
H

hosm

seoman2
Ага. Проверьте, например, находит доки с Kod="123 324" при skod="12" :RTFM:
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Да, собачки, я составляю формулу точного поиска для
FTSearch(formula$,0)

А для лотуса "запрос непонятный"
formula$ = {@IsMember("} & uidoc.FieldGetText("pole1") & {";pole2)}
 
Мы в соцсетях:

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