Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 извечная тема. оптимизация...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
доброго времени суток всем!

Ну как всегда, все хотят нажиться за счет чужих идей, вот и я не устоял... :)

Есть задача, и уже давно...
Дано:
1) Произвольно написанный почтовый адрес. То есть - совсем произвольно (ну, в пределах разумного).
2) Есть табличка post_regions (30 тыс записей). поля Count, City, Region_small, Region.
суть - уже сгруппированный список почтовых отделений по городам

Надо понять, человек хоть каким-то боком - правильный адрес дал?
Ну, то есть, регион вытащить из адреса.

записи типа:
insert into region(Count, City, Region_small, Region) 
select 1511, 'МОСКВА', 'МОСКВА', 'МОСКВА' UNION ALL
select 64, 'ЛЬВОВСКИЙ', 'МОСКОВСКАЯ', 'МОСКОВСКАЯ ОБЛАСТЬ' UNION ALL
select 19, 'ЛЮБЕРЦЫ', 'МОСКОВСКАЯ', 'МОСКОВСКАЯ ОБЛАСТЬ' UNION ALL
select 42, 'ИВАНОВО', 'ИВАНОВСКАЯ', 'ИВАНОВСКАЯ ОБЛАСТЬ' UNION ALL
select 1, 'БУНЬКОВО', 'ИВАНОВСКАЯ', 'ИВАНОВСКАЯ ОБЛАСТЬ' UNION ALL
select 79, 'ПЕРМЬ', 'ПЕРМСКИЙ', 'ПЕРМСКИЙ КРАЙ' UNION ALL
select 13, 'КРАСНОКАМСК', 'ПЕРМСКИЙ', 'ПЕРМСКИЙ КРАЙ' UNION ALL
select 1, 'БОЛЬШАЯ СОСНОВА', 'ПЕРМСКИЙ', 'ПЕРМСКИЙ КРАЙ'

Задача - из произвольно написанного адреса отпарсить регион.

примеры адресов:
пос. Речка, Новгородской области ул. Московская, д.3
Новгородская обл., пос. Речка, ул. Московская, д.3
Нофвкепйу3245кая обл., пос. Речка, ул. Моынрцк5нкая, д.3 // ну и пусть он правильным будет
Новомосковск, 17
Биробиджан, 17
Москва, ул. Ленинградская, д 37. кв 111.
Санкт-Петербург, ул. ИВАНОВСКАЯ, д. 23. кв 777
Жмеринка, ПЕРМСКИЙ пер., д. 18

(я самые муторные адреса нарисовал)

пока прописано так:

  select @result = REGION 
  from post_regions 
  where @addr like '%'+REGION_small+' %'
  Order by cnt ASC, len(REGION_small) ASC, CHARINDEX(REGION_small, @addr)DESC, ID DESC

  if @result is null begin
    select @result = REGION 
    from post_regions 
    where 
          @addr like CITY+',%' or  
          @addr like CITY+' %' or  
          @addr like '% '+CITY+' %' or  
          @addr like '% '+CITY+',%' or  
          @addr like '%.'+CITY+' %' or   
          @addr like '%.'+CITY+',%' or  
          @addr like '%,'+CITY+' %' or  
          @addr like '%,'+CITY+',%'
    Order by cnt ASC, len(CITY) ASC, CHARINDEX(CITY, @addr)DESC, ID DESC
  end 

Вроде бы неплохо (очень относительно) парсит, но...

Почти секунду думает. Что в разрезе поставленной задачи - абсолютно неприемлемо.
Надо как минимум - в 5 раз быстрее.

Кто бы что бы так бы посоветовал бы, чтобы я бы молоццом был бы перед боссами? :)

Заранее пасипки прегромадное. :)
16 июл 11, 09:52    [10983558]     Ответить | Цитировать Сообщить модератору
 Re: извечная тема. оптимизация...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Да, при прочих равных условиях, парсер выбирать должен тот "регион", где больше count.
То есть, число почтовых отделений.
16 июл 11, 09:55    [10983561]     Ответить | Цитировать Сообщить модератору
 Re: извечная тема. оптимизация...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Это не "оптимизация". Это - "надо придумать алгоритм".
16 июл 11, 11:15    [10983631]     Ответить | Цитировать Сообщить модератору
 Re: извечная тема. оптимизация...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Гавриленко Сергей Алексеевич,

да алгоритм - вон, придуман.
Пусть такой же.
Только бы отрабатывал за 200 мсек.
16 июл 11, 13:56    [10983895]     Ответить | Цитировать Сообщить модератору
 Re: извечная тема. оптимизация...  [new]
aleks2
Guest
1. Для порядку пнем саму идею. Нефиг. Пущай явно регион указывают.
2. Предложенный алгоритм будет медленный, как и все
WHERE like '% '+....+' %' or  
ибо сканирование таблицы.
3. Правильный алгоритм:
3.1. Заменяем все разделители (.,: и т.п.) пробелом.
3.2. Заменяем все многократные повторяющиеся пробелы на один.
3.3. Парсим строку в таблицу слов.
3.4. Анализируем каждое слово на предмет IsRegion... тут тупая проверка на принадлежность списку регионов и проверка на последующее слово (обл, область, край и их производные). Для начала можно удалить из таблицы все заведомо "не регион", например, числа, слова после (д, ул) и т.п.
16 июл 11, 14:23    [10983953]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить