OberonCore
https://forum.oberoncore.ru/

Проблема с поисковом алгоритмом
https://forum.oberoncore.ru/viewtopic.php?f=131&t=3969
Страница 1 из 1

Автор:  Иван Денисов [ Воскресенье, 20 Май, 2012 14:04 ]
Заголовок сообщения:  Проблема с поисковом алгоритмом

Обнаружил проблему в bb1.6rc6, при поиске по русскому тексту не работают опции "с начала слова" "с конца слова" в поисковой форме :( не подскажите как полечить, может кто-то с этим разбирался? При поиске по английскому тексту английских запросов все хорошо работает.

Автор:  Евгений Темиргалеев [ Воскресенье, 20 Май, 2012 14:25 ]
Заголовок сообщения:  Re: Проблема с поисковом алгоритмом

Может быть тут. Попробуйте добавить ELSIF RusLetter(ch) THEN RETURN FALSE.
Код:
   PROCEDURE LeftTerminator (ch: CHAR): BOOLEAN;
   BEGIN
      IF ch < 100X THEN
         CASE ch OF
            viewcode, tab, line, para, " ",
            "(", "[", "{", "=",
            hyphen, softhyphen: RETURN TRUE
         ELSE RETURN FALSE
         END
      ELSE RETURN TRUE
      END
   END LeftTerminator;

   PROCEDURE RightTerminator (ch: CHAR): BOOLEAN;
   BEGIN
      IF ch < 100X THEN
         CASE ch OF
            0X, viewcode, tab, line, para, " ",
            "!", "(", ")", ",", ".", ":", ";", "?", "[", "]", "{", "}",
            hyphen, softhyphen: RETURN TRUE
         ELSE RETURN FALSE
         END
      ELSE RETURN TRUE
      END
   END RightTerminator;

Автор:  Иван Денисов [ Воскресенье, 20 Май, 2012 15:20 ]
Заголовок сообщения:  Re: Проблема с поисковом алгоритмом

Спасибо! Получилось! Добавил фикс в Красноярскую сборку, и привожу тут.
Код:
PROCEDURE RusLetter(ch: CHAR): BOOLEAN;
BEGIN
   IF ((ORD(ch) >= 1040) & (ORD(ch) <= 1103)) OR (ORD(ch) = 1105) OR (ORD(ch) = 1117) THEN
      RETURN TRUE
   ELSE
      RETURN FALSE
   END
END RusLetter;

PROCEDURE LeftTerminator (ch: CHAR): BOOLEAN;
BEGIN
   IF ch < 100X THEN
      CASE ch OF
         viewcode, tab, line, para, " ",
         "(", "[", "{", "=",
         hyphen, softhyphen: RETURN TRUE
      ELSE RETURN FALSE
      END
   ELSIF RusLetter(ch) THEN RETURN FALSE
   ELSE RETURN TRUE
   END
END LeftTerminator;

PROCEDURE RightTerminator (ch: CHAR): BOOLEAN;
BEGIN
   IF ch < 100X THEN
      CASE ch OF
         0X, viewcode, tab, line, para, " ",
         "!", "(", ")", ",", ".", ":", ";", "?", "[", "]", "{", "}",
         hyphen, softhyphen: RETURN TRUE
      ELSE RETURN FALSE         
      END
   ELSIF RusLetter(ch) THEN RETURN FALSE
   ELSE RETURN TRUE
   END
END RightTerminator;

Автор:  Евгений Темиргалеев [ Воскресенье, 20 Май, 2012 16:40 ]
Заголовок сообщения:  Re: Проблема с поисковом алгоритмом

x, y IN {0, 1}. IF x = 1 THEN y := 1 ELSE y := 0 END <=> y := x
Код:
   PROCEDURE CyrLetter* (ch: CHAR): BOOLEAN;
   BEGIN
      RETURN (ch = 0401X) OR (ch = 0451X)   (* Ё | ё *)
         OR (0410X <= ch) & (ch <= 042FX)   (* А..Я *)
         OR (0430X <= ch) & (ch <= 044FX)   (* а..я *)
   END CyrLetter;

Автор:  Иван Денисов [ Воскресенье, 20 Май, 2012 21:39 ]
Заголовок сообщения:  Re: Проблема с поисковом алгоритмом

Спасибо, исправил.

Автор:  Иван Денисов [ Четверг, 25 Июль, 2013 18:16 ]
Заголовок сообщения:  Re: Проблема с поисковом алгоритмом

Вот такой код не привязан к языку. Так сейчас сделано в Красноярской сборке. Работает со всякими умляутными буквами также хорошо, как и с русскими.
Код:
   PROCEDURE LeftTerminator (ch: CHAR): BOOLEAN;
   BEGIN
      CASE ch OF
         viewcode, tab, line, para, " ",
         "(", "[", "{", "=",
         hyphen, softhyphen: RETURN TRUE
      ELSE
         RETURN FALSE
      END
   END LeftTerminator;

   PROCEDURE RightTerminator (ch: CHAR): BOOLEAN;
   BEGIN
      CASE ch OF
         0X, viewcode, tab, line, para, " ",
         "!", "(", ")", ",", ".", ":", ";", "?", "[", "]", "{", "}",
         hyphen, softhyphen: RETURN TRUE
      ELSE
         RETURN FALSE         
      END
   END RightTerminator;

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/