Нечеткий поиск в БД

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Нечеткий поиск в БД

Сообщение alammi » 14.07.2004 (Ср) 14:44

Вопрос древний, как сама вселенная: как осуществлять нечеткий поиск в бд? Желательно конкретные предложения, а не философские труды :) База большая (~20 полей по 15000 записей), а поиск тормозить не должен-max 30 секунд! Поделитесь идеями-буду признателен
Спасибо за конструктив!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Нечеткий поиск в БД

Сообщение codemaster » 14.07.2004 (Ср) 15:01

alammi писал(а):Вопрос древний, как сама вселенная: как осуществлять нечеткий поиск в бд? Желательно конкретные предложения, а не философские труды :) База большая (~20 полей по 15000 записей), а поиск тормозить не должен-max 30 секунд! Поделитесь идеями-буду признателен


А БД какая ?

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 15:06

Я не совсем понял твой вопрос, по-этому попробую ответить всесторонне:
1) большая
2) поле, по которому я ищу-текст
3) дорогая
4) секретная
:D
Если здесь нет ответа, то конкретизируюй свой вопрос
Спасибо за конструктив!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.07.2004 (Ср) 15:17

БД это Access, MS SQL, Oracle?
Lasciate ogni speranza, voi ch'entrate.

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 15:22

Сделано в Access, а доступ я делаю через SQL-запросы. ПОМОГИТЕ КТО-НИБУДЬ!!! (Крик души)
Спасибо за конструктив!

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.07.2004 (Ср) 15:29

Что значит "Нечёткий"?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 14.07.2004 (Ср) 15:35

alammi писал(а):Сделано в Access, а доступ я делаю через SQL-запросы. ПОМОГИТЕ КТО-НИБУДЬ!!! (Крик души)


Думаю идею с Accessом в качестве БД можно смело похронить

что касается
"Approximate string matching" линков в инете ВАГОН

как вариант
http://www.codeproject.com/string/dmetaphone6.asp

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 15:43

Я уже сижу в нем (нечетком поиске) неделю, поэтому думаю, что весь мир знает что это :D .
Ну так вот сомтрите: есть слово текст (есть, в смысле пользователь вбил его в строку поиска программы).
Также условимся, что есть 3 равноценных операции? удаление буквы, вставка буквы и замена буквы на другую. Так вот нечеткий поиск может найти слова, отличающиеся на одно расстояние редактирования (или 458) от заданного...Так вот пользователь вбил текст, а гениальный компьютер найдет, к примеру, тест тексты текут. Вот такая вот задачка.
Только не предлагайте перебор всех возможных (вроде ?екст, т?кст, те?ст и т.д) а то я умру!!!

З.Ы. ПОМОГИТЕ жЕ КТО-НИБУДЬ!! О где же ты Бегемот
Спасибо за конструктив!

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 15:47

codemaster писал(а):
alammi писал(а):Сделано в Access, а доступ я делаю через SQL-запросы. ПОМОГИТЕ КТО-НИБУДЬ!!! (Крик души)


Думаю идею с Accessом в качестве БД можно смело похронить

что касается
"Approximate string matching" линков в инете ВАГОН

как вариант
http://www.codeproject.com/string/dmetaphone6.asp
То что касается похорон Access, это еще ладно. Как я прочитал в подписях у кого-то на этом форуме: "Критикуешь - предлагай". Я уже вешаться хочу от всего этого бреда.
Вот.
Спасибо за конструктив!

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 15:52

Лирическое отступление:
Скоро я из статуса Начинающие перейду в статус Кончающие
Дайте же хоть кто-нибудь конструктиву мне!
Спасибо за конструктив!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 14.07.2004 (Ср) 16:04

alammi писал(а):То что касается похорон Access, это еще ладно. Как я прочитал в подписях у кого-то на этом форуме: "Критикуешь - предлагай". Я уже вешаться хочу от всего этого бреда.
Вот.



Перейди на MS SQL сервер.
Как вариант линк тебе уже дал - достаточно интересное решение
которое вполне можно доработать под MSSQL.

P.S. Кроме _РОССИЙСКОГ_ инета ты хоть что нибудь читал (смотрел)?

Сдается нет

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 16:32

Нет не смотрел, в силу своей запуганости порнографией и педофилией :oops: .
Кинь пару ссылочек, plz
Спасибо за конструктив!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.07.2004 (Ср) 16:49

codemaster писал(а):Перейди на MS SQL сервер.
Как вариант линк тебе уже дал - достаточно интересное решение
которое вполне можно доработать под MSSQL.


Можно (чтобы остаться чистым душой и непорочным :) ) перейти на MSDE -- по функционалу практически MSSQL, только работает на локальной машине. Зато бесплатный.
Lasciate ogni speranza, voi ch'entrate.

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 16:51

Ребятки! Меня это все уже умилять начинает: такое ощущение, что я сам ставлю себе такие извращенные задачи :D Веть мне это заказали. Нужен Басик!
Конструктиву давайте!!!
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 16:52

