Глава 7. Поддержка языков

Содержание
7.1. Кодировки
7.2. Создание многоязычных страниц поиска
7.3. Сегментеры фраз японского, тайского, корейского и китайского языков
7.4. Поддержка мультиязычных веб серверов

7.1. Кодировки

7.1.1. Поддерживаемые кодировки

DataparkSearch поддерживает почти все популярные в современном Internet однобайтные и многобайтные кодировки, включая корейский euc-kr, китайские Big5, gbk и gb2312, японские shift-jis, euc-jp и iso-2022-jp, а так же Unicode UTF-8. Это позволяет индексировать документы на более чем 650-ти языках мира, предусмотренных в Unicode.

Внимание! Из-за большого объема перекодировочных таблиц, приводящего к увеличению размера исполняемых файлов, поддержка многобайтных кодировок не компилируется по-умолчанию. Смотрите параметры configure, как активизировать поддержку этих кодировок при компиляции.

Таблица 7-1. Кодировки и их языковые группы

>ГруппаКодировки
Arabiccp864, ISO-8859-6, MacArabic, windows-1256
Armenianarmscii-8
Balticcp775, ISO-8859-13, ISO-8859-4, windows-1257
CelticISO-8859-14
Central Europeancp852, ISO-8859-16, ISO-8859-2, MacCE, MacCroatian, MacRomania, windows-1250
Chinese SimplifiedGB2312, GBK
Chinese TraditionalBig5, Big5-HKSCS, cp950, GB-18030
Cyrilliccp855, cp866, cp866u, ISO-8859-5, KOI-7, KOI8-C, KOI8-R, KOI8-U, MacCyrillic, windows-1251
Georgiangeorgian-academy, georgian-ps, geostd8
Greekcp869, cp875, ISO-8859-7, MacGreek, windows-1253
Hebrewcp862, ISO-8859-8, MacHebrew, windows-1255
Icelandiccp861, MacIceland
IndianMacGujarati, tscii
IranianISIRI3342
JapaneseEUC-JP, ISO-2022-JP, Shift_JIS
KoreanEUC-KR
Laocp1133
Nordiccp865, ISO-8859-10
South EurISO-8859-3
TajikKOI8-T
Thaicp874, ISO-8859-11, MacThai
Turkishcp1026, cp857, ISO-8859-9, MacTurkish, windows-1254
Unicodesys-int, UTF-16BE, UTF-16LE, UTF-8
VietnameseVISCII, windows-1258
Westerncp437, cp500, cp850, cp860, cp863, IBM037, ISO-8859-1, ISO-8859-15, MacRoman, US-ASCII, windows-1252

7.1.2. Разные названия кодировок

Каждая кодировка имеет модет иметь несколько различных вариантов названия. Например, iso-8859-2, iso8859-2, latin2 - названия одной и той же кодировки. DataparkSearch понимает следующие варианты названий кодировок:

Таблица 7-2. Синонимы наименований кодировок

