Ядро поисковой машины работает исключительно в Юникоде, что снимает всевозможные проблемы с кодировками - в том числе для разных кодировок одного языка (например, для кириллицы - cp1251, koi8 и ibm866), а также для азиатских иероглифических языков. Полная поддержка всех спецификаций для Юникода, а также полный состав алгоритмов для преобразования всевозможных используемых на практике кодировок значительно увеличивает размер кода поисковой машины, поэтому на стадии компиляции можно оставить необходимый минимальный набор поддерживаемых возможностей.
Значительная часть возможностей по работе с текстом опирается на библиотеку IBM ICU, которая в полном варианте занимает около 10 Мб.
Если нужна дополнительная информация о стандарте UNICODE и сведения для компьютерной обработки разных языков, то предлагаем ознакомится с небольшим каталогом ссылок на релевантные ресурсы, которые мы использовали при разработке поисковой машины.
На отдельных страницах Вы можете посмотреть на скриншоты и примеры поиска в документах на разных языках.
Так как поисковый движок может компилироваться с разным набором поддерживаемых возможностей (в том числе в минимальном варианте без поддержки сложных кодировок и многих кодовых таблиц), то в поисковой утилите φaind предусмотрена возможность получить список реально поддерживаемых кодировок для текущего варианта поисковика. Для этого в командной строке набираете:
faind -help=10
Результат зависит от версии поисковика и может выглядеть так:
начало листинга

середина листинга

конец листинга

См. примеры работы с документами на разных языках и в разных кодировках.
Поисковая система Integra предоставляет более удобные средства указания кодировки.
Для получения списка всех возможных локалей, учитываемых поисковым движком при сравнении строк и сортировке, а также при печати сообщений, используется команда:
faind -help=11
Если поисковая машина скомпилирована с расширенной поддержкой Юникода через средства библиотеки IBM ICU, то список может выглядеть так (на скриншоте - только начало):