А что мешает сделать на крайняк обычный запрос в кострукторе. А потом вызывать его из кода. Уж там-то "нечеткий поиск" делается в пару сек. Если тебе сложно сделать именно сам запрос SQL (типа написать SELECT... и т.д.), возьми тот же, получившийся запрос и просмотри его в режиме SQL. Будет что-то типа:

Код: Выделить всё
SELECT GOODS.NAME
FROM GOODS
WHERE (((GOODS.NAME) Like "*ТЕКСТ*"))
WITH OWNERACCESS OPTION;


Чтобы вставить это в код делаешь так:

DoCmd.RunSQL ну и далее в кавычках получившийся запрос.

Это если всавлять в код VBA в самой базе accessa, если ты пишешь отдельную программулю на VB, то можно, например, юзать рекордсет используемого коннекшена к базе (только не элемент дата, лучше юзай ADO или DAO). Так вот там у рекордсета выставлешь этот самый запрос в свойство sourse, как помню, и при открытии он тебе сразу возвращает результат твоего запроса. сама суть нечеткого поиска я тебе тоже вроде сказал надо писать слово в звездах, то есть: *ТЕКСТ*.
Хотя... неужели ты этого не знаешь :? :shock: . Мне кажется я что-то не так понял и говорю тебе совсем не то, что тебе надо 8).


Что касается быстроты поиска. То, естественно, он будет быстрее, если таблица не связанная, (то есть таблица именно этой mdb-хи а не связь, например, с dBase IV и т.п.).
Поиск быстрее, если он производится по индексному полю. Ну и, естественно, если ты делаешь выборку сразу по оочень многим полям, это тоже все замедляет, хотя таблица в 15000 это не так уж и много, даже для 20 полей. Поэтому поиск по ней за 30 секунд - это ооочень медленно, что-то у тебя не то или комп ооочень медленный 8) :lol: .
В общем напиши конкретно. Сколько таблиц в запросе. Или примерно хотя бы суть запроса. :?
Возможно, тебе надо просто оптимизировать базу (то бишь перекроить немного :shock: ).
Последний раз редактировалось MOV 14.07.2004 (Ср) 17:03, всего редактировалось 1 раз.

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 16:58

MOV писал(а):А что мешает сделать на крайняк обычный запрос в
...
таблиц в запросе. Или примерно хотя бы суть запроса. :?
Возможно, тебе надо просто оптимизировать базу (то бишь перекроить немного :shock: ).


1) Кроить ничего не буду. По-просту не имею права-так заказали
2) Ребятки я же сказал, только отличие на 1, максимум 2 буквы, а то что это за нечеткий поиск: Задал слово "412", а получил "12423412344122345345". Не-е-е- так не пойдет
Спасибо за конструктив!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 17:14

перейти на MSDE -- по функционалу практически MSSQL, только работает на локальной машине. Зато бесплатный.


Вай - вот не знал что на локальной... Что он тогда у меня в сети делает? Вообще-то MS его рекомендует для небольших групп. У нас человек 20..30 юзеров на нем сидят...

Основное ограничение - размер базы в 2Gb.
Что нам вполне достаточно.

А для разработки (ну там всякие QA, EM, PM и пр. чтобы были) можно Developer версию купить - стоит всего несколько баксов. И все получается лицензионно!
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 17:17

2) Ребятки я же сказал, только отличие на 1, максимум 2 буквы, а то что это за нечеткий поиск: Задал слово "412", а получил "12423412344122345345". Не-е-е- так не пойдет


Все равно можно использовать такой вариант, а потом уже просто пробежаться по полученным записям и сравнить длину с длиной запрашиваемого слова +-2 символа. Хотя если слово состоит из одного символа.... :D бегать придется долго :lol:
Хотя, думаю, наверняка, должен быть в Sql способ с теми же звездами или еще с чем-то, чтобы +-2 символа :?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 17:22

Да не надо ему SQL - человеку нужно элементарно открыть Recordset таблички которая у него в MDB и пробежаться по нему с готовой функцией на VB отобрав нужные записи. Вот только опыта у него нет как все это сделать...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 17:33

Recordset таблички которая у него в MDB и пробежаться по нему с готовой функцией на VB отобрав нужные записи. Вот только опыта у него нет как все это сделать...


Да нахрена ему эта функция, если это может сделать SQL?
А если таблица на серваке и все начнут по ней бегать? :D Соревнование будет долгим :D. Хотя согласен, все равно рекордсет нужен но с SQL и выброси свою функцию 8)

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 14.07.2004 (Ср) 21:08

alibek писал(а):
Можно (чтобы остаться чистым душой и непорочным :) ) перейти на MSDE -- по функционалу практически MSSQL, только работает на локальной машине. Зато бесплатный.


Если не ошибаюсь MSSearch не дружит с MSDE
а следовательно и full-text индексов для поиска не построить

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.07.2004 (Чт) 7:25

Да нахрена ему эта функция, если это может сделать SQL?