armscii-8armscii-8, armscii8
Big5big-5, big-five, big5, bigfive, cn-big5, csbig5
Big5-HKSCSbig5-hkscs, big5_hkscs, big5hk, hkscs
cp10261026, cp-1026, cp1026, ibm1026
cp11331133, cp-1133, cp1133, ibm1133
cp437437, cp437, ibm437
cp500500, cp500, ibm500
cp775775, cp775, ibm775
cp850850, cp850, cspc850multilingual, ibm850
cp852852, cp852, ibm852
cp855855, cp855, ibm855
cp857857, cp857, ibm857
cp860860, cp860, ibm860
cp861861, cp861, ibm861
cp862862, cp862, ibm862
cp863863, cp863, ibm863
cp864864, cp864, ibm864
cp865865, cp865, ibm865
cp866866, cp866, csibm866, ibm866
cp866u866u, cp866u
cp869869, cp869, csibm869, ibm869
cp874874, cp874, cs874, ibm874, windows-874
cp875875, cp875, ibm875, windows-875
cp950950, cp950, windows-950
EUC-JPcseucjp, euc-jp, euc_jp, eucjp, ujis, x-euc-jp
EUC-KRcseuckr, euc-kr, euc_kr, euckr
GB-18030gb-18030, gb18030
GB2312chinese, cn-gb, csgb2312, csiso58gb231280, euc-cn, euc_cn, euccn, gb2312, gb_2312-80, iso-ir-58
GBKcp936, gbk, windows-936
georgian-academygeorgian-academy
georgian-psgeorgian-ps
geostd8geo8-gov, geostd8
IBM037037, cp037, csibm037, ibm037
ISIRI3342isiri-3342, isiri3342
ISO-2022-JPcsiso2022jp, iso 2022-jp, iso-2022-jp
ISO-8859-1cp819, csisolatin1, ibm819, iso 8859-1, iso-8859-1, iso-ir-100, iso8859-1, iso_8859-1, iso_8859-1:1987, l1, latin-1, latin1
ISO-8859-10csisolatin6, iso 8859-10, iso-8859-10, iso-ir-157, iso8859-10, iso_8859-10, iso_8859-10:1992, l6, latin-6, latin6
ISO-8859-11iso 8859-11, iso-8859-11, iso8859-11, iso_8859-11, iso_8859-11:1992, tactis, thai, tis-620, tis620
ISO-8859-13iso 8859-13, iso-8859-13, iso-ir-179, iso8859-13, iso_8859-13, l7, latin-7, latin7
ISO-8859-14iso 8859-14, iso-8859-14, iso-ir-199, iso8859-14, iso_8859-14, iso_8859-14:1998, l8, latin-8, latin8
ISO-8859-15iso 8859-15, iso-8859-15, iso-ir-203, iso8859-15, iso_8859-15, iso_8859-15:1998, l9, latin-0, latin-9, latin0, latin9
ISO-8859-16iso 8859-16, iso-8859-16, iso-ir-226, iso8859-16, iso_8859-16, iso_8859-16:2000
ISO-8859-2csisolatin2, iso 8859-2, iso-8859-2, iso-ir-101, iso8859-2, iso_8859-2, iso_8859-2:1987, l2, latin-2, latin2
ISO-8859-3csisolatin3, iso 8859-3, iso-8859-3, iso-ir-109, iso8859-3, iso_8859-3, iso_8859-3:1988, l3, latin-3, latin3
ISO-8859-4csisolatin4, iso 8859-4, iso-8859-4, iso-ir-110, iso8859-4, iso_8859-4, iso_8859-4:1988, l4, latin-4, latin4
ISO-8859-5csisolatincyrillic, cyrillic, iso 8859-5, iso-8859-5, iso-ir-144, iso8859-5, iso_8859-5, iso_8859-5:1988
ISO-8859-6arabic, asmo-708, csisolatinarabic, ecma-114, iso 8859-6, iso-8859-6, iso-ir-127, iso8859-6, iso_8859-6, iso_8859-6:1987
ISO-8859-7csisolatingreek, ecma-118, elot_928, greek, greek8, iso 8859-7, iso-8859-7, iso-ir-126, iso8859-7, iso_8859-7, iso_8859-7:1987
ISO-8859-8csisolatinhebrew, hebrew, iso 8859-8, iso-8859-8, iso-ir-138, iso8859-8, iso_8859-8, iso_8859-8:1988
ISO-8859-9csisolatin5, iso 8859-9, iso-8859-9, iso-ir-148, iso8859-9, iso_8859-9, iso_8859-9:1989, l5, latin-5, latin5
KOI-7iso-ir-37, koi-7, koi7
KOI8-Ccskoi8c, koi8-c, koi8c
KOI8-Rcskoi8r, koi8-r, koi8r
KOI8-Tcskoi8t, koi8-t, koi8t
KOI8-Ucskoi8u, koi8-u, koi8u
MacArabicmacarabic
MacCEcmac, macce, maccentraleurope, x-mac-ce
MacCroatianmaccroation
MacCyrillicmaccyrillic, x-mac-cyrillic
MacGreekmacgreek
MacGujaratimacgujarati
MacHebrewmachebrew
MacIcelandmacisland
MacRomancsmacintosh, mac, macintosh, macroman
MacRomaniamacromania
MacThaimacthai
MacTurkishmacturkish
Shift_JIScsshiftjis, ms_kanji, s-jis, shift-jis, shift_jis, sjis, x-sjis
sys-intsys-int
tsciitscii
US-ASCIIansi_x3.4-1968, ascii, cp367, csascii, ibm367, iso-ir-6, iso646-us, iso_646.irv:1991, us, us-ascii
UTF-16BEutf-16, utf-16be, utf16, utf16be
UTF-16LEutf-16le, utf16le
UTF-8utf-8, utf8
VISCIIcsviscii, viscii, viscii1.1-1
windows-1250cp-1250, cp1250, ms-ee, windows-1250
windows-1251cp-1251, cp1251, ms-cyr, ms-cyrl, win-1251, win1251, windows-1251
windows-1252cp-1252, cp1252, ms-ansi, windows-1252
windows-1253cp-1253, cp1253, ms-greek, windows-1253
windows-1254cp-1254, cp1254, ms-turk, windows-1254
windows-1255cp-1255, cp1255, ms-hebr, windows-1255
windows-1256cp-1256, cp1256, ms-arab, windows-1256
windows-1257cp-1257, cp1257, winbaltrim, windows-1257
windows-1258cp-1258, cp1258, windows-1258

