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

Тема в разделе "Lotus - Программирование", создана пользователем Nerevar, 4 дек 2012.

  1. Nerevar

    Nerevar Member

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

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Если поля, где встречается строка известны, то почему бы не попробовать просто notesdatabase.search, без полнотекстового поиска?

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

    Nerevar Member

    Регистрация:
    4 дек 2012
    Сообщения:
    12
    Симпатии:
    0
    Я ищу данную фразу по базе в целом - не только по полям БД, но и по прикрепленным документам. Причем документов достаточно много, поэтому скорость работы довольно-таки критична
     
  4. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Тогда та же формула, но:

    Код (LotusScript):
    Set notesdocumentcollection= notesdatabase.AllDocuments
    Call notesdocumentcollection.ftsearch({Select @like(field1;"%Приказ 246%") | @like(field2;"%Приказ 246%")},0)
    Туда же включаешь RT поля. Возможно сработает и на вложения.

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

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

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Перепутал полнотекстовый и @формула,
    Надо:
    Код (LotusScript):
    [field1] Contains "Приказ 246"
     
  6. Nerevar

    Nerevar Member

    Регистрация:
    4 дек 2012
    Сообщения:
    12
    Симпатии:
    0
    Попробую. Но есть сомнения в скорости...
     
  7. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    "Приказ AND 246"
     
  8. Nerevar

    Nerevar Member

    Регистрация:
    4 дек 2012
    Сообщения:
    12
    Симпатии:
    0
    Это где такое прописывать?
     
  9. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    заменяешь в строке " " на " AND ", видимо.
     
  10. afest

    afest Well-Known Member

    Регистрация:
    16 июн 2009
    Сообщения:
    78
    Симпатии:
    0
    в FTSearch'e просто делаешь свою выборку на @ и все будет нормуль, сам так делал, работает шустро, главное знать шо нужно сделать
    ЗЫ: хэлпу никто не отменял, правда там тяжко порой найти нужное
     
  11. Nerevar

    Nerevar Member

    Регистрация:
    4 дек 2012
    Сообщения:
    12
    Симпатии:
    0
    А по-подробнее можно, пожалуйста? А то я в Лотусе сравнительный новичок, и с полуслова не очень пока понимаю((
     
  12. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    там где ты прописываешь "Приказ 246"
    я вообще в шоке от твоего вопроса
    ты же в теме сам написал, тебе нужно И, так вот И в полнотекстовом поиске это AND пишешь в строке поиска или в db.ftsearch - не важно, важно что это И

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

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

    Nerevar Member

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

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    раскрой секцию по фтп поиску и посмотри не влючено ли у тебя фюзи сечь - "простой поиск", "поиск со сменой окончания" и т.д.
     
  15. Nerevar

    Nerevar Member

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

    afest Well-Known Member

    Регистрация:
    16 июн 2009
    Сообщения:
    78
    Симпатии:
    0
    ну как вариант и такое должно работать:

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

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

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