Привет!
http://chishmy.ru/ - внизу страницы две ссылки на файлы проекта Turbo
и скрипта БД
Комментарий пока нет - я тут запарился на основной работе, писал по
вечерам до звонка от жены "Сволочь! Опять допоздна и опять
нажрешься!! :-)))
Все ХП по поиску разбиты на куски - чтоб было понятно. А что непонятно
- допишу позднее.
В поиске используются словарь слов и синонимов, урезанных до корней.
В поиск можно передать as_string1024
ниже все это рубится на слова
CREATE OR ALTER PROCEDURE WORDS_COUNT(
    AWORD VARCHAR(1024))
RETURNS (
    SWORD VARCHAR(50))
AS
declare variable J INTEGER;
declare variable AJ INTEGER;
declare variable CLEN INTEGER;
begin
  AWORD=UPPER(AWORD);
  CLEN=CHAR_LENGTH(TRIM(AWORD));
  J=1;
  AJ=1;
  WHILE (J<=CLEN) DO
  BEGIN
    IF (SUBSTRING(AWORD FROM :J FOR 1) IN
('(',')','[',']','{','}','-',' ',',','.',';','/','\',':')) THEN
    BEGIN
      SWORD=TRIM(SUBSTRING(AWORD FROM AJ FOR J-AJ));
      if (CHAR_LENGTH(SWORD)>2) then
      SUSPEND;
      J=J+1;
      AJ=J;
    END ELSE J=J+1;
  END
  if (AJ<J) then
  BEGIN
    SWORD=TRIM(SUBSTRING(AWORD FROM AJ FOR J-AJ));
    if (CHAR_LENGTH(SWORD)>2) then
    SUSPEND;
    EXIT;
  END
end

ниже поиск совпадения слова в словаре - решил тупо посредством
усечения слова в цикле
CREATE OR ALTER PROCEDURE SEEK_WORDS(
    AWORD VARCHAR(50))
RETURNS (
    WORD_ID INTEGER,
    OKOF_COUNT INTEGER)
AS
declare variable SID INTEGER;
declare variable CCOUNT INTEGER;
declare variable IN_OKOF INTEGER;
declare variable CLEN INTEGER;
declare variable XWORD VARCHAR(50);
begin
  AWORD=UPPER(AWORD);
  CLEN=CHAR_LENGTH(TRIM(AWORD));
  WHILE (:cLEN>=3) DO
  BEGIN
    XWORD=SUBSTRING(:AWORD from 1 for :CLEN);
    CCOUNT=0;
    FOR select ID,IN_OKOF,OKOF_COUNT from WORDS
    where sname=:XWORD into :SID,:IN_OKOF,:OKOF_COUNT DO
    BEGIN
      if (IN_OKOF=0) then /*ЭТО СИНОНИМ*/
      BEGIN
        SELECT FIRST(1) WORDS.ID,WORDS.OKOF_COUNT
        FROM SYN_WORDS
        LEFT JOIN WORDS ON SYN_WORDS.WORDS_ID=WORDS.ID
        WHERE SYN_WORDS.SYN_ID=:SID AND WORDS.IN_OKOF=1
        INTO :WORD_ID,:OKOF_COUNT;
        if (WORD_ID IS NOT NULL) then
        BEGIN
          CCOUNT=CCOUNT+1;
          suspend;
        END
      END ELSE
      BEGIN
        WORD_ID=SID;
        CCOUNT=CCOUNT+1;
        suspend;
      END
    END
    if (CCOUNT>0) then EXIT;
    clen=clen-1;
  end
end

Собственно, пока достаточно.
Фанис

Ответить