Mysql, хранимая процедура для полнотекстового поиска, дающая частично правильные результаты

#mysql #loops #stored-procedures #full-text-search

#mysql #циклы #хранимые процедуры #полнотекстовый поиск

Вопрос:

Я создал следующие таблицы и хранимую процедуру в mysql с помощью цикла. Кажется, это частично работает.

 DROP table if EXISTS x; 
DROP table if exists y; 
DROP TABLE if EXISTS z; 

CREATE TABLE x (`code` VARCHAR(10) not null primary key, 
description text, fulltext key(description));

INSERT INTO x
VALUES(2111,'rice, husked'),
('0113','rice, paddy'),
('0124','fish, fresh'),
(2225,'beef meat'),
('0114','bananas'),
('0115','mango');

CREATE TABLE y (section text not null, `code` text);

INSERT INTO y
values('food', 'rice local'),
('food', 'rice imported'),
('food', 'beer'),
('food', 'banana');

create table z (section text not null, `code` text, cpc VARCHAR(10)   
NULL);

drop procedure if exists fmatch;
delimiter //
create procedure fmatch()
language sql
deterministic
sql security definer
begin

declare v_code VARCHAR(10);
declare v_description text;
declare v_finished int;
    declare c cursor for select * from x ;
declare continue handler for not found set v_finished=1;

delete from z;

open c;
 c_loop: loop
   fetch c into v_code,v_description;
  if v_finished then
    leave c_loop;
  end if;

insert into z 
        select y.section, y.`code`, v_code
 from y where match (y.`code`) against (v_description in boolean mode);
end loop c_loop;
close c;

select * from z;
end//
delimiter ;

call fmatch();
 

Результат, полученный здесь как:

 section   code             cpc

food      rice local       2111
food      rice imported    2111
food      rice local       0113
food      rice imported    0113
 

Вместо этого я хочу, чтобы результирующая таблица выглядела как:

 section   code             cpc

food      banana           0114
food      beer             null
food      rice local       0113
food      rice imported    0113
 

Я прошу вашего совета, где я ошибаюсь.

Комментарии:

1. и почему вы считаете, что это должно быть результатом? Вам нужно передать много данных в FTS, чтобы заставить его работать. Вы обучаете его. Подумайте о тысячах строк со стоп-словами.

2. @Drew, даже если для небольшого набора данных он должен давать правильное отображение. Обратите внимание, что это только тестовый пример, который я пытаюсь использовать. есть ли что-то неправильное в циклической структуре?

3. FTS не является ответственным Абдуллой, как не-FTS. Он передает его нечеткому движку, чтобы сделать наилучший выбор. и это сопровождается объемом, который четко указан в руководстве. Так что не путайте FTS с не-FTS

Ответ №1:

Я выполнил вышеупомянутое упражнение по сопоставлению с другой базой данных, которая у меня есть. Ниже приведены две базы данных — одна из данных опроса, а другая из системы классификации ООН. Я попытался сопоставить данные опроса (по различным статьям расходов) с данными в системе классификации ООН.

Однако, поскольку необработанные данные являются необработанными, то есть имеют разную номенклатуру, результаты (совпадения) не так уж велики. Даже приведенная ниже процедура не приводит к частичному совпадению слов, например, mango (из необработанных данных) не был сопоставлен с mangoes .

В логическом режиме вы можете включить match(column1, column2 ..) против (‘mango *’ в логическом режиме), и это приведет к частичному совпадению слов. Аналогичным образом я подумал о том, чтобы поместить звездочку в столбец v_code в приведенном ниже коде, но это не сработало. Если у кого-то есть другие идеи, приветствую.

  ALTER TABLE dbo_CPC
 ADD FULLTEXT(`CODE`, description); 

 ALTER TABLE SLE11_MCPC
 ADD FULLTEXT(`CODE`, Section, MCPC); 

 drop procedure if exists SLE11_CPC_Mapping;
 delimiter //
 create procedure SLE11_CPC_Mapping()
 language sql
 DETERMINISTIC
 sql security definer
  begin
  declare v_section VARCHAR(10);
  declare v_code text;
  declare v_mcpc VARCHAR(10); 
  declare v_finished int;
   declare c cursor for select * from SLE11_MCPC;
   declare continue handler for not found set v_finished=1;

  DELETE from SLE11_MCPC; 

    open c;
  c_loop: loop
   fetch c into v_section, v_code, v_mcpc; 
   if v_finished then
    leave c_loop;
end if;

  insert into SLE11_MCPC 
        select v_section, v_code, left(dbo_CPC.`code`,4)
 from dbo_CPC where match (dbo_CPC.Description) against (v_code in 
    boolean MODE)
     LIMIT 1;
end loop c_loop;
close c;

 end//
delimiter ;