Вопрос о оптимальном алгоритме поиска в БД
Вопрос о оптимальном алгоритме поиска в БД
Дельфи, interbase 6.5. Имеется следующая задача: в БД содержатся префиксы телефонных номеров (значащие разряды тел. номеров, поле типа char) и маски (не значащие разряды номеров, пример "****") , вместе они дают шаблон телефонного номера, так же имеется набранный телефонный номер необходимо сопоставить тел. номеру запись с самым похожим на него шаблоном, количество цифр номера и шаблона должно совпадать, телефонных номеров много.
В принципе прога уже написана, но скорость ее работы меня не устраивает, может у вас, уважаемые коллеги, возникнут какие-нибудь светлые идеи по поводу алгоритма поиска данного шаблона.
Свои приводить не буду что бы не сбивать, заранее спасибо.
В принципе прога уже написана, но скорость ее работы меня не устраивает, может у вас, уважаемые коллеги, возникнут какие-нибудь светлые идеи по поводу алгоритма поиска данного шаблона.
Свои приводить не буду что бы не сбивать, заранее спасибо.
Re: Вопрос о оптимальном алгоритме поиска в БД
ну, я бы например varchar применялmogikanin писал(а):Дельфи, interbase 6.5. Имеется следующая задача: в БД содержатся префиксы телефонных номеров (значащие разряды тел. номеров, поле типа char) и маски (не значащие разряды номеров, пример "****") , вместе они дают шаблон телефонного номера, так же имеется набранный телефонный номер необходимо сопоставить тел. номеру запись с самым похожим на него шаблоном, количество цифр номера и шаблона должно совпадать, телефонных номеров много.
В принципе прога уже написана, но скорость ее работы меня не устраивает, может у вас, уважаемые коллеги, возникнут какие-нибудь светлые идеи по поводу алгоритма поиска данного шаблона.
Свои приводить не буду что бы не сбивать, заранее спасибо.
to kdv насчет разбиения: можно префиксы выбирать по первой цифре и далее лопатить всю выборку, на предмет поиска самого похожего шаблона, но выборка будет большая обработка идет долго, можно выполнять к БД ряд запросов, постепенно отрезая от номера цифры с хвоста и ищя в базе по полученной строке префиксы которые с учетом маски дадут искомы номер, я так еще не пробовал но мне кажется будет еще дольше.
перебирать в процедуре через starting with
от длины тел номера(или максимальной длины префикса) до первого символа. и будет найден наиболее совпадающий шаблон префикса, дальше уже считать кол-во звездочек, или вообще изначально лучше отдельно хранить длину шаблона.
И так будет достаточно быстро при наличии индекса по префиксу.
от длины тел номера(или максимальной длины префикса) до первого символа. и будет найден наиболее совпадающий шаблон префикса, дальше уже считать кол-во звездочек, или вообще изначально лучше отдельно хранить длину шаблона.
И так будет достаточно быстро при наличии индекса по префиксу.
а зачем вообще длина шаблона? определяющим является длина номера телефонаmdfv писал(а):перебирать в процедуре через starting with
от длины тел номера(или максимальной длины префикса) до первого символа. и будет найден наиболее совпадающий шаблон префикса, дальше уже считать кол-во звездочек, или вообще изначально лучше отдельно хранить длину шаблона.
И так будет достаточно быстро при наличии индекса по префиксу.
Последний раз редактировалось stix-s 20 июн 2007, 14:16, всего редактировалось 1 раз.
to stix-s
я вообще то не супер спец, но запросы типа
select pref
from table1
where pref starting with (containing, like) "telnum"
не работают если pref в длину меньше telnum в принципе
а наоборот тоже не работает (результат пустой) но это уже видимо особенности Interbase
pref поле таблицы, telnum строка с номером телефона
я вообще то не супер спец, но запросы типа
select pref
from table1
where pref starting with (containing, like) "telnum"
не работают если pref в длину меньше telnum в принципе
а наоборот тоже не работает (результат пустой) но это уже видимо особенности Interbase
pref поле таблицы, telnum строка с номером телефона
Наоборот, это как?mogikanin писал(а):to stix-s
я вообще то не супер спец, но запросы типа
select pref
from table1
where pref starting with (containing, like) "telnum"
не работают если pref в длину меньше telnum в принципе
а наоборот тоже не работает (результат пустой) но это уже видимо особенности Interbase
pref поле таблицы, telnum строка с номером телефона
select * from prefixes px
where px.prefix starting with ('8346') - прекрасно работает
и даже так работает
select * from prefixes px
where '8346' starting with (px.prefix)
Последний раз редактировалось stix-s 20 июн 2007, 14:43, всего редактировалось 1 раз.
стоп, длина номера стандартна - 10 символов и никак иначеmdfv писал(а):...которая и сравнивается с длиной шаблона(который может иметь разную длину, для разных станций и способов формирования номера),stix-s писал(а): а зачем вообще длина шаблона? определяющим является длина номера телефона
и если сразу не совпадает, то и искать нечего.
МГ - 8телепон(с кодом города)
МН - 810 код страны телепон
если телефон записывать абы как, тогда о каких префиксах можно речь весть?
с какого боку мне нужна тут длина шаблона?
to stix-s номер получаем в виде например "8442454545" префикс в БД для такого номера будет в длину меньше либо равен 10 знакам т.е. длине этого самого тел. номера, равен он в длину этому номеру только в эстраординарных случаях, а чаще всего он короче например префикс может быть "844245" при таком раскладе конструкции с LIKE, Starting with и Containing не работают, к сожалению.
to stix-s у каждой АТС свои правила набора тел. номеров, номера имеют стандартный тип только в том случае если звонки с этих номеров идут через телефонные сети общего пользования, если же вызов идет не через сети ТФОП то номера могут быть и не стандартными, единственное условие - они должны быть уникальными для этой АТС
уверен?mogikanin писал(а):to stix-s номер получаем в виде например "8442454545" префикс в БД для такого номера будет в длину меньше либо равен 10 знакам т.е. длине этого самого тел. номера, равен он в длину этому номеру только в эстраординарных случаях, а чаще всего он короче например префикс может быть "844245" при таком раскладе конструкции с LIKE, Starting with и Containing не работают, к сожалению.
select * from prefixes px
where '83466343126' starting with (px.prefix) - отрабатывает на ура, находит нужный мне префикс, проблема будет, если их будет несколько разной длины 834, 8346, 83466