Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти и выдать все слова в строке, MySQL 5.1.32 
:(
    Опции темы
tishaishii
Дата 8.12.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Надо найти и выдать все слова в строке. Слово - это набор символов, соответствующий рег. выр. : (?:[0-9]+-|Д/)*[a-zA-Zа-яА-ЯёЁ][a-zA-Zа-яА-ЯёЁ\-]*?[a-zA-Zа-яА-ЯёЁ]

Это сообщение отредактировал(а) tishaishii - 8.12.2009, 15:17
PM MAIL ICQ Skype   Вверх
tishaishii
Дата 8.12.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



У меня пока вышло только по набору символов, криво-косо и долго:
Код

CREATE TABLE `postfixes` ( -- для стемминга
  `id_type`  bigint UNSIGNED NOT NULL,
  `word`     varchar(255) NOT NULL,
  /* Keys */
  PRIMARY KEY (`id_type`, `word`)
) ENGINE = MyISAM;

CREATE INDEX `Index_2`
  ON `postfixes`
  (`word`);

CREATE INDEX `Index_3`
  ON `postfixes`
  (`id_type`);


-- Function: base_form

-- DROP FUNCTION IF EXISTS `base_form`;

DELIMITER |

CREATE DEFINER = 'tishaishii'@'%' FUNCTION `base_form` 
(
  `in_word` varchar(1024)
)
RETURNS varchar(1024) charset cp1251
BEGIN
  declare done boolean default false;
  declare post integer default null;
  repeat
      set post=null;
      select
          char_length(word)
      from
          ratiss.postfixes
      where
          id_type=2 and
          char_length(in_word)-char_length(word)>2 and
          in_word like concat('%', word)
      limit
          1 
      into
          post;
      if (post is not null) then
         set in_word=substring(in_word from 1 for char_length(in_word)-post);
      end if;
  until (post is null) end repeat;
  return in_word;
END|

DELIMITER ;

-- Procedure: getWords

-- DROP PROCEDURE IF EXISTS `getWords`;

DELIMITER |

CREATE DEFINER = 'tishaishii'@'%' PROCEDURE `getWords` ()
BEGIN
     declare rx varchar(255) default '[à-ÿÀ-ßa-zA-Z]';
     declare done bool DEFAULT false;
     declare str varchar(1024) default '';
     declare word varchar(1024);
     declare chr char(1);
     declare len integer default 0;
     declare i integer default 1;
     declare cur1 cursor for select `query` from history.searched
     union all
     select `query` from history.cache_step c where id_parent is null
     limit 10;
     declare continue handler for not found set done = true;
     drop temporary table if exists getWordsRes;
     drop temporary table if exists getWordsRes2;
     create temporary table getWordsRes(
        word varchar(1024),
        base varchar(1024)
     );
     create temporary table getWordsRes2 (
        base varchar(1024),
        `count` bigint(20)
     );
     create index index_1 ON getWordsRes (base);
     create index index_1 ON getWordsRes2 (base);

     set done=0;
     open cur1;

     while (not done) do
          fetch cur1 into str;
          set len=char_length(str);
          set i=1;
          set word='';

          while(i<=len)do
              set chr=substring(str from i for 1);
              if(chr regexp rx)then
                 set word=concat(word, chr);
              else
                   if (char_length(word)>0) then
                      insert into getWordsRes values(
                          word,
                          base_form(word)
                      );
                      set word='';
                   end if;
              end if;
              set i=i+1;
          end while;
          
          if (char_length(word)>0) then
            insert into getWordsRes values(
                   word,
                   base_form(word)
            );
          end if;
     end while;

     insert into getWordsRes2
     select
         base, count(*) `count`
     from
         getWordsRes
     group by
         base;

     select
         (select gwr.word from getWordsRes gwr where gwr.base=t.base limit 1) as word,
         t.`count`
     from
         getWordsRes2 t
     order by
         t.`count` desc;
END|

DELIMITER ;


PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0395 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.