![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависает FireBird [D6, IB6.x, FireBird]
galexis © (2004-08-18 11:27:00)Поиск в БД идет несколько минут (1-2 минуты). Особо нетерпеливые пользователи, видя что программа не реагирует на их дейтвия вырубают ее по ctrl+alt+del. После чего зависает FireBird Server на сервере. Точнее в службах написано, что он работает, а подключится к нему не удается. Приходится останавливать службу и запускать ее заново. Что не так?
Спасибо.
galexis (2004-08-18 15:18:00) [1]Со словарями все ясно. А с чего начать создание Thread? Где бы подробнее почитать с примерами. Подскажите пожалуйста.
WondeRu (2004-08-18 14:37:00) [2]galexis © (18.08.04 11:27)
вырубают ее по ctrl+alt+del
отруби ctrl+alt+del! ;-)
Sergey13 (2004-08-18 14:17:00) [3]2galexis ©
Для попробовать/пошаманить. Сделай доп. поле (80 символов), туда скопируй часть исходного поля (начало). Проиндексируй. Стандартно искать по нему. Если поиск не удовлетворил, то по старой схеме с предупреждением, что "Сами понимаете, на ждать". И плюс [3] для нерадивых.
Sergey_Masloff (2004-08-18 14:12:00) [4]Да конечно мой вариант когда надо искать ВСЕ слова введенные пользователем.
Anatoly Podgoretsky (2004-08-18 14:06:00) [5]Совпадение может быть полное, по всем словам или не полное по отдельным словам, именно так и строят поиск поисковые машины, для первого используется AND для второго OR
Sergey_Masloff (2004-08-18 14:00:00) [6]galexis © (18.08.04 13:19) [27]
CREATE TABLE DICTITBL (
ID INTEGER NOT NULL,
PARENTID INTEGER NOT NULL,
STRVALUE VARCHAR(40) NOT NULL
);
CREATE TABLE MAINTABLE (
ID INTEGER NOT NULL,
NAME VARCHAR(400)
);
ALTER TABLE DICTITBL ADD CONSTRAINT PK_DICTITBL PRIMARY KEY (ID);
ALTER TABLE MAINTABLE ADD CONSTRAINT PK_MAINTABLE PRIMARY KEY (ID);
CREATE INDEX X_DICTI_PARENT ON DICTITBL (PARENTID);
CREATE INDEX X_DICTI_VALUE ON DICTITBL (STRVALUE);
COMMIT WORK;
для всех трех слов
select m.NAME from dictitbl d1 left join dictitbl d2 on d2.parentid = d1.parentid
left join dictitbl d3 on d3.parentid = d1.parentid
left join maintable m on m.id = d1.parentid
where d1.strvalue like 'РУСС%'
and d2.strvalue like 'ПРОМ%'
and d3.strvalue like 'КОМП%'
для двух
select m.NAME from dictitbl d1 left join dictitbl d2 on d2.parentid = d1.parentid
left join maintable m on m.id = d1.parentid
where d1.strvalue like 'РУСС%'
and d2.strvalue like 'КОМП%'
На 60000 записей в главной таблице и 60000 * 5 в словаре работает мгновенно.
Как унифицировать для произвольного числа слов в введенной пользователем строке - твоя работа. У меня это сделано но во-первых сделано в рамках коммерческой разработки и публиковать код я конечно не могу во вторых это уже материал на несколько статей для чего ни времени ни желания ни таланта нет. Но вобщем если подумать реализовать несложно.
Iconka (2004-08-18 13:43:00) [7]наверно
...
name = 'Русская'
or name = 'компания'
...
Digitman (2004-08-18 13:43:00) [8]
> galexis
формирование слов.статей и "индексов" по ним веди в триггерах на вставку/модификацию
каждая слов.статья должна ссылаться на список точных координат ее вхождения в конкретные записи и хэш-таблицу
вообще говоря, хранить данные для поиска лучше всего будет в БЛОБ-поле, а ф-цию поиска (на базе формируемого словаря) осуществлять в UDF, т.к. производительность поиска в БЛОБ-данных ощутимо эффективней, если она ведется в UDF (т.е. алгоритм поиска полностью подконтролен и реализован в оптимизированном маш.коде)
galexis (2004-08-18 13:19:00) [9]>Sergey_Masloff
Поиск идет тоже не по одному слову. Например, есть ООО "Русская промышленная компания". Пользователь вводит Русская компания. Каким образом в словаре вести поиск?
Соловьев (2004-08-18 12:55:00) [10]
> Да я не могу почемуто создать индекс по этому полю
по какому?
Sergey_Masloff (2004-08-18 12:54:00) [11]galexis © (18.08.04 12:52) [23]
>А как разбивать поле на слова? В голову приходит только >посимвольное копирование до пробела или еще до чего нибудь. >Думаю создание словаря выльется часов в 10.
Да хоть в 100. Это операция одноразовая. Главно потом делать это на каждую вставляемую запись.
Sergey_Masloff (2004-08-18 12:52:00) [12]galexis © (18.08.04 12:48) [22]
>я не могу почемуто создать индекс
Ну не почему-то а потому что ограничение 255 байт а символы мультибайтовые то есть 255/3 = макс. размер индекса дла русского чарсета
>Записей действительно 60 тыс
Для интербейза это копейки
>Плюс оказывается в названии юр. лиц могут встречаться знаки >препинания, например запятые
Для поиска нужно выкидывать все несущественное. Даже если слов 40 поисковозначимых из них ну 10 (сходу даже пример такой придумать трудно). Как правило 2-5 слов получается в словаре.
galexis (2004-08-18 12:52:00) [13]
> Sergey_Masloff
А как разбивать поле на слова? В голову приходит только посимвольное копирование до пробела или еще до чего нибудь. Думаю создание словаря выльется часов в 10.
galexis (2004-08-18 12:48:00) [14]>Соловьев © Да я не могу почемуто создать индекс по этому полю.
>Sergey13 Записей действительно 60 тыс. И слов много. Плюс оказывается в названии юр. лиц могут встречаться знаки препинания, например запятые.
Соловьев (2004-08-18 12:42:00) [15]
> На поле 400 символов вроде индекс не повесишь. Там вроде
> ограничение около 80 - не помню. Хотя может я и ошибаюсь.
конечно не повесиш, я мею ввиду таблицу справочник слов.
Sergey13 (2004-08-18 12:40:00) [16]2[19] Соловьев © (18.08.04 12:37)
На поле 400 символов вроде индекс не повесишь. Там вроде ограничение около 80 - не помню. Хотя может я и ошибаюсь.
Соловьев (2004-08-18 12:37:00) [17]
> Это значит что мне без % надо искать?
where field_dic starting "РОГ" или where field_dic like "РОГ%"
подключит индекс и будет искать все слова которые начинаются на РОГ
Sergey13 (2004-08-18 12:36:00) [18]2 galexis ©
А что это за поле 400 символов?
Digitman (2004-08-18 12:36:00) [19]
> НД-?
Набор Данных
Sergey_Masloff (2004-08-18 12:34:00) [20]galexis © (18.08.04 12:31) [14]
>Это значит что мне без % надо искать
нет но это значит что ты уже на верном пути