7.1.3. Перекодировка во время индексации

indexer перекодирует все документы в кодировку, указанную в команде LocalCharset в файле indexer.conf. Внутри программы перекодировка реализована посредством промежуточного представления в виде Unicode. Особенность DataparkSearch состоит в том, что перекодировка между несовместимыми кодировками (например, между русской и греческой) не приводит к потере данных. В случае, если перекодировка какого-либо символа невозможна, DataparkSearch представит этот символ в базе данных в HTML-формате в виде &#NNN; где NNN - код символа, закрепленного за ним в Unicode. Таким образом, вне зависимости от выбора LocalCharset, DataparkSearch сохранит полную информацию о документе без каких-либо потерь. Однако, выбор LocalCharset влияет на размер базы данных.

7.1.4. Выбор LocalCharset

Выбор LocalCharset должен производиться с учетом языкового наполнения индексируемого пространства. Правильный выбор позволит уменьшить место, требуемое для хранения, а так же увеличить скорость индексации и поиска.

Если командой LocalCharset указана кодировка UTF-8, то это позволит сохранять любые символы, поддерживаемым в Unicode без необходимости представлять их в HTML-формате. Однако, следует иметь в виду, что это заведомо приводит к использованию до двух-трех байт на каждую не-латинскую букву. Например, на каждую букву кириллицы требуется два байта для сохранения ее в UTF-8.

Поскольку все кодировки включают в себя латинские буквы, то любая кодировка предоставляет поддержку по-крайней мере двух языков - английского и еще какого-то одного (или более) языка (единственное исключение - US-ASCII, поддерживающий только латинские буквы). Это означает, что при использовании DataparkSearch с LocalCharset, отличным от UTF-8, одновременная индексация документов с языками из одной группы не приводит к необходимости использовать HTML-формат, а значит не приводит к увеличению необходимого дискового пространства.

Например, если Ваша поисковая машина настроена использовать LocalCharset из 5-й группы (Кирилица), то документы на болгарском, белорусском, македонском, русском, сербском, украинском, а так же на английском языках будут сохранены компактно, с использованием одного байта на одну букву. Индексирование документов в других кодировках не из 5-й группы (включая UTF-8) также возможно; однако indexer будет использовать HTML-формат для сохранения букв, отличных от кирилических и английских. Сохранение, например, греческой буквы в кириллической кодировке требует применение семь байт на одну букву.

Таким образом, следует придерживаться следующего алгоритма при выборе LocalCharset: если Вы индексируете, например, в-основном кириллические и анлгийские документы, то выгоднее изпользовать LocalCharset из 5й группы. Если же Ваши документы сожержат информацию на языках из многих языковыз групп одновременно, то в качестве LocalCharset выгоднее использовать UTF8.

7.1.5. Определение кодировки документа

indexer определяет кодировку в документа в следующем порядке:

  1. "Content-type: text/html; charset=xxx"

  2. <META NAME="Content-Type" CONTENT="text/html; charset=xxx">

    Выбор этого варианта можно выключить указав команду GuesserUseMeta no в файле конфигурации indexer.conf.

  3. При выключенном автораспозновании: кодировка по-умолчанию, указанная командой "Charset"

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

7.1.6. Автоматическое распознавание кодировки

DataparkSearch имеет механизм автоматического распознавания кодировки и языка документа. В настоящее время распознается около 100 различных комбинаций кодировки и языка. Распознавание реализовано с использованием так называемой "N-Gram-Based Text Categorization" технологии. В комплекте программы поставляются файлы с так называемыми "картами языков", один файл на каждую пару кодировка-язык. По-умолчанию они устанавливаются в /usr/local/dpsearch/etc/langmap/. Чтобы увидеть полный список распознаваемых в настоящий момент языков и кодировок, взгляните в этот каталог. Распознавание работает хорошо на текстах в 500 байт и длиннее. Более короткие тексты могут распознаваться хуже. Для активизации автоматического распознавания кодировки необходимо загрузить языковые карты, используя команды LangMap.

7.1.6.1. Команда LangMapFile

Загружает из указанного файла карту языка и кодировки для автоматического их определения. Вы можете задать как абсолютный, так и относительный путь. Относительный путь задаётся от директории etc. Можно использовать несколько команд LangMapFile.

