Привет!
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
Собственно, пока достаточно.
Фанис