Из-за маленькой таблички с 15000 записями ставить MSSQL сервер - ну не маразм ли?

А если таблица на серваке и все начнут по ней бегать?


Что такое клиентский курсор знаем? Клиент один раз загружает Recordset к себе на машину (тем более в нем всего 15000 записей) и бегает по нему до конца рабочего дня в свое удовольствие. А так как все выполняется локально то и скорость будет не ниже чем на SQL-сервере.

Соревнование будет долгим . Хотя согласен, все равно рекордсет нужен но с SQL и выброси свою функцию


См. выше - SQL-сервер это не всегда выигрышь - а в данном случае он просто не нужен.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 15.07.2004 (Чт) 8:27

ставить MSSQL сервер - ну не маразм ли?


Во-первых таких табличек может быть пару сотен (как понял, база весит до 2Gb :shock: 8) ). Поэтому почему бы и нет.
Во-вторых, я про SQL-сервер ничего не говорил. Речь шла об Access, VB и SQL, но не сервер, а просто язык SQL, то бишь структурированный язык запросов ну или язык структурированных запросов :D (не суть). Например, чтобы юзать ADO, применяя SQL-запросы, совсем не обязательно ставить сикуэль-сервер, да и вообще, ты в access как запросы делаешь (меня, лично, язык SQL вполне устраивает)?
Короче или ты меня не понял или путаешь название СУБД и название языка :? 8).

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.07.2004 (Чт) 8:38

Во-первых таких табличек может быть пару сотен (как понял, база весит до 2Gb ).


Автор вопроса вроде четко сказал - одна табличка, около 15000 записей.

К этому письму я прикладываю небольшой примерчик реализации того что он хочет (с его функцией и тестовой базкой) - все что ему надо там есть...

Короче или ты меня не понял или путаешь название СУБД и название языка .


Ага - с базами и Basic я работаю уже лет 20, с SQL и VB - со времен 2-го Access-a :lol:
Вложения
Demo.rar
Demo
(23.99 Кб) Скачиваний: 113
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 15.07.2004 (Чт) 10:56

Andrey Fedorov писал(а):См. выше - SQL-сервер это не всегда выигрышь - а в данном случае он просто не нужен.


Он нужен без него не работает MSSearch !
Что касается "нечеткого поиска" то проще и быстрее
сформировать запрос к MSSearch чем долбится с RS.

to Andrey Fedorov зайди на любой поисковик и посмотри как реализован "нечеткий поиск"

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.07.2004 (Чт) 11:44

Он нужен без него не работает MSSearch !


Допустим вам продают маленькую программку - нечто вроде записной книжки, в которой 15000 записей (как у автора вопроса).
(мы ведь не знаем что он в итоге делает, согласись).

Будите ли вы гореть желанием ее использовать если вместе с ней требуется установить как миниум MSDE ???

Изначальный вопрос был про работу с MDB - на это и следует орентироваться, а не рекомендовать человеку из-за довольно пустячной проблемы начать решать ее с помощью MSSQL, согласись.

А то насоветовать можно разное, а в итоге оптимальным для данной задачи может быть хранение данных в бинарном файле, с загрузкой их в массив... :wink:

P.S. Сам я в основном работаю с MSSQL, но в отдельных задачах использую MDB-шки - что лучше использовать определяю по конкретной задаче.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 15.07.2004 (Чт) 12:26

Andrey Fedorov писал(а):
Он нужен без него не работает MSSearch !


Допустим вам продают маленькую программку - нечто вроде записной книжки, в которой 15000 записей (как у автора вопроса).
(мы ведь не знаем что он в итоге делает, согласись).



немного из тех. задания

как осуществлять нечеткий поиск в бд? База большая (~20 полей по 15000 записей), а поиск тормозить не должен-max 30 секунд!


человек явно хочет получить на выходе
нечеткий поиск по БД со всеми его прелестями :
сколнениями им. , созвучными симв и пр.

так при чем тут MDB ? Ну как начнем думать головой в сторону
выбора инструмента соответствующего задаче а ? :wink: :wink:

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 15.07.2004 (Чт) 12:33

Andrey Fedorov пример работает медленно (P-4/ 2,6Ghz/ 512 Mb делает поиск в таблице (я увеличил ее до 15000 записей идобавил 17 полей, хотя выборка по одному, но все же.) за время от 3 секунд и дольше, а если базу по сетке юзать?:? - еще медленне будет, в то же время, если делать запросом в самой базе - практически мгоновенно - так что не переубедишь 8) ).
Единственное хорошо - я тут только языком пока 8), а ты предлагаешь конкретный рабочий вариант.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.07.2004 (Чт) 12:54

Andrey Fedorov пример работает медленно


А это уже не ко мне - функция-то не моя.
15000 записей сами по себе просканируются достаточно быстро.

Да, а сетка или нет - в данном случае безразлично - отгадай почему :shock:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 15.07.2004 (Чт) 13:02

отгадай почему
:D
Вопрос тупиковый :? adUseClient 8)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 33

    TopList  
cron