Поисковый движок: кодировка текста, языки, локали

Поддержка Юникода

Ядро поисковой машины работает исключительно в Юникоде, что снимает всевозможные проблемы с кодировками - в том числе для разных кодировок одного языка (например, для кириллицы - 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-7csUnicode11UTF7, unicode-utf_7, unicode-1-1-utf-7, unicode-2-0-utf-7, x-unicode-2-0-utf-765000
Unicode (UTF-8)utf-8unicode-utf_8, unicode-utf_8-1_1, unicode-1-1-utf-8, unicode-2-0-utf-8, x-unicode-2-0-utf-865001
Unicode (UTF-16)unicode-utf_16csUnicode11, 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_32ISO-10646-UCS-4 
Арабский (ASMO 708)ASMO-708 708
Арабский (DOS)DOS-7200 720
Арабский (ISO)iso-8859-6csISOLatinArabic, iso-ir-127, ISO_8859-6, ISO_8859-6:1987, iso-8859_6-1999, ECMA-114, arabic28596
Арабский (Windows)windows-12566cp1256, windows-1256-20001256
Балтийские языки (Latin-4) iso-8859-4csISOLatin4, iso-ir-110, ISO_8859-4, ISO_8859-4:1988, iso-8859_4-1988, l4, latin428594
Балтийские языки (Windows)windows-1257windows-1257-20001257
Вьетнамский (Windows)windows-1258windows-1258-20001258
Греческий (ISO)iso-8859-7csISOLatinGreek, iso-ir-126, ISO_8859-7, ISO_8859-7:1987, iso-8859_7-1987, ECMA-118, ELOT_928, greek, greek828597
Греческий (Windows)windows-12533windows-1253-2000, x-cp12531253
Европа (Latin-3)iso-8859-3iso-8859_3-199928593
Европа (Latin-6)iso-8859-10iso-8859_10-1999 
Европа (Latin-7)iso-8859-13iso-8859_13-1999 
Европа (Latin-9)iso-8859-15iso-8859_15-199928605
Западная Европа (ASCII)us-asciiANSI_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-ansi20127
Западная Европа (Latin-1)iso-8859-1cp819, 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, l129591
Западная Европа (Mac)mac-roman-2000x-mac-roman10000
Западная Европа (Windows)windows-1252 1252
Иврит (DOS)DOS-862 862
Иврит (ISO–визуальный)iso-8859-88csISOLatinHebrew, iso-ir-138, ISO_8859-8, iso-8859_8-1999, ISO-8859-8 Visual, visual, hebrew28598
Иврит (ISO–логический)iso-8859-8-i 38598
Иврит (Windows)windows-1255ISO_8859-8:1988, iso-ir-138, logical, windows-1255-20001255
Кельтские языки (Latin-8)iso-8859-14iso-8859_14-1999 
Кириллица (DOS)cp866ibm866866
Кириллица (ISO)iso-8859-5csISOLatinCyrillic, iso-ir-144, ISO_8859-5, ISO_8859-5:1988, iso-8859_5-1999, cyrillic28595
Кириллица (Mac)mac-cyrillic-2000x-mac-cyrillic10007
Кириллица (Windows)windows-1251csWindows31Latin5, iso-8859-5-windows-latin-5, windows-1251-2000, x-cp12511251
Кириллица (КОИ8-Р)koi8-rcsKOI8R, koi, ru-koi8_r-200020866
Китайский – традиционное письмо (EUC)x-euc-twosf-euc_tw-200051950
Китайский – традиционное письмо (Windows)big5csBig5, CN-Big5, windows-950, windows-950-2000, x-x-big5950
Китайский – упрощенное письмо (GB2312)gb2312csGB2312, csISO58GB23128, iso-ir-58, GB2312, GBK, GB_2312-80, gb-3212-2000, chinese, CN-GB, CN-GB-ISOIR165936
Китайский – упрощенное письмо (HZ)hz-gb-2312 52936
Корейский (EUC)euc-krcsEUCKR, ks_c_5601, kcs5601, osf-euc_kr-200051949
Корейский (ISO)iso-2022-krcsISO2022KR, posix-2022_kr50225
Корейский (Windows)ks_c_5601-1987csKSC56011987, korean, windows-949, windows-949-2000949
Тайский (Windows)iso-8859-111windows-874, windows-874-2000874
Турецкий (ISO)iso-8859-99csISOLatin5, iso-ir-148, l5, ISO_8859-9, ISO_8859-9:1989, iso-8859_9-1999, latin528599
Турецкий (Windows)windows-1254windows-1254-2000, x-cp12541254
Украинский (КОИ8-У)koi8-u 21866
Центральная Европа (DOS)ibm8522cp852852
Центральная Европа (Latin-2)iso-8859-2csISOLatin2, iso-ir-101, iso8859-2, iso_8859-2, iso_8859-2:1987, iso_8859_2-1999, ISO-8859-2-Windows-Latin-2, l2, latin228592
Центральная Европа (Mac)mac-ce-2000x-mac-ce10029
Центральная Европа (Windows)windows-1250x-cp12501250
Японский (EUC)euc-jpcsEUCPkdFmtJapanese, Extended_UNIX_Code_Packed_Format_for_Japanese, osf-euc_jp-2000, x-euc, x-euc-jp51932
Японский (JIS)iso-2022-jpcsISO2022JP, csISO2022JP2, iso-2022-jp-2, posix-2022_jp-200050220
Японский (JIS – допускающий однобайтовую кану – SO/SI)iso-2022-jpcsISO2022JP, _iso-2022-jp$SIO50222
Японский (JIS – допускающий однобайтовую кану)csISO2022JP_iso-2022-jp$ESC50221
Японский (Windows)shift_jiscsShiftJIS, csWindows31J, ms_Kanji, shift-jis, x-ms-cp932, x-sjis, Windows-31J, windows-932-2000932

 

Транслитерация

Команда

-translit тип

действует аналогично команде задания кодовой страницы и позволяет использовать встроенную или загружаемую таблицу транслитерации для преобразования латиницы в кириллицу.

Тип транслитерации может быть либо именем предопределенного кодека:

#gost - ГОСТ 16876-71

либо именем текстового файла для загрузки произвольной таблицы транслитерации. Текстовый файл с таблицей транслитерации должен быть в кодировке utf-8 и иметь следующие формат:

кодирующая_латиница   исходная_кириллица конец_строки
     кодирующая_латиница   исходная_кириллица конец_строки
     кодирующая_латиница   исходная_кириллица конец_строки
                                       :

Дополнительные материалы

Процедурный API поисковой системы

Где скачать поисковую систему и SDK

Скачать SDK поисковой системы с примерами и другие компоненты можно здесь поисковая система

  © Mental Computing 2010
изменено 01-Jun-10