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

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

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

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

Поиск По Полной Фразе

  • Автор темы Nerevar
  • Дата начала
N

Nerevar

Добрый день! Такая вот проблема: мне необходимо реализовать поиск по полной фразе.
Например, поиск в базе фразы "Приказ 246", результатом которого должна стать выборка документов, в которых встречается И слово "Приказ" И число "246". Как вариант - пусть встречается фраза "Приказ 246" как одно целое.
FTSearch и FTSearchRange работают "по кускам" - т.е. результатом запроса могут стать как документы, содержащие число "246", так и документы, содержащие слово "Приказ". А нужно - "Приказ" И "246".
Вот такая вот проблема. Есть ли идеи, как ее решить?
 
S

Serduko

Если поля, где встречается строка известны, то почему бы не попробовать просто notesdatabase.search, без полнотекстового поиска?

Например:
Код:
set notesdocumentcollection = notesdatabase.search({Select @like(field1;"%Приказ 246%") | @like(field2;"%Приказ 246%")},nothing,0)
 
N

Nerevar

Я ищу данную фразу по базе в целом - не только по полям БД, но и по прикрепленным документам. Причем документов достаточно много, поэтому скорость работы довольно-таки критична
 
S

Serduko

Тогда та же формула, но:

Код:
Set notesdocumentcollection= notesdatabase.AllDocuments
Call notesdocumentcollection.ftsearch({Select @like(field1;"%Приказ 246%") | @like(field2;"%Приказ 246%")},0)

Туда же включаешь RT поля. Возможно сработает и на вложения.

Добавлено: Возможно лучше так:

Код:
Set notesdocumentcollection= notesdatabase.AllDocuments
Call notesdocumentcollection.ftsearch({Select @Contains(field1;"Приказ 246") | @Contains (field2;"Приказ 246")},0)
 
S

Serduko

Перепутал полнотекстовый и @формула,
Надо:
Код:
[field1] Contains "Приказ 246"
 
N

Nerevar

Попробую. Но есть сомнения в скорости...
 
S

Serduko

заменяешь в строке " " на " AND ", видимо.
 
A

afest

в FTSearch'e просто делаешь свою выборку на @ и все будет нормуль, сам так делал, работает шустро, главное знать шо нужно сделать
ЗЫ: хэлпу никто не отменял, правда там тяжко порой найти нужное
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Это где такое прописывать?
там где ты прописываешь "Приказ 246"
я вообще в шоке от твоего вопроса
ты же в теме сам написал, тебе нужно И, так вот И в полнотекстовом поиске это AND пишешь в строке поиска или в db.ftsearch - не важно, важно что это И

но это всё равно может быть для тебя не выходом, так как будет найден документ в котором в любом поле есть "Приказ" и в любом поле есть "246" а то, что это может быть не одно и тоже поле понимаешь? :)

хотя и тут можно попробовать с умничать типа так [Field]="Приказ AND 246"
 
N

Nerevar

ты же в теме сам написал, тебе нужно И, так вот И в полнотекстовом поиске это AND пишешь в строке поиска или в db.ftsearch
Проблема в том, что это не работает. Т.е. и ftSearch и ftSearchRange находят ддокументы, в которых есть что-то одно. Прям как бдто ИЛИ пишу. Я уж какие только запросы не вымудрял и как только не переписывал. И AND писал, и знак & использовал, и всякие чудовища вроде CONTAINS или PARAGRAPH. Один фиг - находит не то, что нужно. Точнее, то что нужно находит, но и кучу мусора тоже. При этом иногда команда работает адеватно - но зависимости я не нашел((
И еще: у меня не только по полям поиск, но и по прикрепленным документам (вордовским). И в них он зачастую вообще даже не по словам ищет, а по кускам слов. В приведенном чуть измененном примере, кстати: "ПриказAND246П" он нашел документ, в котором не было ни слова приказ, ни 246П. Зато было просто 246...
Вот поэтому я и стал интересоваться, как можно этот момент обойти(
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
раскрой секцию по фтп поиску и посмотри не влючено ли у тебя фюзи сечь - "простой поиск", "поиск со сменой окончания" и т.д.
 
N

Nerevar

Отлично! Спасибо за совет! Заменил FT_FUZZY на FT_STEMS. Теперь ищет в точности, как написано. Добавлю просто поле для опции - искать все подряд или искать 100%ное вхождение - и вуаля!
Спасибо большое за помощь!
P.S. Итоговая строчка споиском выглядела у меня так:
If (searchCondition = "Везде") Then
Set collection=db.FTSearchRange(SearchStr, 0, FT_SCORES, FT_STEMS)
End If
Естественно, у меня будут еще вариации поля searchCondition.
 
A

afest

ну как вариант и такое должно работать:

searchFormula$ = {@Contains(field1;"Приказ") & @Contains(field1;"246")}
Set collection = db.Search(searchFormula$,Nothing,0)

ЗЫ: в выборку можно еще и форму для поиска указать, например
searchFormula$ = {Form = "Project" & @Contains(field1;"Приказ") & @Contains(field1;"246")}
 
Мы в соцсетях:

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