LangMapFile langmap/en.ascii.lm

7.1.6.2. Создание собственных карт языков

Для создания собственных карт языков служит утилита dpguesser. Кроме этой утилиты вам также потребуется файл-образец текстов на данном языке в нужной кодировке. Для создания своей карты языка используйте следующий формат команды:

        dpguesser -p -c charset -l language < FILENAME > language.charset.lm

Утилиту dpguesser можно также использовать для определения языка и кодировки файла на основании уже созданных карт языков. Для этого используйте следующий формат команды:

        dpguesser [-n maxhits] < FILENAME

Для некоторых языков существует несколько используемых кодировок. Для преобразования текстов из одной, поддерживаемой DataparkSearch кодировки, в другую предназначена утилита dpconv.

        dpconv [OPTIONS] -f charset_from -t charset_to [configfile] < infile > outfile

По умолчанию, утилиты dpguesser и dpconv устанавливаются в директорию /usr/local/dpsearch/sbin/.

Поддерживается автоматическое обновление карт языков и кодировок, если удалённый сервер возвращает чётко указаные язык и кодировку. Для включения этой возможности необходимо в файле indexer.conf указать команду

LangMapUpdate yes

По умолчанию, DataparkSearch использует только первые 512 байт каждого индексируемого файла для определения языка и кодировки. Вы можете изменить это значение при помощи команды GuesserBytes. Используйте значение 0 для учёта всего такста индексируемого документа.

GuesserBytes 16384

7.1.7. Кодировка документов по-умолчанию

Используйте команду RemoteCharset в indexer.conf чтобы установить кодировку документов по-умолчанию.

Если индексируемый сервер не выдает кодировку документа ни в заголовке Content-Type, ни в META-тэге, и при этом автоматическое распознаывание либо отключено, либо не дало хорошего результата (т.е. язык и кодировка документа "не похожи" на представленные в загруженных картах), то в качестве кодировки документа будет использована кодировка, указанная в команде RemoteCharset. Если же кодировка по-умолчанию не указана, то будет использована iso-8859-1 (latin1).

7.1.8. Язык документов по-умолчанию

Вы можете установить язык документов по-умолчанию с помощью команды DefaultLang в файле indexer.conf. Это может пригодиться, например, во время поиска для ограничения поиска только по документам на указанном языке.

DefaultLang <string>

Задаёт язык документов по умолчанию.

DefaultLang en

7.1.9. Перекодировка во время поиска

Чтобы указать кодировку, в которой будут оторбражаться результаты поиска, используйте команду BrowserCharset в search.htm. BrowserCharset может отличаться от LocalCharset. Поисковая программа произведет перекодировку автоматически.

7.1.10. Команда LocalCharset

Задаёт кодировку, которая будет использоваться для хранения информации в базе данных. Данные во всех других кодировках будут перекодированы в эту кодировку. См. Разд. 7.1> для подробного описания как выбрать LocalCharset для языков, используемых на вашем сайте или сайтах, а также списка поддерживаемых кодировок. Эта команда должны быть задана один раз и имеет глобальный эффект для всего файла конфигрурации. Значение по умолчанию: iso-8859-1 (latin1).

LocalCharset koi8-r

7.1.11. Команда RemoteCharset

RemoteCharset <charset>

<сharset> - кодовая страница по умолчанию для последующих команд Server, Realm или Subnet. Используется при индексировании "плохих" серверов, не предоставляющих информации о кодировке в заголовках ответа сервера или в <META NAME="Content" Content="text/html; charset="some_charset"> на страницах. Команда действует до конца файла, или до следующей команды RemoteCharset. Значение по умолчанию: iso-8859-1 (latin1).

RemoteCharset iso-8859-5

7.1.12. Команда URLCharset

URLCharset <charset>

<charset> - кодовая страница для аргументов последующих команд Server, Realm или URL. Эта команда задаёт кодовубю страницу только для аргументов последующих команду и не влияет на определение кодировки индексируемых страниц. Имеет меньший приоритет, нежели команда RemoteCharset. Может задаваться перед каждой командой Server, Realm или URL и действует до конца файла конфигурации или до следующей команды URLCharset. Значение по умолчанию: ISO-8859-1 (latin1).

URLCharset KOI8-R

7.1.13. Команда CharsToEscape

CharsToEscape "\"&<>![]"

Используйте эту команду в вашем поисковом шаблоне для указания списка эскейп-символов для мета-переменных поискового шаблона типа $&(x).