Страница 1 из 3

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 10:53
Игорь Столяров
Привет всем !

Есть некий большой неиндексированный список (TPS),
и нужно выполнять в нем контекстный поиск по символьным строкам .... :(
Сделал, что называется "тупо в лоб", т.е. в поле фильтр добавил:

Код: Выделить всё

Loc:TextFind Cstring(20)
....
InString(Loc:TextFind,Upper(Clip(Bas:Field01)),1)
Все работает. Но мееееедленно. Особенно в сети. :)
Может быть есть идеи по альтернативному варианту контекстного поиска в Browse ?
Заранее спасибо за идею. :)

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 12:54
kreator
А закачать всё в броуз и искать по очереди? Т.е. тут альтернатива - либо ждать загрузки броуза, либо ждать при фильтрации. А сколько записей примерно нужно просмотреть?

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 13:23
Дед Пахом
Или IMDD.

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 16:48
Игорь Столяров
Записей порядка 100т., но они "толстые" (большой размер Record) ... и кроме поиска их надо редактировать.
Разводить байду с загрузкой в IMDD и потом синхронизировать базу на диске не очень охота, если честно. ;)
Тем более при работе в сети с общей БД.

Здесь скорее вопрос в том, можно ли как-то эффективней выполнять поиск подстроки в строке, чем с Instring() ?
Я помню, где-то раньше встречался самописный аналог Instring(), и там как раз отмечалось, что он намного быстрей ...

И еще. Я это как раз сейчас пытаюсь понять ... Предположим есть Record из 10 символьных полей.
Быстрей искать одной командой Instring() по всему Record или все-таки отдельно по полям ....

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 16:58
Дед Пахом
Посмотри сишные memcmp, memchr. StringTheory их использует в своей реализации INSTRING.

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 17:11
kreator
Игорь Столяров писал(а):И еще. Я это как раз сейчас пытаюсь понять ... Предположим есть Record из 10 символьных полей.
Быстрей искать одной командой Instring() по всему Record или все-таки отдельно по полям ....
Их же как-то ещё соединить надо, типа на это время тоже тратиться.
Тоже в голове лежит, что можно эффективнее организовать поиск. Может воспользоваться функцией Match?
Совсем тупо - в фоне загрузить в очередь. Но это опять синхронизацию нужно прорабатывать.

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 17:26
Игорь Столяров
kreator писал(а): функцией Match
Я как-то давно пробовал, Match() очень медленно работает, у нее ведь очень мощный аналитический функционал ...

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 17:38
Игорь Столяров
Дед Пахом писал(а): StringTheory их использует в своей реализации INSTRING
Спасибо за наводку, но нет. В CapeSoft StringTheory обычная шара, просто надстойка над "стандартной" Instring()

Код: Выделить всё

StringTheory.Instring Procedure(string pSearchValue, long pStep=1, long pStart=1, long pEnd=0, long pNoCase=0)!,long
x           long, auto
  code
    if self.value &= null
        return 0
    end
    x = InString(Choose(pNoCase, Upper(pSearchValue), pSearchValue), Choose(pNoCase, Upper(self.value), self.value), pStep, pStart)    
    if pEnd and x + Len(pSearchValue) - 1> pEnd        
        x = 0
    end
    return x

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 17:40
Дед Пахом
ну значит моя StringTheory слегка поновее :-)

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 19:48
Игорь Столяров
Открой тайну нового кода !
Я всю творческую жизнь мечтаю увидеть хоть что-то разумное made in CapeSoft ! :idied:

Контекстный поиск в Browse

Добавлено: 04 Июнь 2016, 22:48
Yufil
Хммм. У меня лёгкое подозрение, переходящее в абсолютную уверенность, что чтение записи базы данных значительно медленнее, чем поиск по Instring. Кстати, надо посмотреть, как там сделано. Возможно, что там просто обращение к сишной функции - и ничего больше.

Методы быстрого поиска в строке действительно есть https://ru.wikipedia.org/wiki/%D0%90%D0 ... 1%80%D0%B0, но это не наш случай, поскольку чтение записи базы данных ... см.выше

А нельзя как-то apache solr присобачить?

Контекстный поиск в Browse

Добавлено: 05 Июнь 2016, 0:17
Игорь Столяров
Прикольно. В моей версии (с FTP) CapeSoft StringTheory есть реализация поиска алгоритмом Бойера — Мура,
только она закомментирована, видимо тогда была на стадии отладки. Только вот вполне может оказаться,
что и стандартная InString() сделан по тому же алгоритму ... ;)

Контекстный поиск в Browse

Добавлено: 05 Июнь 2016, 0:35
RaFaeL
У нас MS SQL и самописный броуз, в котором контекстный поиск встраивается непосредственно в запрос на сервер. Все остальное кмк быстро работать не будет...

Контекстный поиск в Browse

Добавлено: 05 Июнь 2016, 7:04
Игорь Столяров
Написал небольшой тестик с фильтрацией списка по 5 символьным полям.
По его результатам процентов 20-30% времени сжирается именно внутри комбинации "Instring(FindStr,Upper(Field),1)" :(
Т.е. есть смысл, попробовать, что-то другое ...

Если кто-то является счастливым обладателем современной версии CapeSoft StringTheory - дайте пожалуйста
код StringTheory.Instring (он в файле StringTheory.clw). Спасибо !

Контекстный поиск в Browse

Добавлено: 05 Июнь 2016, 11:10
Yufil
Года четыре назад сталкивался с проблемой ну очень медленного Browse в MS SQL с нехилыми фильтром поиска по десятку таблиц и полсотне полей, потому что логика кларионовского browse требует заново выполнять запрос, когда подгружается запись за пределами browse. То есть ткнули стрелку вниз - запрос к серверну с нехилым фильтром, ткнули ещё-опять запрос, и каждый раз минута-другая ожидания одной записи. Если указать режим 'File' - ждём минут 10-15, пока результат запроса перегрузится в память. Правда, вопросов о добавлении -удалении записей в эту Browse не стояло. И это таблица с которой работают постоянно!

Вынужден был создать временную таблицу, состоящую только из ключа основной записи, а потом сделал Browse именно по временной таблице с подгрузкой полей при показе - всё стало выглядеть вполне прилично по времени. Но это не о том...