Команда -strip_accents=true заставляет поисковый движок убирать диактрические значки у символов. В результате, к примеру, буква è станет e. Данный механизм распространяется и на сложные случаи - когда у базовой буквы есть несколько диактрических символов, например ǘ станет u.
Команду -strip_accents имеет смысл задавать и при индексации зоны, чтобы уменьшить количество создаваемых ключевых слов в индексной базе данных.
Некоторые форматы текстовых файлов включают специальные тэги разметки (HTML, XML). По умолчанию тэги игнорируются парсером. Чтобы заставить поисковый движок обрабатывать всю служебную информацию в файле, используется опция
-stripdecor=false
В качестве примера можно рассмотреть поиск гиперссылок в веб-документе.
Не все форматы текстовых файлов позволяют однозначно определить кодировку символов, и даже в случае работы с форматами, которые позволяют задавать кодировку (например, HTML), нередко по небрежности их создателей сведения о кодировке отсутствуют. Для ASCII и HTML файлов поисковая машина по умолчанию применяет специальный алгоритм Codepage Guesser, который пытается подобрать наиболее подходящую кодировку. Этот алгоритм не всегда способен корректно распознать кодировку. Например, если текстовый файл содержит сначала английский текст, а затем - русский, то CP Guesser может выбрать кодовую страницу 1250 по результатам анализа первых 100 слов - и русский текст будет воспринят некорректно. Чтобы управлять алгоритмом подбора кодировок, можно явно указывать проверяемые кодовые страницы с помощью нижеописанных опций.
-cp NNN принудительно устанавливает заданную числом или именем кодовую страницу NNN для всех обрабатываемых документов, даже если в этих документах указана другая кодировка. К примеру:
-cp iso-8859-1
заставляет поисковую машину использовать западноевропейскую кодировку (iso-8859-1).
-prefer_cp NNN если для документа кодировка не известна, то использовать указанную. К примеру:
-prefer_cp utf-8
Данная команда имеет также вариант с расширенным синтаксисом:
-prefer_cp "MMM;NNN;KKK" - список предпочитаемых кодировок в порядке применения. Специальный алгоритм (codepage guesser) попытается определить для документов наиболее подходящую кодировку. Например:
-prefer_cp "utf-8;cp866;cp1251;cp1256"
Оригинал таблицы взят со страницы http://wdh.suncloud.ru/charsets.htm
| кодировка | Идентификатор | Синонимы | Кодовая страница |
|---|---|---|---|
| Unicode (UTF-7) | utf-7 | csUnicode11UTF7, unicode-utf_7, unicode-1-1-utf-7, unicode-2-0-utf-7, x-unicode-2-0-utf-7 | 65000 |
| Unicode (UTF-8) | utf-8 | unicode-utf_8, unicode-utf_8-1_1, unicode-1-1-utf-8, unicode-2-0-utf-8, x-unicode-2-0-utf-8 | 65001 |
| Unicode (UTF-16) | unicode-utf_16 | csUnicode11, csUnicodeASCII, csUnicodeLatin1, ISO-10646-UCS-2, ISO-10646-UCS-BASIC, ISO-10646-Unicode-Latin1, ISO-10646, ISO-10646-J-1, unicode-utf_16-1.1 | |
| Unicode (UTF-32) | unicode-utf_32 | ISO-10646-UCS-4 | |
| Арабский (ASMO 708) | ASMO-708 | 708 | |
| Арабский (DOS) | DOS-7200 | 720 | |
| Арабский (ISO) | iso-8859-6 | csISOLatinArabic, iso-ir-127, ISO_8859-6, ISO_8859-6:1987, iso-8859_6-1999, ECMA-114, arabic | 28596 |
| Арабский (Windows) | windows-12566 | cp1256, windows-1256-2000 | 1256 |
| Балтийские языки (Latin-4) | iso-8859-4 | csISOLatin4, iso-ir-110, ISO_8859-4, ISO_8859-4:1988, iso-8859_4-1988, l4, latin4 | 28594 |
| Балтийские языки (Windows) | windows-1257 | windows-1257-2000 | 1257 |
| Вьетнамский (Windows) | windows-1258 | windows-1258-2000 | 1258 |
| Греческий (ISO) | iso-8859-7 | csISOLatinGreek, iso-ir-126, ISO_8859-7, ISO_8859-7:1987, iso-8859_7-1987, ECMA-118, ELOT_928, greek, greek8 | 28597 |
| Греческий (Windows) | windows-12533 | windows-1253-2000, x-cp1253 | 1253 |
| Европа (Latin-3) | iso-8859-3 | iso-8859_3-1999 | 28593 |
| Европа (Latin-6) | iso-8859-10 | iso-8859_10-1999 | |
| Европа (Latin-7) | iso-8859-13 | iso-8859_13-1999 | |
| Европа (Latin-9) | iso-8859-15 | iso-8859_15-1999 | 28605 |
| Западная Европа (ASCII) | us-ascii | ANSI_X3.4-1968, ANSI_X3.4-1986, cp367, csASCII, IBM367, iso-ir-6, ISO646-US, ISO_646.irv:1991, ascii, us, us-ascii-1968, x-ansi | 20127 |
| Западная Европа (Latin-1) | iso-8859-1 | cp819, ibm819, iso-ir-100, iso8859-1, iso_8859-1, iso_8859-1:1987, iso-8859_1-1998, ISO-8859-1-Windows-3.0-Latin-1, ISO-8859-1-Windows-3.1-Latin-1, latin1, l1 | 29591 |
| Западная Европа (Mac) | mac-roman-2000 | x-mac-roman | 10000 |
| Западная Европа (Windows) | windows-1252 | 1252 | |
| Иврит (DOS) | DOS-862 | 862 | |
| Иврит (ISO–визуальный) | iso-8859-88 | csISOLatinHebrew, iso-ir-138, ISO_8859-8, iso-8859_8-1999, ISO-8859-8 Visual, visual, hebrew | 28598 |
| Иврит (ISO–логический) | iso-8859-8-i | 38598 | |
| Иврит (Windows) | windows-1255 | ISO_8859-8:1988, iso-ir-138, logical, windows-1255-2000 | 1255 |
| Кельтские языки (Latin-8) | iso-8859-14 | iso-8859_14-1999 | |
| Кириллица (DOS) | cp866 | ibm866 | 866 |
| Кириллица (ISO) | iso-8859-5 | csISOLatinCyrillic, iso-ir-144, ISO_8859-5, ISO_8859-5:1988, iso-8859_5-1999, cyrillic | 28595 |
| Кириллица (Mac) | mac-cyrillic-2000 | x-mac-cyrillic | 10007 |
| Кириллица (Windows) | windows-1251 | csWindows31Latin5, iso-8859-5-windows-latin-5, windows-1251-2000, x-cp1251 | 1251 |
| Кириллица (КОИ8-Р) | koi8-r | csKOI8R, koi, ru-koi8_r-2000 | 20866 |
| Китайский – традиционное письмо (EUC) | x-euc-tw | osf-euc_tw-2000 | 51950 |
| Китайский – традиционное письмо (Windows) | big5 | csBig5, CN-Big5, windows-950, windows-950-2000, x-x-big5 | 950 |
| Китайский – упрощенное письмо (GB2312) | gb2312 | csGB2312, csISO58GB23128, iso-ir-58, GB2312, GBK, GB_2312-80, gb-3212-2000, chinese, CN-GB, CN-GB-ISOIR165 | 936 |
| Китайский – упрощенное письмо (HZ) | hz-gb-2312 | 52936 | |
| Корейский (EUC) | euc-kr | csEUCKR, ks_c_5601, kcs5601, osf-euc_kr-2000 | 51949 |
| Корейский (ISO) | iso-2022-kr | csISO2022KR, posix-2022_kr | 50225 |
| Корейский (Windows) | ks_c_5601-1987 | csKSC56011987, korean, windows-949, windows-949-2000 | 949 |
| Тайский (Windows) | iso-8859-111 | windows-874, windows-874-2000 | 874 |
| Турецкий (ISO) | iso-8859-99 | csISOLatin5, iso-ir-148, l5, ISO_8859-9, ISO_8859-9:1989, iso-8859_9-1999, latin5 | 28599 |
| Турецкий (Windows) | windows-1254 | windows-1254-2000, x-cp1254 | 1254 |
| Украинский (КОИ8-У) | koi8-u | 21866 | |
| Центральная Европа (DOS) | ibm8522 | cp852 | 852 |
| Центральная Европа (Latin-2) | iso-8859-2 | csISOLatin2, iso-ir-101, iso8859-2, iso_8859-2, iso_8859-2:1987, iso_8859_2-1999, ISO-8859-2-Windows-Latin-2, l2, latin2 | 28592 |
| Центральная Европа (Mac) | mac-ce-2000 | x-mac-ce | 10029 |
| Центральная Европа (Windows) | windows-1250 | x-cp1250 | 1250 |
| Японский (EUC) | euc-jp | csEUCPkdFmtJapanese, Extended_UNIX_Code_Packed_Format_for_Japanese, osf-euc_jp-2000, x-euc, x-euc-jp | 51932 |
| Японский (JIS) | iso-2022-jp | csISO2022JP, csISO2022JP2, iso-2022-jp-2, posix-2022_jp-2000 | 50220 |
| Японский (JIS – допускающий однобайтовую кану – SO/SI) | iso-2022-jp | csISO2022JP, _iso-2022-jp$SIO | 50222 |
| Японский (JIS – допускающий однобайтовую кану) | csISO2022JP | _iso-2022-jp$ESC | 50221 |
| Японский (Windows) | shift_jis | csShiftJIS, csWindows31J, ms_Kanji, shift-jis, x-ms-cp932, x-sjis, Windows-31J, windows-932-2000 | 932 |
Команда
-translit тип
действует аналогично команде задания кодовой страницы и позволяет использовать встроенную или загружаемую таблицу транслитерации для преобразования латиницы в кириллицу.
Тип транслитерации может быть либо именем предопределенного кодека:
#gost - ГОСТ 16876-71
либо именем текстового файла для загрузки произвольной таблицы транслитерации. Текстовый файл с таблицей транслитерации должен быть в кодировке utf-8 и иметь следующие формат:
кодирующая_латиница исходная_кириллица конец_строки
кодирующая_латиница исходная_кириллица конец_строки
кодирующая_латиница исходная_кириллица конец_строки
:
Процедурный API поисковой системы
Скачать SDK поисковой системы с примерами и другие компоненты можно здесь 
© Mental Computing 2010
|
|
изменено 01-Jun-10 |