Verification: a143cc29221c9be0

Pgsql что это в php

Pgsql что это в php

Предисловие

  • В чем цель данного документа?
  • Для кого предназначен данный документ?
  • К кому обращаться при возникновении проблем?
        Если здесь нет ответа на мой вопрос - что делать?
  • Обнаружил ошибку в этом документе! Кому я могу сообщить об этом?

  • Общие вопросы по хостингу/доменам/электронным ящикам

  • Какие ресурсы становятся доступны при регистрации домена в системе e4u.ru?
  • Как проверить свободно ли доменное имя?
        Какой домен 3-го уровня можно зарегистрировать?
        Какой почтовый ящик у вас можно зарегистрировать?
  • Какое программное обеспечение установлено на вашем хостинге?
  • Какие языки программирования и языки сценариев, используемые при разработке динамических веб-сайтов и серверных веб-приложений, поддерживаются?
  • Смогут ли работать на вашем хостинге программы скомпилированные под MS Windows?
  • Имеется ли у вас какой-нибудь репозиторий бесплатных web-приложений/CMS? Как установить web-приложение из этого репозитария?
  • Кто занимается регистрацией доменного имени для клиента?
        Кто занимается настройкой делегирования домена клиента?
  • Кто занимается настройкой днс для домена клиента?
  • Кто занимается перенастройкой днс для домена клиента?
        Кто занимается регистрацией почтовых ящиков в домене клиента?
  • Кто занимается выделением лимитов для домена клиента и настройкой общих ограничений для домена в системе хостинга?
  • Кто обеспечивает поддержку доступности выделенных ресурсов на серверах хостинга?
  • Кто занимается установкой сайта/установкой каких либо CMS-систем/"заливкой" данных на сайт/изменением данных на сайте?
  • Кто занимается выдачей паролей к установленным представителем клиента CMS-системам (системам управления содержимым сайта)?

  • Панель управления

  • Для чего и для кого предназначена панель управления?
  • Где получить справку по функциональности панели управления?
  • Не могу зайти в панель управления с логином postmaster. как правильно?
  • Какой либо пароль скомпрометирован (потерян/забыт/украден). Что можно сделать?
  • Добрый день! Не нашел в интерфейсе, где указывается почта, на которую дублируются helpdesk заявки с Вашего сайта. Необходимо вместо ящика xx@yyy.ru записать ящик zzz@yyy.ru.
        Добрый день! Где указывается емаil для уведомлений?

  • ДНС

  • Какие днс сервера указывать при делегировании домена your-domain.ru на регистраторе доменных имен?
  • Как настроена зона днс по умолчанию для домена your-domain.ru?
  • Хотим узнать/изменить MX запись домена yyyy.zz и/или запись в обратной зоне?
        Просим прописать обратную зону днс.
        Нужно прописать revers-зону.

  • FTP

  • Как получить доступ к сайту www.your-domain.ru по ftp?
  • В каком режиме (активный/пассивный) разрешен доступ к ftp-серверу?
  • При соединении с ftp наблюдается: "425 Can't build data connection: Connection refused". Что делать?
        При соединении с ftp наблюдается: "500 Illegal Port command". Что делать?
  • Что за папки я вижу и для чего они предназначены?
  • В какие папки я имею доступ?
  • Необходимо срочно сменить наш логин и пароль доступа к фтп! Сейчас наш логин для доступа к фтп: user00122.
  • Добрый день! Проблема с доступом к фтп, невозможно соединиться по фтп с: ftp.otherdomain.ru!
        Выдается сообщение, что превышено время ожидания ответа от сервера и(или) не найдена удаленная папка.
  • Не могу отправить файлы объемом X mb по фтп на сервер хостинга.
        Ни по ftp (на четверть заливает, потом говорит "broken pipe"), ни через веб-интерфейс.
        Статистика в панели управления показывает, что занято 40 мб, мой лимит 50 mb. почему же не удается добавить файл размером 8mb?
  • Как проверить, что данные для моего домена загружены по фтп именно туда куда нужно?
  • как подключиться к ftp через PROXY?
        У нас в организации используется proxy-server ZZZZ. не удается зайти по ftp на сайт. не удается обновить файлы. Что делать?
  • По ftp разместили на сервере документы для внутреннего использования. Как запретить к ним доступ для посторонних через web?.

  • Базы данных

  • Каковы ограничения mysql?
  • Каковы ограничения pgsql?
  • Что нужно для получения 1 базы данных MySQL?
  • Как создать базу данных?
  • По какому адресу, порту можно обращаться к БД из web-приложения?
  • Каким образом выполнить первоначальное создание и заполнение таблиц моей базы данных?
  • Каким образом заполнить базу скриптом sql?
  • Каким образом сделать импорт базы из ранее сохранённого дампа базы mysql?
  • Как сделать дамп базы данных?
  • У меня сайт создан на базах данных. Как правильно выложить его на вашем сервере?
        PHP файлы, в которых как раз идет работа с базами, не отображаются в браузере, вернее отображаются как пустые страницы. Что делать? В чем причина?
  • Здравствуйте! Скажите, пожалуйста, почему я не могу восстановить БД?
        (в строке CREATE DATABASE `test_db`... выдает ошибку:
        Ответ MySQL: #1044 - Access denied for user 'test_user'@'%' to database 'test_db')

  • WEB

  • Какой полный путь до файлов на сервере хостинга?
  • На сайте xyz.ru не показываются рисунки из папки icons. почему?
        На сайте xyz.ru не виден документ, размещенный в папке httpdocs/error. почему?
  • Не загружаются поддомен: XXX.YYY.ru. Основной сайт YYY.ru работает. Что делать?
  • SSI

  • Как использовать SSI?
  • Web-перенаправления и web-пересылки:

  • Как организовать перенаправление на другой сайт?
  • Как организовать перенаправление на стартовую страницу с несуществующих страниц?
  • Php/perl/cgi

  • Как активировать на Вашем сервере пхп?
  • Для нормального функционирования сайта требуется, чтобы скрипты запускались не только из папки cgi, это реализуемо?
  • В каком режиме работает php? где у вас настройки php?
        Каким образом поменять режим запуска php?
  • Каковы ограничения на php в режиме mod_php?
  • Каковы ограничения FastCgi?
  • Как переконфигурировать php?
        Как изменить параметры php в режиме mod_php ?
        Как настроены параметры php в режиме php-cgi?
  • Есть ли какие-либо особенности работы php на Вашем хостинге?
  • С какими модулями собран php на вашем хостинге?
  • Как увидеть с какими настройками запускается php на моем сайте?
  • Запускаю http://www.llllll.ru/index.php?L=6. При этом L - всегда не определена??? почему?
  • Как обработать файл с расширением .phtml с помощью php?
  • Куда рекомендуется размещать скрипты perl?
  • Почему-то не запускается perl-script, лежащий не в пределах cgi-bin?
  • Ошибка открытия файлов в php или perl
        (пример ошибки в файле журнала - failed to open stream: Permission denied in /var/www/vhosts/X/httpdocs/index.php on line 41)?
  • Я создал файл из скрипта при запуске этого скрипта веб-сервером. Созданный файл веб сервером не отображается. В чем причина?
  • Хотелось бы видеть на сервере perl-модуль Xxxx:Zzzz (со cpan.org), возможно его установить?
  • где у Вас Pear?
  • Ругается на эту строку: require_once("DB.php"); // подключаем класс DB PEAR .
        какой путь к этому классу у вас на хостинге?
  • Как правильно отправить почтовое сообщение из PHP/perl/командной строки?
        Я отправил письмо из PHP. Сообщение не дошло по назначению. Что делать?

  • CMS

  • у меня имеется CMS XXX. не устанавливается СМS/не работает функция ZZZ. Что делать?
  • у моей CMS есть определенные требования для хостинга. Возможно, ли их реализовать на вашем хостинге для полноценной работы CMS?
  • Bitrix ( http://dev.1c-bitrix.ru/docs/php.php )

  • Как установить битрикс для двух сайтов на одной базе?
  • на Вашем хостинге при скачивании обновлений в Bitrix выдается сообщение:
        Обнаружены ошибки:
        [ULMU04] Не могу создать временный файл в папке "/var/www/vhosts/QQQQQQ.ru/httpdocs/bitrix/updates".
        [PU302] Загрузка обновлений прервана.
        что делать?
  • IPI.MANAGER ( http://www.ipi.ru/documentation/IPI-MANAGER/ )

  • что-то требуется сделать перед установкой системы IPI.MANAGER? (как соблюсти требования IPI.MANAGER?)
  • JOOMLA ( http://help.joomla.org/ , joomlaportal.ru , joomla-support.ru )

  • как изменить права на файлы/папки созданные "движком" joomla?
  • Для joomla требуется настройка php - magic_quotes_gpc On. Как сделать?
  • Движок joomla жалуется, что Каталог для записи сессий Недоступен для записи - /var/lib/php/session . как решить проблему?

  • Webmail (!!! в системе e4u.ru)

  • Как читать/отправлять почту через веб-интерфейс E4U.RU?
  • Не могу зайти в webmail (http://webmail.e4u.ru) с логином postmaster? как правильно (для ящика user@mydomain.e4u.ru)?
        У меня имеется ящик UseR@mydomain.e4u.ru. Могу я читать/отправлять почту через веб-интерфейс?
  • Как очистить содержимое ящика (user@mydomain.e4u.ru) через web-интерфейс?

  • Почта (!!! в системе e4u.ru)

  • Здравствуйте! Подскажите, пожалуйста, как отправить письмо?
  • Как настроить почтовую программу для ящика UsEr@e4u.ru?
        Какие POP,SMTP серверы, логины использовать?
  • Как правильно настроить почтовую программу для электронного ящика для моего домена, который обслуживается в системе E4U.RU? (для доменов вида MYdomain.e4u.ru, MYdomain.com и т.д.)
  • Общие рекомендации по настройкам почтовых программ?
  • Как настроить почту в программе The Bat?
  • Как настроить почту в программе Outlook?
  • Мой ящик на Ваших серверах будет работать (принимать/отправлять почту) если я подключусь ноутбуком(мобильным телефоном) к интернету не из Вашей сети?
  • Мой временный провайдер (обычно я пользуюсь услугами у Вас) запретил отправку почты по 25 порту. У Вас есть альтернативные порты для отправки почты через вас?
        Какие порты имеются у Вас для безопасной отправки/приема почты?
  • У вас есть relay? Как мне отправить почту через ваш relay?
        У меня имеется почтовый сервер, используется mdaemon(exchange/exim и тд). Как настроить пересылку через ваш сервер?
        У меня имеется почтовый ящик у стороннего провайдера. Когда я нахожусь в вашей сети SMTP-Сервер другого провайдера не хочет принимать почту. Какой у вас smtp?
  • Почтовое имя создано в панели управления, но не включается новый почтовый ящик.
  • Невозможно отправить сообщение. Приём сообщений работает. Что делать?
        Невозможно отправить почту. Вероятно наш IP заблокирован. входящая почта работает. как разблокировать?
  • Какие ограничения на отправку писем?
  • Какие ограничения на прием?
  • Просим увеличить ограничение объема до 100 Мб для ящика ччч@нннн.e4u.ru.
        Возможно увеличить кол-во почтовых ящиков?
  • Как организовать пересылку с ящика (aaa@e4u.ru) на другой (bbb@domain.ru) ?
  • Как я узнаю, что мой ящик переполнен? Принимаю ли я почту с этого момента?
        Что сделать, чтобы начать принимать почту после сообщения о превышении лимита?
  • Не могу скачать очень-очень большое письмо с ящика user@mydomain.e4u.ru. Что делать?
  • Подозрение что ко мне не доходит почта от некоторых отправителей. Что делать?
        Не работает почтовый ящик zzzz@qqqqq.e4u.ru!!! не получает письма!
  • Некоторые приходящие письма дублируются. Что может быть?
  • Наблюдается ошибка (сообщение о проблеме, окно с текстом и тд) при работе с почтовой системой. Что делать?

  • АнтиCпам (!!! в системе e4u.ru)

  • Как настроить обработку спама?
        У меня много спама. что делать?
  • Как лучше настроить антиспам (в панели управления -> в почтовом ящике -> в настройках антиспам фильтра) ?
        Как настроить серверный антиспам?
  • При получении писем между электронными ящиками домена yyy-zzz.ru в теме письма появляется Надпись: *****SPAM*****. Как убрать?
  • Как/где настроить антиспам для электронного ящика и какие настройки на что влияют?
  • Просьба предоставить информацию по схеме обработки спама.
        Каким образом мы можем провести настройки для Антиспама?
  • Порекомендуйте пожалуйста нормальный способ обработки спама.
        Как удалить весь спам?
  • Почтовый сервер не принимает почту c сообщением вида "The message has been rejected by spam filtering engine." Что делать?
        Почтовый сервер сообщает "This message violates our content filtration policy." и не дает отправить письмо. Что делать?
        Мы пользуемся системой рассылки почты. Ваш сервер не пускает нас и не даёт отправить некоторые письма. Что делать?
  • Как переслать спам (или ошибочно распознанные как спам) группе спам-аналитиков?



  • Предисловие

  • В чем цель данного документа?
  • 	Цель данного документа:
    	Ускорить решение возможных проблем связанных с предоставлением услуг в системе E4U.RU (хостинг, домены, ящики) путем записи часто возникающих вопросов и ответов на них.
    
  • Для кого предназначен данный документ?
  • 	Документ предназначен для сотрудников служб технической поддержки, системных администраторов, web-дизайнеров и других специалистов, сталкивающихся с вопросами по хостингу/почте в системе E4U.RU.
    
  • К кому обращаться при возникновении проблем?
        Если здесь нет ответа на мой вопрос - что делать?
  • 	Обратитесь в службу поддержки пользователей. 
    	Информация на сайте http://enforta.com/ в разделе "Контакты".
    	Контакт-Центр - телефон: 8-800-500-10-10
    		        электронная почта: service{собака}enforta.com
    
  • Обнаружил ошибку в этом документе! Кому я могу сообщить об этом?
  • 	hosting{собака}enforta.com. Спасибо!
    

    Общие вопросы по хостингу/доменам/электронным ящикам

  • Какие ресурсы становятся доступны при регистрации домена в системе e4u.ru?
  • 	в общем случае для домена mydomain.ru c указанным ftp-логином userftp и паролем Sec2RET доступны:
    
    		Панель управления (для администратора домена):		https://cp.e4u.ru 
    									https://hosting.e4u.ru:8443
    			Login: mydomain.ru
    			Пароль: Sec2RET
    
    		WEB-Сайт (для всех):					http://mydomain.ru 
    									http://www.mydomain.ru 
    
    		FTP-доступ (для web-дизайнера домена):			ftp://ftp.mydomain.ru 
    			Login: userftp
    			Пароль: Sec2RET
    
    		Webmail (для пользователей почты):			https://webmail.mydomain.ru
    			Login: mailuser@mydomain.ru (полностью)
    			Пароль(указанный при регистрации данного ящика)
    
    		Pop/Imap/Smtp серверы (для почтовых программ):		mail.mydomain.ru 
    			Login: mailuser@mydomain.ru (полностью)
    			Пароль(указанный при регистрации данного ящика)
    
    		Днс-серверы для делегирования домена (для настроек в системах регистрации доменов):
    									ns1.e4u.ru
    									ns2.e4u.ru
    
  • Как проверить свободно ли доменное имя?
        Какой домен 3-го уровня можно зарегистрировать?
        Какой почтовый ящик у вас можно зарегистрировать?
  • 	Воспользуйтесь 
    	         проверкой доступности ресурсов на нашем хостинге  . 
    
  • Какое программное обеспечение установлено на вашем хостинге?
  • 	Red Hat EL based OS 
    	bind		9.8
    	proftpd		1.3
    	httpd		2.2
    	perl		5.10
    	php		5.3 (mod/cgi/fastcgi)
    	python		2.6
    	tomcat		6.0
    	mysql		5.1
    	postgresql	8.4
    	postfix		2.8
    	drweb		5.0
    	spamassassin	3.3
    	klms		8.0
    	courier-imap	3.0
    	horde		3.3
    	atmail		1.05
    	mailman		2.1
    	psa		11.0
    	awstats		7.11
    	webalizer	2.21
    			(по состоянию на 14.08.15)
    
  • Какие языки программирования и языки сценариев, используемые при разработке динамических веб-сайтов и серверных веб-приложений, поддерживаются?
  • 	PHP
    	Perl
    	Python	 
    	CGI	 
    	FastCGI
    	Apache ASP	 
    	SSI	 
    
  • Смогут ли работать на вашем хостинге программы скомпилированные под MS Windows?
  • 	Если ваше программное обеспечение подразумевает обязательное наличие Microsoft Windows,	то для данного ПО работоспособность не гарантируется. На данный момент(14.08.15) хостинг работает только на Linux.
    
  • Имеется ли у вас какой-нибудь репозиторий бесплатных web-приложений/CMS? Как установить web-приложение из этого репозитария?
  • 	Да. Доступ через панель управления - закладка 'Приложения'.
    
  • Кто занимается регистрацией доменного имени для клиента?
        Кто занимается настройкой делегирования домена клиента?
  • 	По согласию сторон (или Энфорта/ или Клиент):
    
    	Если у клиента собственный аккаунт у одного из Регистраторов доменных имён: 
    		- клиент самостоятельно настраивает делегирование домена (по рекомендациям Энфорта) 
    		и самостоятельно оплачивает услуги регистрации и продления доменного имени (по счетам Регистратора).
    	Если у клиента аккаунт в RU-Centr и этот аккаунт передан под управление компании 'Престиж Интернет'
    		- 'Престиж Интернет' самостоятельно занимается регистрацией домена, делегированием, продлением услуг Регистратора доменных имён (по счетам Регистратора)
    		- клиент оплачивает услуги по тарифам Энфорта (по счетам Энфорта)
    
  • Кто занимается настройкой днс для домена клиента?
  • 	Первоначальная настройка производится Энфортой. 
    	По умолчанию все записи в днс-зоне указывают на ресурсы на хостинге Энфорты.
    	В дальнейшем Клиент может управлять dns-насройками как самостоятельно (в системе управления хостингом), так и отправляя письменные заявки в компанию Энфорта.
    
  • Кто занимается перенастройкой днс для домена клиента?
        Кто занимается регистрацией почтовых ящиков в домене клиента?
  • 	По согласию сторон (или Энфорта/ или Клиент). 
    	Клиент может это делать как самостоятельно (в системе управления хостингом), так и отправляя письменные заявки в компанию Энфорта.
    
  • Кто занимается выделением лимитов для домена клиента и настройкой общих ограничений для домена в системе хостинга?
  • 	Энфорта. Лимиты определяются тарифным планом.
    
  • Кто обеспечивает поддержку доступности выделенных ресурсов на серверах хостинга?
  • 	Энфорта.
    
  • Кто занимается установкой сайта/установкой каких либо CMS-систем/"заливкой" данных на сайт/изменением данных на сайте?
  • 	Представитель клиента (администратор/программист/редактор/модератор/веб-студия).
    	Энфорта предоставляет только реквизиты доступа к серверам по ftp, к системе управления хостингом и обеспечивает работоспособность площадки хостинга.
    
  • Кто занимается выдачей паролей к установленным представителем клиента CMS-системам (системам управления содержимым сайта)?
  • 	Представитель клиента (администратор/программист/редактор/модератор/веб-студия).
    

    Панель управления

  • Для чего и для кого предназначена панель управления?
  • 	Панель управления хостингом предназначена для решения задач администрирования ресурсов, выделенных для индивидуальных доменов клиентов. 
            Панель управления ориентирована на системных администраторов, вебдизайнеров, ит-специалистов клиентов и на службы поддержки пользователей/системных администраторов Энфорта.
    
  • Где получить справку по функциональности панели управления?
  • 	в панели управления - вверху страницы - ссылка "Справка"
    
  • Не могу зайти в панель управления с логином postmaster. как правильно?
  • 	Для администратора домена требуется вводить полное имя домена (например mydomain.e4u.ru) 
    	Для учетных записей почты требуется вводить полное имя ящика (например user3@mydomain.e4u.ru)
    	См. также подраздел "общие вопросы", вопрос "Какие ресурсы становятся доступны при регистрации домена в системе e4u.ru?"
    
  • Какой либо пароль скомпрометирован (потерян/забыт/украден). Что можно сделать?
  • 	Основное (всем):
    	Домен: 
    		Вы можете сменить пароль администратора на доступ в систему управления:
    		в системе управления: раздел "пользователи" -> пользователь с ролью "владелец домена" -> изменить настройки -> параметры panel -> пароль.
    	Пользователи: 
    		Вы можете сменить пароли всех пользователей на доступ к ресурсам системы:
    		в системе управления: раздел "пользователи" -> выбираем пользователя -> изменить настройки -> параметры panel -> пароль.
    	Почта:
    		а) Вы можете сменить пароль на почтовые ящики:
    		   в системе управления: 
    			раздел "почта"  -> выбрать почтовый ящик ->  новый пароль.
    		       +раздел "пользователи" -> выбрать пользователя -> изменить настройки -> параметры panel -> пароль.
    		б) Вы можете просмотреть наличие санкционированных пересылок почты:
    		   в системе управления: раздел "почта"  -> выбрать почтовый ящик -> закладка "пересылки"		
    	FTP: 
    		Вы можете сменить пароль на ftp-доступ к сайту:
    		в системе управления: раздел "сайты и домены"-> доступ к веб-хостингу -> имя пользователя, новый пароль.
    	Сайт(CMS):
    		Только средствами CMS (по документации разработчика вашей системы, обратитесь к своему администратору сайта ).
    
    	Желательно (администраторам):
    	БД: 
    		Вы можете сменить пароль на доступ к базе данных:
    		в системе управления: раздел "сайты и домены"-> базы данных -> выбрать базу данных -> выбрать бд-пользователя -> новый пароль.
    	Web-user: 
    		Вы можете сменить пароль на ftp-доступ к персональной папке web-пользователя:
    		в системе управления: раздел "сайты и домены"-> "показать дополнительные операции" -> web-пользователи -> выбрать web-пользователя -> новый пароль.
    	Защищенные каталоги:
    		Вы можете сменить пароль на доступ к защищенным папкам web-сервера:
    		в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > Защищенные каталоги >  Защищенные паролем каталоги -> выбрать пользователя каталога -> новый пароль.
    
    	Параноидально (гуру):
    	Альтернативные имена домена: 
    		Вы можете проверить правильность альтернативных имен вашего домена:
    		в системе управления: раздел "сайты и домены" -> альтернативные имена доменов -> просмотреть список.
    	Резервирование: 
    		Вы можете проверить корректность хранения резервных копий вашего домена:
    		в системе управления: раздел "сайты и домены" -> Менеджер резервного копирования -> просмотреть серверное, личное хранилише и задачи резервного копирования 
    		- НЕ должно быть посторонних, неизвестных Вам задач, мест хранения и копий. 
    	ДНС: 
    		Вы можете проверить правильность указанных ресурсов днс:
    		в системе управления: раздел "сайты и домены" -> настройки ДНС ->
    		-> просмотреть настройки (пример настройки по умолчанию - смотреть ответ на вопрос "как настроена зона днс по умолчанию для домена your-domain.ru?")
    		- НЕ должно быть посторонних, неизвестных Вам днс-записей. 
    	Сертификаты: 
    		Вы можете проверить корректность ваших сертификатов для https:
    		в системе управления: раздел "сайты и домены" -> "защитите Ваши сайты" -> SSL сертификаты
    		-> просмотреть Ваши сертификаты и сверить с оригинальным содержимым.
    	Менеджер журналов и Планировщик: (проверить, что всё настроено как Вы хотите)
    	Веб-приложения и Менеджер файлов (проверить, что весь контент именно Ваш)
    
  • Добрый день! Не нашел в интерфейсе, где указывается почта, на которую дублируются helpdesk заявки с Вашего сайта. Необходимо вместо ящика xx@yyy.ru записать ящик zzz@yyy.ru.
        Добрый день! Где указывается емаil для уведомлений?
  • 	В режиме администратора домена в системе управления: -> Закладка "Учетная запись" -> "Мой профиль" -> Адрес электронной почты
    

    ДНС

  • Какие днс сервера указывать при делегировании домена your-domain.ru на регистраторе доменных имен?
  • 	ns1.e4u.ru.
    	ns2.e4u.ru.
    
  • Как настроена зона днс по умолчанию для домена your-domain.ru?
  • 	SOA запись:
    		порядковый номер в формате YYYYMMDDHH (пример - 2008123014)
    		TTL 		- 1 день
    		Обновление	- 1 час 	 
    		Повтор 		- 1 час 	 
    		Истечение 	- 7 дней 	 
    		Минимум 	- 3 часа
    
    	серверы имен:	
    			your-domain.ru.	NS	ns1.e4u.ru.
    			your-domain.ru.	NS	ns2.e4u.ru.
    	www:
    			your-domain.ru.	A	
    		    www.your-domain.ru.	CNAME	your-domain.ru.
    	ftp:
    		    ftp.your-domain.ru.	CNAME	your-domain.ru.
    	почта:
    			your-domain.ru.	MX (10)	mx.e4u.ru.
    			your-domain.ru.	TXT v=spf1 +a +mx ~all
    		   mail.your-domain.ru.	A	
    		webmail.your-domain.ru.	A	
    	где  - адрес физического сервера, обслуживающего ваш домен.
    
    	---комментарий---
    			по желанию клиента в днс-зоне могут быть и другие записи. например, в MX-записи может быть указан сервер клиента.
    	---комментарий---
    
  • Хотим узнать/изменить MX запись домена yyyy.zz и/или запись в обратной зоне?
        Просим прописать обратную зону днс.
        Нужно прописать revers-зону.
  •    	Прямая зона:	
     		Для домена, зарегистрированного в нашей панели управления, мх запись по умолчанию ссылается на наш сервер, приёмщик почты, из состава системы хостинга.
    		Ресурсы вида mail. webmail.your-domain.ru. ссылаются по умолчанию на наш сервер хостинга. 
    
    		  Для такого домена Вы можете попросить указать в Днс Ваш собственный почтовый сервер. 
    		  Мы пропишем указанный Вами ip-адрес и отключим службу почты на хостинге.
    		  Все ресурсы вида MX и mail. webmail. будут указывать в таком случае на Ваш сервер.
    
     		Если домен на нашем хостинге не зарегистрирован, то мы не можем влиять на записи в прямой ДНС-зоне данного домена.
    		Вы можете отдать домен под наше управление и/или зарегистрировать в нашей системе и тогда данные функции будут нам доступны.
    
       	Обратная зона:	
    		Если внешний(реальный/белый) ip-адрес сервера получен Вами от Энфорта 
    			просим указать имя ресурса (например mail.your-domain.ru) и мы внесем запись в обратную зону.
    			Корректный пример запроса: "Просим Вас прописать в обратной днс-зоне для ip 1.2.3.4 имя ресурса mail.mydomain.ru"
    
    		Если внешний(реальный/белый) ip-адрес сервера получен от сторонних организаций - 
    			Вы должны обратиться в службу поддержки организации, где вы получали внешний ip-адрес.
    

    FTP

  • Как получить доступ к сайту www.your-domain.ru по ftp?
  • 	по умолчанию доступ предоставляется по адресу
    	ftp://ftp.your-domain.ru
    	с логином и паролем, полученным от службы поддержки при регистрации услуги
    
  • В каком режиме (активный/пассивный) разрешен доступ к ftp-серверу?
  • 	Работают и активный и пассивный режим.
    	Включите пассивный режим, если у Вас установлен брандмауэр.
    
  • При соединении с ftp наблюдается: "425 Can't build data connection: Connection refused". Что делать?
        При соединении с ftp наблюдается: "500 Illegal Port command". Что делать?
  • 	В настройках соединения ftp включите пассивный режим.
    
  • Что за папки я вижу и для чего они предназначены?
  • 	bin,dev,etc,lib,lib64,pd,tmp,usr,var		- служебные, системные
    	anon_ftp	- папка для анонимного ftp (не используется)
    	cgi-bin		- папка для скриптов
    	conf		- служебная папка с конфигурацией web-сервера для Вашего домена
    	error_docs	- папка с файлами стандартных ошибок
    	httpdocs	- папка общедоступного содержимого сайта (доступно по http)
    	httpsdocs	- папка общедоступного содержимого сайта (доступно по https)
    	private		- папка для конфиденциальных данных (не доступна web-серверу, доступна только вам)
    	statistics	- папка для хранения статистики и лог файлов (статистика доступна через панель/web)
    	subdomains	- стандартная папка для поддоменов
    	web_users	- стандартная папка для web-пользователей
    	site1/2 и тд 	- пользовательские папки для доменов/поддоменов и тп	- 
    
  • В какие папки я имею доступ?
  • 	cgi-bin		- папка для скриптов
    	error_docs	- папка с файлами стандартных ошибок (при конфигурации с персонализированными сообщениями об ошибках)
    	httpdocs	- папка общедоступного содержимого сайта (доступно по http)
    	httpsdocs	- папка общедоступного содержимого сайта (доступно по https)
    	private		- папка для конфиденциальных данных (не доступна web-серверу, доступна только вам)
    	subdomains	- стандартная папка для поддоменов
    	web_users	- стандартная папка для web-пользователей
    	site1/2 и тд 	- пользовательские папки для доменов/поддоменов и тп	- 
    
  • Необходимо срочно сменить наш логин и пароль доступа к фтп! Сейчас наш логин для доступа к фтп: user00122.
  • 	Вы можете это делать самостоятельно оперативно, в любое удобное для Вас время:
    		в системе управления: раздел "сайты и домены"-> доступ к веб-хостингу -> имя пользователя, новый пароль.
    
    	Также вы можете самостоятельно сменить пароль на доступ в систему управления:
    		в системе управления: раздел "пользователи" -> пользователь с ролью "владелец домена" -> изменить настройки -> параметры panel -> пароль.
    
    	Внимание! Данные пароли будут сменёны на старые, выданные нами ранее пароли, в тех случаях, когда услуга была включена после предыдущего автоматического выключения по задолженности и тп.
    	Чтобы корректно поменять старые пароли доступа администратора и доступа к ftp на новые (и чтобы они восстанавливались после авто-выключений)  - запросите смену паролей через нашу службу поддержки.
    
  • Добрый день! Проблема с доступом к фтп, невозможно соединиться по фтп с: ftp.otherdomain.ru!
        Выдается сообщение, что превышено время ожидания ответа от сервера и(или) не найдена удаленная папка.
  • 	по умолчанию доступ к домену your-domain.e4u.ru предоставляется по адресу
    	ftp://ftp.your-domain.e4u.ru
    	с логином и паролем, полученными от службы поддержки при регистрации услуги	
    
    	проверьте:  
      	        а) наличие сетевого соединения и интернета. 
    		б) что ping ftp.your-domain.e4u.ru и ping www.your-domain.e4u.ru проходят, и что при этих пингах совпадают ip-адреса. 
    		в) правильность настройки ДНС.
    		г) попробуйте сменить пароль на ftp и ввести при подключении новый.
    
  • Не могу отправить файлы объемом X mb по фтп на сервер хостинга.
        Ни по ftp (на четверть заливает, потом говорит "broken pipe"), ни через веб-интерфейс.
        Статистика в панели управления показывает, что занято 40 мб, мой лимит 50 mb. почему же не удается добавить файл размером 8mb?
  • 	У Вас исчерпывается квота (пример: фактически занято 49 из 50мб и Вы пытаетесь вставить 5мб).
    	Вам требуется предварительно освободить место.
    
    	Статистика в панели управления обновляется раз в сутки.
    	Цифры в отчете могут отличаться от реальных обьёмов в данный момент (например, Вы уже за сегодня выгружали какой-либо новый файл на сайт).
    
  • Как проверить, что данные для моего домена загружены по фтп именно туда куда нужно?
  • 	Зайдите на web-сайт браузером (пример http://www.your-domain.ru) - Вы должны увидеть Ваше обновленное содержимое. 
    
    	Для дополнительной проверки - зайдите в панель управления. 
    	Для проверки обновления содержимого воспользуйтесь предварительным просмотром сайта или менеджером файлов в разделе "Сайты и домены" .
    
    	--комментарий--
    	 (При наличии нескольких логинов для ftp-доступа к разным доменам - 
              убедитесь что Вы выгружаете данные именно на тот домен, который вам нужен.
              Ftp-логин для конкретного домена указан в настройках домена - кнопка "Хостинг")
    	--комментарий--
    
  • как подключиться к ftp через PROXY?
        У нас в организации используется proxy-server ZZZZ. не удается зайти по ftp на сайт. не удается обновить файлы. Что делать?
  • 	На нашем хостинге установлен стандартный ftp-сервер. Прокси на сервере не используется.
    	Если у Вас есть ftp-логин/пароль для доступа к Вашему сайту и домен не заблокирован - то доступ Вам предоставляется.
    	Мы никоим образом не препятствуем доступу к включенному сайту и изменению его содержимого.
    	Ваш прокси-сервер должен общаться с нашим ftp-сервером стандартным способом.
    	Если через прокси не работает - попробуйте соединиться без прокси (напрямую)/ попробуйте получить доступ из другой физической сети.
    
    	Рекомендации. Как найти решение вашей проблемы:
    	а) Поэкспериментируйте с активным/пассивным режимом ftp
    	б) проверьте настройки брандмауэра/файервола/защитника на персональном компьютере/ на границе сети.
    	в) Попробуйте разные ftp-клиенты (и напрямую через браузер)
    	г) Проверьте, заходите ли на другие ftp сайты? (например - ftp://anonymous:mail@ftp.chg.ru/ ).
    	д) Воспользуйтесь документацией разработчика proxy (просмотрите инструкции по установке / инструкции по настройке) -
    		   проверьте, всё ли вы сделали по рекомендациям.
    	   Просмотрите faq разработчика вашего прокси; посетите forum разработчика -
    		   возможно, с такой ошибкой сталкивались не только вы и сообществу уже известны способы решения вашей проблемы.
    
  • По ftp разместили на сервере документы для внутреннего использования. Как запретить к ним доступ для посторонних через web?.
  • 	Для этого в защищаемой директории Вы можете создать файл .htaccess с содержимым:
    	    #
    	    Order deny,allow
    	    Deny from all
    	    #
    	Это оставит работоспособным доступ к файлам через ftp, но не позволит посторонним случайно или умышлено увидеть внутренние файлы через ссылку вида http://subdomain.yourdomain.ru/yuordir/privatedoc.zip
    

    Базы данных

  • Каковы ограничения mysql?
  • 	max количество соединений - 150
    
  • Каковы ограничения pgsql?
  • 	max количество соединений - 100
    
  • Что нужно для получения 1 базы данных MySQL?
  • 	Для каждого домена право создать 1-у базу данных предоставляется по умолчанию.
    	Вы можете создать базу данных самостоятельно в панели управления; либо напишите нам, и мы создадим её Вам.
    
  • Как создать базу данных?
  • 	В системе управления: раздел "сайты и домены" -> базы данных -> добавить базу данных  (заполнить имя и тип) -> добавить пользователя (заполнить логин и пароль);
    	После этого в разделе "базы данных" вы сможете увидеть список ваших БД; а при нажатии на БД список пользователей этой БД.
    
    	Примечание: Если кнопка "Создать базу данных" не доступна - то Вы уже заняли выделенный Вам лимит баз данных, при необходимости расширения лимитов обратитесь в службу поддержки.
    
  • По какому адресу, порту можно обращаться к БД из web-приложения?
  • 	Для mysql: сервер 127.0.0.1 (или localhost),  порт(если требуется) 3306
    	Для pgsql: сервер 127.0.0.1 (или localhost),  порт(если требуется) 5432
    
  • Каким образом выполнить первоначальное создание и заполнение таблиц моей базы данных?
  • 	В системе управления: раздел "сайты и домены" -> базы данных  - выбрать базу данных - 'WebAdmin' (Будет запущен phpMyAdmin - стандартый инструмент для работы с БД )
    	Или же с помощью обычных sql-операторов из скриптов Вашего сайта.
    	Или же встроенными средствами Вашей CMS системы.
    
  • Каким образом заполнить базу скриптом sql?
  • 	В системе управления: раздел "сайты и домены" -> базы данных - требуемая база - webadmin - query window (окно запроса) - импорт файлов - вставить данные.
    
  • Каким образом сделать импорт базы из ранее сохранённого дампа базы mysql?
  • 	В системе управления: раздел "сайты и домены" -> базы данных - требуемая база - webadmin - импорт - выбрать требуемый файл дампа -  кнопка "Пошёл".
    
  • Как сделать дамп базы данных?
  • 	В системе управления: раздел "сайты и домены" -> базы данных - требуемая база - dbwebadmin - export - выбрать требуемую базу - кнопка "Пошёл" - сохранить выведенный текст в файл.
    
  • У меня сайт создан на базах данных. Как правильно выложить его на вашем сервере?
        PHP файлы, в которых как раз идет работа с базами, не отображаются в браузере, вернее отображаются как пустые страницы. Что делать? В чем причина?
  • 	а) Проверьте, в системе управления, что база данных заведена. Задайте логин/пароль для доступа к базе данных.
    		Заполните Вашу бд необходимым содержимым.
    	б) Проверьте конфигурационные файлы Вашего сайта.
    		Логины пароли доступа к базам данных должны совпадать с зарегистрированными в панели.
    	в) Если проблема осталась - воспользуйтесь информацией имеющейся в журнальных файлах сервера
    		(по ftp - папка statistics/logs/ или в панели управления - менеджер журналов).
    
  • Здравствуйте! Скажите, пожалуйста, почему я не могу восстановить БД?
        (в строке CREATE DATABASE `test_db`... выдает ошибку:
        Ответ MySQL: #1044 - Access denied for user 'test_user'@'%' to database 'test_db')
  • 	а) Проверьте, что база существует в системе управления 
    		(если БД ещё нет - зарегистрируйте новую БД через панель управления)
    	б) Проверьте, что Вы не пытаетесь создать уже существующую базу
    		(перед восстановлением данных, возможно, требуется закомментировать строку CREATE в дампе базы);
    	в) Проверьте, что Вы используете правильные логин пароль для доступа к БД.
    		(В системе управления в меню для баз данных смотрите наличие БД, пользователя и проверьте правильность используемого пароля)
    

    WEB

  • Какой полный путь до файлов на сервере хостинга?
  • 	Для домена mydomain.com:
    		документы доступные по http:  путь- /var/www/vhosts/mydomain.com/httpdocs
    		документы доступные по https: путь- /var/www/vhosts/mydomain.com/httpsdocs      
    
  • На сайте xyz.ru не показываются рисунки из папки icons. почему?
        На сайте xyz.ru не виден документ, размещенный в папке httpdocs/error. почему?
  • 	Папки /icons и /error зарезервированы web-сервером.
    	Попробуйте переименовать Вашу папку icons (или error),например в myicons (myerror), и в страницах укажите ссылки на myicons (myerror).
    
  • Не загружаются поддомен: XXX.YYY.ru. Основной сайт YYY.ru работает. Что делать?
  • 	Проверьте в панели управления, что поддомен действительно зарегистрирован и днс-записи для поддомена указывают на сервер хостинга.
    	Проверьте наличие поддержки необходимых скриптовых языков в поддомене.
    	Воспользуйтесь предварительным просмотром поддомена. 
    	Проверьте, что содержимое поддомена загружено (по ftp папка subdomains/)
    	Воспользуйтесь информацией имеющейся в журнальных файлах сервера (по ftp - папка statistics/logs/; в панели управления - менеджер журналов)
    

    SSI

  • Как использовать SSI?
  • 	(... #includes virtual ...)
    	а) использовать расширение файлов  .shtml 
    	или
    	б) добавить в .htaccess (чтобы SSI работал внутри .htm)
    	AddOutputFilter INCLUDES .shtml .html .htm 
    

    Web-перенаправления и web-пересылки:

  • Как организовать перенаправление на другой сайт?
  • 	добавить в .htaccess:
    	Redirect / http://newdomain.com/
    
    	--комментарий--
    	способ 2:
    	добавить в .htaccess:
    
    	RewriteEngine on
    	RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.ru$
    	RewriteRule ^(.*)$ http://www.newdomain.com/$1 [L,R=301]
    
    	olddomain.ru - имя вашего домена (перенаправление сработает и при наборе www.olddomain.ru)
    	www.newdomain.ru - адрес, на который Вы желаете перенаправить посетителя. 
    	--комментарий--
    
  • Как организовать перенаправление на стартовую страницу с несуществующих страниц?
  • 	добавить в .htaccess
    	RewriteEngine On
    	RewriteCond %{REQUEST_FILENAME} !-f
    	RewriteCond %{REQUEST_FILENAME} !-d
    	RewriteRule ^(.*) index.php
    

    Php/perl/cgi

  • Как активировать на Вашем сервере пхп?
  • 	По умолчанию, для стандартного домена с услугой хостинга, php уже включён.
    	Проверка: Зайдите в панель управления - "Сайты и домены" - Выбрать Ваш домен в списке внизу - смотреть наличие галочки 'поддержка PHP'. 
    
  • Для нормального функционирования сайта требуется, чтобы скрипты запускались не только из папки cgi, это реализуемо?
  • 	Конечно. Файлы скриптов можно размещать в httpdocs и httpsdocs. Поддерживаются - 
    	.asp	- Apache::ASP
    	.shtml	- SSI
    	.php	- Php  
    	.pl	- Perl 
    	.py	- Python
    	.fcgi	- Fast-Cgi
    	в cgi-bin/ - CGI (perl/python и т.д.)
    
  • В каком режиме работает php? где у вас настройки php?
        Каким образом поменять режим запуска php?
  • 	По умолчанию php работает в режиме mod_php, доступны также режимы php_cgi и fastcgi 
    	См. в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > "настройки сценариев и безопастности для сайта" 
    	    Доступен выбор режима работы РНР: Поддержка  PHP  -> опция "запустить как" [Модуль Apache / приложение FastCGI / CGI ] .
    	    Доступны индивидуальные настройки: на вкладке "Настройки PHP"
    
  • Каковы ограничения на php в режиме mod_php?
  • 	Стандартно:
    	  safe_mode = On            
    	  max_execution_time = 60  
    	  register_globals = Off	  
    	  allow_url_fopen = Off	  
    	  memory_limit = 128M
    
    	Некоторые параметры php могут быть перенастроены индивидуально в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > "настройки сценариев и безопастности" > вкладка "Настройки PHP". 
    
  • Каковы ограничения FastCgi?
  • 	FcgidIdleTimeout 40
    	FcgidProcessLifeTime 30
    	FcgidMaxProcesses 20
    	FcgidConnectTimeout 30
    
  • Как переконфигурировать php?
        Как изменить параметры php в режиме mod_php ?
        Как настроены параметры php в режиме php-cgi?
  •     	Штатный способ -> см. в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > "настройки сценариев и безопастности для сайта" 
    	    Доступен выбор режима работы РНР: Поддержка  PHP  -> опция "запустить как" [Модуль Apache (по умолчанию) / приложение FastCGI / CGI ] .
    	    Доступны индивидуальные настройки PHP: на вкладке "Настройки PHP"
    
    	Другие варианты:
    	 а) через редактирование .htaccess (если php запущен в режиме модуля) с помошью ключевых слов  php_flag (для параметров вида истина/ложь, 0/1 ) и php_value (для всех остальных параметров);
    	    На странице http://docs.php.net/manual/ru/ini.list.php (или http://php.net/manual/en/ini.list.php ) представлен список деректив php.
    	    В файле .htaccess можно использовать все дерективы обозначенные как PHP_INI_PERDIR и большинство директив обозначенных как PHP_INI_ALL
    	    Пример:
    		php_flag register_globals On 
    		php_flag magic_quotes_gpc on
    		php_value error_reporting 'E_ALL & ~E_NOTICE'
    	 б) через указании функции ini_set ( http://php.net/ini_set ) внутри php_скрипта (обычно какого-либо общего конфигурационного из состава CMS);
    	    Пример:
    		ini_set('display_errors', 1);
    
  • Есть ли какие-либо особенности работы php на Вашем хостинге?
  • 	Php на нашем хостинге работает стандартным образом, как на стандартном виртуальном хостинге с использованием Unix-подобных ОС.
    	Имеются некоторые общие особенности взаимодействия php с веб-сервером, связанные с режимами запуска PHP:
    
    	    запуск PHP в режиме mod_php(по умолчанию):
    		быстрее в работе;
    		локальные php параметры(php_value, php_flag), указанные в .htaccess, доступны (но не все параметры php можно перенастроить средствами .htaccess);
    		некоторые параметры php могут быть перенастроены индивидуально (в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > "настройки сценариев и безопастности для сайта" > вкладка "Настройки PHP" );
    		скрипты php работают от имени веб-сервера;
    		если скрипту php требуется запись в какую-либо папку, то права на эту папку должны быть 777;
    		создаваемые скриптами php файлы и папки будут иметь владельцем apache, группой apache;
    		файлы, создаваемые php, обычно не доступны через ftp и через менеджер файлов, а становятся доступны только если на файлы и папки указать права 777.
    
    	    запуск PHP в режиме cgi/FastCGI(при выборе соответсвующей опции):
    		немного медленне в работе, чем mod_php;
    		локальные php параметры(php_value, php_flag), указанные в .htaccess, не доступны;
    		некоторые параметры php могут быть перенастроены индивидуально (в системе управления: раздел "Сайты и домены" > "показать дополнительные операции" > "настройки сценариев и безопастности для сайта" > вкладка "Настройки PHP" );
    		скрипты php работают от имени пользователя;
    		скрипты php имеют полный доступ в папки пользоватяля;
    		создаваемые скриптами php файлы будут иметь владельцем ftp-пользователя клиента, группой psacln;
    		все файлы, создаваемые php, доступны и через ftp и через менеджер файлов.
    
  • С какими модулями собран php на вашем хостинге?
  • 	В стандартном режиме используется php с настройками и модулями представленными на странице:
    	http://hosting.e4u.ru/phpinfo.php
    
  • Как увидеть с какими настройками запускается php на моем сайте?
  • 	В  папке httpdocs создайте файл phpinfo.php с содержимым:
    	     phpinfo(); ?>
    	Зайдите на страницу http://your-domain.ru/phpinfo.php
    
  • Запускаю http://www.llllll.ru/index.php?L=6. При этом L - всегда не определена??? почему?
  • 	В настройка по умолчанию для php хостинга выставлено register_globals = Off.
    	получать значение переменных из строки браузера можно получать таким образом: $L=$_GET['L']; 
            Для получения значений из формы отправленной методом POST - использовать $_POST 
    
    	По этому поводу на сайте пхп имеется документ: http://ru2.php.net/manual/ru/security.globals.php ,
    	где см. важное Замечание:
    		Суперглобальные переменные: замечание о доступности 
    		Начиная с PHP 4.1.0, стали доступными суперглобальные массивы, такие как $_GET, $_POST, $_SERVER и т.д.
    		Дополнительную информацию смотрите в разделе руководства superglobals (http://ru2.php.net/manual/ru/language.variables.predefined.php) 
    
  • Как обработать файл с расширением .phtml с помощью php?
  • 	добавить  в .htaccess:
    	DirectoryIndex index.php index.phtml
    	AddType application/x-httpd-php .php .phtml
    
  • Куда рекомендуется размещать скрипты perl?
  • 	В папку cgi-bin .
    
  • Почему-то не запускается perl-script, лежащий не в пределах cgi-bin?
  • 	По возможности старайтесь размещать скрипты в cgi-bin.
    	Используйте расширение .pl для скриптов на perl, лежащих вне cgi-bin.
    	Проверьте правильность установленных прав на файле, например 755 (-rwxr-xr-x), и владельца файла (user).
    
  • Ошибка открытия файлов в php или perl
        (пример ошибки в файле журнала - failed to open stream: Permission denied in /var/www/vhosts/X/httpdocs/index.php on line 41)?
  • 	При работе в режиме php-mod:
    	  на директории, куда требуется сохранять файлы  - должны быть права 777
    	  на директории, в которой требуется изменять содержимое - должны быть права 777
    	  на файле, который должен изменяться - должны быть права 666 (или 777)
    	См. также ответ "Есть ли какие-либо особенности работы php на Вашем хостинге?"
    	См. также ответ "Как переконфигурировать php?"
    
  • Я создал файл из скрипта при запуске этого скрипта веб-сервером. Созданный файл веб сервером не отображается. В чем причина?
  • 	После создания файла устанавливайте правильного владельца и группу - user.psacln  (user- ваш логин по ftp; psacln - обязательная группа).
    	Если содержимое файла требуется изменять в будущем (через web-сервер) - смотрите ответ "Ошибка открытия файлов в php или perl?"
    	См. также ответ "Есть ли какие-либо особенности работы php на Вашем хостинге?"
    	См. также ответ "Как переконфигурировать php?"
    
  • Хотелось бы видеть на сервере perl-модуль Xxxx:Zzzz (со cpan.org), возможно его установить?
  • 	Свяжитесь со службой поддержки и мы рассмотрим вопрос.
    
  • где у Вас Pear?
  • 	/usr/share/pear/
    
  • Ругается на эту строку: require_once("DB.php"); // подключаем класс DB PEAR .
        какой путь к этому классу у вас на хостинге?
  • 	/usr/share/pear/DB.php 
    
  • Как правильно отправить почтовое сообщение из PHP/perl/командной строки?
        Я отправил письмо из PHP. Сообщение не дошло по назначению. Что делать?
  • 	Короткий пример для PHP:
    	  mail("otheruser@mail.ru",$subject,$message,$headers,"-fyour@yuordomen.ru");
    
    	Подробнее - http://www.php.net/manual/ru/function.mail.php, 
    
    	Рекомендуем указывать корректный адрес возврата в случае недоставки: в примере параметр "-f", ящик- your@yuordomen.ru.
    	Аналогично (и для других скриптов): рекомендуем использовать ключ сендмайла -f при отправке.
        	На адрес your@yuordomen.ru в случае возникновения ошибок доставки будут приходить уведомления c описанием ошибок почтовой системы.
    
        	Примечания:
        	 1. в PHP последний параметр работает только с выключенным safe_mode;
        	 2. антиспамы на публичных серверах (mail.ru, yandex и тп) не принимают писем с темой письма без указания кодировки. 
    	    Расширенный пример отправки письма с указанием кодировок:
    	     
    	       function mail_utf8($to, $subject = '(No subject)', $message = '', $header = '', $other='') {
    		$header_ = 'MIME-Version: 1.0' . "\r\n" . 'Content-type: text/plain; charset=UTF-8' . "\r\n";
    		return mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header, $other );
    	       }
    
    	       if ( mail_utf8('user1@mail.ru','тема сообщения','текст сообщения','FROM: myuser ', '-fmyuser@e4u.ru' ) ) {
    		echo 'ok sending mail';
    	       }else{
    		echo 'not sending mail';
    	       }
    	     ?>
    

    CMS

  • у меня имеется CMS XXX. не устанавливается СМS/не работает функция ZZZ. Что делать?
  • 	Наша система построена на принципах классического UNIX-хостинга.
    	Для Вашей CMS, возможно, требуются какие-то дополнительные (особые) настройки и/или особенное программное обеспечение.
    
    	а) Воспользуйтесь документацией разработчика (просмотрите инструкции по установке / инструкции по настройке) -
    		   проверьте, всё ли вы сделали по рекомендациям (отметьте, что было не так).
    	   Просмотрите faq разработчика; посетите forum разработчика -
    		   возможно с такой ошибкой сталкивались не только Вы и сообществу уже известны способы решения вашей проблемы.
    	б) Проверьте наличие на нашем хостинге требуемых средств (см. вопрос "Какое программное обеспечение поддерживается вашим хостингом?").
    	в) Проверьте правильность данных в конфигурационных файлах Вашей смс - 
    		все ли элементы настройки понятны и настроены так, как рекомендуется разработчиком?
    		правильно ли указаны пути к каталогам? (отметьте нюансы или моменты с возникшими вопросами)
    	г) Воспользуйтесь информацией имеющейся в лог-файлах сервера (по ftp - папка statistics/logs/; в панели управления - менеджер журналов) -
    		возможно ответ уже там. Что-то есть подозрительное? (отметьте у себя в записях)
    	д) Проверьте правильность прав на каталоги/файлы, куда может сохраняться информация, поступающая из вашей cms 
    	  (обычно папки/файлы с именами  files/updates/download/counters и подобные):
    		в случае режима запуска php как модуля- на директории, где требуется сохранять или удалять файлы  - должны быть права 777 (rwxrwxrwx)
    		на файле, который должен изменяться - должны быть права 666 (rw-rw-rw-) (или 777) 
    	е) Посмотрите ответы в данном документе - может ответ уже есть?
    	ж) Напишите нам о возникшей проблеме (отметки о найденных вами нюансах будут очень полезны)
    	   чем больше информации вы укажите, тем быстрее может разрешиться вопрос.
    
  • у моей CMS есть определенные требования для хостинга. Возможно, ли их реализовать на вашем хостинге для полноценной работы CMS?
  • 	Покажите, пожалуйста, какие требования Вам необходимы (документом / ссылкой и т.д). И мы скажем соблюдаются ли они у нас.
    

    Bitrix ( http://dev.1c-bitrix.ru/docs/php.php )

  • Как установить битрикс для двух сайтов на одной базе?
  • 	http://dev.1c-bitrix.ru/community/forums/forum6/topic10882/?phrase_id=1263856&PAGEN_1=2
    
  • на Вашем хостинге при скачивании обновлений в Bitrix выдается сообщение:
        Обнаружены ошибки:
        [ULMU04] Не могу создать временный файл в папке "/var/www/vhosts/QQQQQQ.ru/httpdocs/bitrix/updates".
        [PU302] Загрузка обновлений прервана.
        что делать?
  • 	на папку /var/www/vhosts/QQQQQQ.ru/httpdocs/bitrix/updates 
    	поставьте (с помощью FTP или менеджера файлов панели управления или самого bitrix)  права 777 (всем разрешено всё) (rwxrwxrwx)
    

    IPI.MANAGER ( http://www.ipi.ru/documentation/IPI-MANAGER/ )

  • что-то требуется сделать перед установкой системы IPI.MANAGER? (как соблюсти требования IPI.MANAGER?)
  • 	1. добавить в .htaccess:
    	   DirectoryIndex index.php index.phtml
    	   AddType application/x-httpd-php .php .phtml
    
    	--комментарий--
    	   нужные ключи в php.ini уже настроены по умолчанию:
    		register_globals = Off
    		file_uploads = On
    		session.save_handler = files
    		session.use_cookies = 1
    		session.auto_start = 0
    	--комментарий--
    

    JOOMLA ( http://help.joomla.org/ , joomlaportal.ru , joomla-support.ru )

  • как изменить права на файлы/папки созданные "движком" joomla?
  • 	Возможно вам поможет:
    	http://help.joomla.org/images/User_manual/user_manual_v1%200%201_10%2021%2006.pdf
    	стр. 150 рис. 153 
    
    	в Global Configuration - Закладка Server - раздел Directory Permission ./ File Permission  -
    	выставить chmod 0777 (все галочки выставлены)
    	+ там имеется галочка Apply to existing.. (Применить для существующих ...) 
    
  • Для joomla требуется настройка php - magic_quotes_gpc On. Как сделать?
  • 	Добавьте в .htaccess :
    	    php_flag magic_quotes_gpc on
    
  • Движок joomla жалуется, что Каталог для записи сессий Недоступен для записи - /var/lib/php/session . как решить проблему?
  • 	В CMS Joomla 1.0.15 подобное сообщение вызвано ошибкой кода CMS и носит информационно-уведомительный характер. В старших версиях Joomla проблема решена. 
    	Работа с сессиями происходит в нормальном режиме, хоть с этим сообщением, хоть без него.
    	В работоспособности сессий Вы можете убедиться самостоятельно, воспользовавшись Вашим административным интерфейсом к CMS Joomla. 
    	Если Вы заходите с паролем/логином настроенного Вами администратора - значит сессии работают.
    
    	Если же Вас всё-таки смущает данное сообщение,то Вы можете воспользоваться следующим рецептом с сайтов joomlaportal.ru и joomla-support.ru  :
    	    1. Создаёте в корне сайта (в папке httpdocs) подпапку tmp_ses ;
    	    2. Устанавливаете на папку tmp_ses права 777 ;
    	    3. В корне сайта в файл .htaccess добавляете строку:
    		    php_value session.save_path "/var/www/vhosts/testsoft.ru/httpdocs/tmp_ses"
    		где testsoft.ru меняете на свой домен ;
    	    4. Заходите в CMS Joomla и проверяте отсутсвие уведомительного сообщения.
    

    Webmail (!!! в системе e4u.ru)

  • Как читать/отправлять почту через веб-интерфейс E4U.RU?
  • 	Пример для электронного ящика User@e4u.ru:
    		Адрес сайта:	https://webmail.e4u.ru (или http://webmail.e4u.ru )
    		Логин:		user@e4u.ru            (ящик полностью!!! всё маленькими буквами!!!) 
    		Пароль:		ВаШпАрОлЬ	       (большие и маленькие буквы имеют значение)
    
  • Не могу зайти в webmail (http://webmail.e4u.ru) с логином postmaster? как правильно (для ящика user@mydomain.e4u.ru)?
        У меня имеется ящик UseR@mydomain.e4u.ru. Могу я читать/отправлять почту через веб-интерфейс?
  • 	Пример для электронного ящика UseR@mydomain.e4u.ru:
    	      Используйте адрес сайта:         		https://webmail.mydomain.e4u.ru (из имени ящика убран user@ и добавлен webmail. )
    	      В качестве логина/пароля используйте: 	user@mydomain.e4u.ru            (ящик полностью!!!) и ВашпАроль
    
  • Как очистить содержимое ящика (user@mydomain.e4u.ru) через web-интерфейс?
  • 	а)Используйте адрес сайта               https://webmail.mydomain.e4u.ru 	(из имени ящика убран user@ и добавлен webmail. )
    	б)В качестве логина/пароля используйте: user@mydomain.e4u.ru                    (ящик полностью!!!) и ВашпАроль
    	в)Войдите в папку "входящие" ("Inbox")
    	г)Удалите ненужные письма (В интерфейсе Horde: отметьте галочками и нажмите "удалить" - слева над списком писем; В интерфейсе Atmail: переместите мышкой в корзину)
    	д)Очистите корзину ( В интерфейсе Horde: нажмите "очистить корзину" - справа над списком писем; В интерфейсе Atmail: удалите письма из корзины)
    

    Почта (!!! в системе e4u.ru)

  • Здравствуйте! Подскажите, пожалуйста, как отправить письмо?
  • 	Сначала необходимо зарегистрировать почтовый ящик в системе E4U.RU:
    		или в панели управления Вашего домена в разделе 'почта'
    		или связавшись со службой поддержки.
    	в дальнейшем Вы можете использовать: 
    		или web-интерфейс (смотрите раздел faq - Webmail) 
    		или любую программу работы с электронной почтой (смотрите вопросы по настройке программ)
    
  • Как настроить почтовую программу для ящика UsEr@e4u.ru?
        Какие POP,SMTP серверы, логины использовать?
  • 	в качестве входящего сервера  (Pop3) указать:	mail.e4u.ru    (Не оставлять почту на сервере!!!, во избежание переполнения ящика)
    				 	       Login:	user@e4u.ru    (Ящик полностью!!! Всё маленькими буквами.)
    							вАшпАРоль      (Большие/маленькие буквы имеют значение!)
    
    	в качестве исходящего сервера (SMTP) указать:	mail.e4u.ru    (Как и для POP, обязательно использовать авторизацию!)
    					       Login:   user@e4u.ru    (Ящик полностью!!! Всё маленькими буквами.)
    							вАшпАРоль      (Большие/маленькие буквы имеют значение!)
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Как правильно настроить почтовую программу для электронного ящика для моего домена, который обслуживается в системе E4U.RU? (для доменов вида MYdomain.e4u.ru, MYdomain.com и т.д.)
  • 	пример для ящика UsEr@MYdomain.e4u.ru:
    
    	в качестве входящего сервера  (Pop3) указать:	mail.mydomain.e4u.ru    (к имени домена (то, что в ящике до собачки) добавлено mail. )
    				 	       Login:	user@mydomain.e4u.ru    (Ящик полностью!!! Всё маленькими буквами.)
    							вАшпАРоль		(Большие/маленькие буквы имеют значение!)
    
    	в качестве исходящего сервера (SMTP) указать:	mail.mydomain.e4u.ru    (как и для POP)
    					       Login:   user@mydomain.e4u.ru    (Ящик полностью!!! Всё маленькими буквами.)
    							вАшпАРоль		(Большие/маленькие буквы имеют значение!)
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Общие рекомендации по настройкам почтовых программ?
  • 	Рекомендации:
    	  1. Проверить, что в Вашей почтовой программе ВКЛючена поддержка авторизации (проверка подлинности пользователя) для отправки через SMTP-сервер (как и для POP). 
    		[в настройках учётных записей почты в почтовой программе]
    	  2. Во избежание переполнения ящика НЕ оставлять письма на сервере.
    		[в настройках учётных записей почты в почтовой программе]
    	  3. Рекомендуем создать отдельную папку для писем SPAM и добавить фильтр-правило, по которому все письма содержащие в теме  ***SPAM*** автоматически перемещать в папку SPAM .
    		[в настройках почтовой программы, см. меню -> фильтры, правила и тп]
    
    	--комментарий-
        	    Рекомендуется использовать для smtp 587 порт, для pop 110 порт. StartTLS.
    	--комментарий-
    
    	*** Дополнительная рекомендация *** : если почтовый ящик НЕ в системе E4U.ru, 
    		а в другой системе (например, на mail.ru, yandex.ru, yourprovider.ru, othercorporate.com и тд), 
    		то почтовую программу требуется настраивать по рекомендациям соответствующего провайдера.
    
  • Как настроить почту в программе The Bat?
  • 	Пример для ящика Vasyly@your-domain.e4u.ru:
    
    	в свойствах почтового ящика - транспорт
    
    	pop сервер: mail.your-domain.e4u.ru 		(к имени домена (то, что в ящике до собачки) добавлено mail. )
    	в качестве логина: vasyly@your-domain.e4u.ru 	(Ящик полностью!!! Всё маленькими буквами.)
    	в качестве пароля: вашПА4роль			(Большие/маленькие буквы имеют значение!)
    
    	smtp server: mail.your-domain.e4u.ru
    	использовать аутентификацию SMTP, как на сервер входящей почты 
    
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Как настроить почту в программе Outlook?
  • 	Пример для ящика Vasyly@your-domain.e4u.ru
    
    	Сервис> Учетные записи> Почта> Учётная запись почты в e4u.ru > Свойства> Серверы>
    		 Сервер входящей почты(POP3) >	mail.your-domain.e4u.ru		(к имени домена (то, что в ящике до собачки) добавлено mail. )
    						логин:vasyly@your-domain.e4u.ru	(Ящик полностью!!! Всё маленькими буквами.)
    						парОЛь				(Большие/маленькие буквы имеют значение!)
    
    		 Сервер исходящей почты(SMTP) > mail.your-domain.e4u.ru		(к имени домена (то, что в ящике до собачки) добавлено mail. )
    
    		 Сервер исходящей почты> Параметры -> поле "SMTP-cервер требует авторизации" включить. 
    						логин:vasyly@your-domain.e4u.ru	(логин/пароль как и POP-сервер)
    						парОЛь				(Большие/маленькие буквы имеют значение!)
    
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Мой ящик на Ваших серверах будет работать (принимать/отправлять почту) если я подключусь ноутбуком(мобильным телефоном) к интернету не из Вашей сети?
  • 	Если Вы пользуетесь нашими основными услугами (Интернет,VPN и тд), эти услуги активны, и если Вы настроили программу по нашим рекомендациям, 
    	    то Ваш электронный ящик будет работоспособен и доступен Вам  из любой точки мира, без перенастроек Вашего мобильного устройства и независимо от Вашего текушего провайдера.
    
    	См. ответ на вопрос "Как правильно настроить почтовую программу для ящика в системе E4U.RU?".
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Мой временный провайдер (обычно я пользуюсь услугами у Вас) запретил отправку почты по 25 порту. У Вас есть альтернативные порты для отправки почты через вас?
        Какие порты имеются у Вас для безопасной отправки/приема почты?
  • 	Доступные почтовые сервисы для ящика user@mydomain.e4u.ru ( Login: user@mydomain.e4u.ru, Пароль: вАшпАРоль ):
    
    	    SMTP сервер - mail.mydomain.e4u.ru. Порты:
    		25 Стандартно, TLS или StartTLS
    		587 Стандартно, TLS или StartTLS (рекомендуется)
    		465 SSL
    
    	    POP сервер - mail.mydomain.e4u.ru. Порты:
    		110 Стандартно, TLS или StartTLS (рекомендуется)
    		995 SSL
    
    	    IMAP сервер - mail.mydomain.e4u.ru. Порты:
    		143 Стандартно, TLS или StartTLS (рекомендуется)
    		993 SSL
    
    	    Webmail сервер - 
    		http://webmail.mydomain.e4u.ru
    		https://webmail.mydomain.e4u.ru (рекомендуется)
    
    	    Примечание: В некоторых случаях при работе некоторого ПО с защищёнными соединениями 
    			  а) сертификат отклоняется, так как имя в сертификате не совпадает с именем сервера в настройках => тогда в настройках используйте в качестве SMTP/POP сервера имя сервера из сертификата- hosting.e4u.ru.
    			  б) сертификат отклоняется как самоподписанный => проверьте и добавьте сертификат в локальный список разрешённых
    
  • У вас есть relay? Как мне отправить почту через ваш relay?
        У меня имеется почтовый сервер, используется mdaemon(exchange/exim и тд). Как настроить пересылку через ваш сервер?
        У меня имеется почтовый ящик у стороннего провайдера. Когда я нахожусь в вашей сети SMTP-Сервер другого провайдера не хочет принимать почту. Какой у вас smtp?
  • 	Важно:
    	В обычном случае Вы первоначально должны обратиться к документации и/или администрации сервиса/провайдера, где находится Ваш ящик.
    	1-й пример, если у Вас сторонние(не наши) ящики вида user@mail.ru, user@yandex.ru, user@provider.ru, user@othercorporate.com и тд ,
    	 то почтовую программу требуется настраивать по рекомендациям соответствующего провайдера (обычно помощь по настройке программ есть на сайте сервиса).
    	2-й пример, Если у Вас ящик на Вашем собственном или стороннем почтовом сервере, 
    	 то Вы должны воспользоваться _штатными_ средствами почтового сервера по получению и отправке почты;
    	 наши сервера для этих случаев задействовать не рекомендуется (во избежание сложностей построения Ваших схем работы почты).
    
    	Иногда (подчеркиваем _иногда_, тк такое требуется редко и делать так не рекомендуется) 
    	Вам всё-же может понадобиться доступ к нашему smtp-серверу (даже когда Ваши ящики на сторонних серверах). Тогда:
    
    	Обратитесь в нашу службу поддержки для получения _обычного_ почтового ящика в системе E4U.RU.
    	Для доступа к нашим smtp-серверам и отправки Вашей почты вы сможете использовать логин и пароль выделенного нами ящика.
    
    	Пример для доступа к smtp с помощью ящика Vasyly@e4u.ru:
    		smtp сервер: mail.e4u.ru
    		в качестве логина: vasyly@e4u.ru 	(Ящик полностью!!! Всё маленькими буквами.)
    		в качестве пароля: вашПА4роль		(Большие/маленькие буквы имеют значение!)
    
    	Пример для доступа к smtp с помощью ящика Vasyly@your-Domain.e4u.ru:
    		smtp сервер: mail.your-domain.e4u.ru
    		в качестве логина: vasyly@your-domain.e4u.ru 	(Ящик полностью!!! Всё маленькими буквами.)
    		в качестве пароля: вашПА4роль		(Большие/маленькие буквы имеют значение!)
    
    	Периодически проверяйте ящик, используемый для отправки почты, на наличие служебных сообщений.
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
  • Почтовое имя создано в панели управления, но не включается новый почтовый ящик.
  • 	Возможно вы пытаетесь создать ящик сверх установленного вам лимита (5 ящиков по умолчанию).
    	Сверх выделенного Вам лимита обычный ящик (с хранением писем на сервере) создать не удастся,
    	 но для данного почтового имени остаются доступны пересылки, рассылки и т.д.
    	При необходимости расширения лимитов обратитесь в службу поддержки.
    
  • Невозможно отправить сообщение. Приём сообщений работает. Что делать?
        Невозможно отправить почту. Вероятно наш IP заблокирован. входящая почта работает. как разблокировать?
  • 	Мы не блокируем никакие ip-адреса.
    
    	Требуется правильно настроить почтовую программу.
    	См. ответ на вопрос "Как правильно настроить почтовую программу для ящика в системе E4U.RU?".
    	См. также ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
    	Убедитесь, что в Вашей почтовой программе ВКЛючена поддержка авторизации (проверка подлинности пользователя)
    		для отправки через SMTP-сервер (как и для POP).
    	Например, проверка разрешений в настройках Outlook: 
    		Сервис> Учетные записи> Почта> Учётная запись> Свойства> Серверы> Сервер исходящей почты> Параметры.
    		-> поле "Сервер требует авторизации" включить. 
    		Используйте полное имя почты, например, name@domain.com , а не просто name . ( логин/пароль как и POP-сервер)
    
    	Если ошибки возникают и после корректной настройки почтовой программы - 
    	смотрите ответы на вопрос "Наблюдается одна из перечисленных ниже ошибок. Что делать?".
    
  • Какие ограничения на отправку писем?
  • 	Отправка писем доступна только с авторизацией (логин, пароль), cм. ответ к вопросу "Общие рекомендации по настройкам почтовых программ?"
    
    	Максимальное количество одновременных получателей одного письма - 50;
    	Максимальный размер письма (включая заголовки/служебную информацию) - 50Mb;
    
    	--комментарий--
    		Будьте внимательны при отправке писем с вложениями. Для отправки файла-вложения по электронной почте 
    		происходит автоматическое преобразование файла-вложения из двоичного формата в формат, позволяющий 
    		произвести отправку сообщения по протоколу SMTP. В результате преобразования размер письма может 
    		увеличиться в полтора-два раза, по сравнению с первоначальным размером вложения.
    	--комментарий--
    
    	--комментарий2--
    		имеются дополнительные специфические ограничения для защиты от спамеров, но эти ограничения не влияют на отправку почты от обычных пользователей почты.
    	--комментарий2--
    
  • Какие ограничения на прием?
  • 	Максимальный размер письма (включая заголовки/служебную информацию) - 50Mb;
    	Объем ящика по умолчанию (может быть расширен) - 50Mb;
    
  • Просим увеличить ограничение объема до 100 Мб для ящика ччч@нннн.e4u.ru.
        Возможно увеличить кол-во почтовых ящиков?
  • 	звоните! пишите!
    
  • Как организовать пересылку с ящика (aaa@e4u.ru) на другой (bbb@domain.ru) ?
  • 	В панели управления - закладка "Почта" - выберите нужный ящик, откуда хотите пересылать письма (aaa@e4u.ru).
    	 В разделе "Переадресация" - поставить  галочку и заполнить поле назначения (bbb@domain.ru) - нажать "OK"
    
    	По умолчанию при настроенной пересылке оригинальная почта для aaa@e4u.ru и сохраняется в ящике aaa@e4u.ru и отсылается на bbb@domain.ru. 
    	Во избежание переполнения ящика aaa@e4u.ru почту требуется переодически забирать (например почтовой программой с настройками для aaa@e4u.ru).
    
    	Если же оригиналы писем для aaa@e4u.ru не требуется оставлять на ящике aaa@e4u.ru то:
    	В панели управления - закладка "Почта" - выберите нужный ящик, откуда хотите пересылать письма (aaa@e4u.ru).
    	 В разделе "Общее" - кнопка "Почтовый ящик" - убрать галочку "Почтовый ящик" - нажать "OK"
    
  • Как я узнаю, что мой ящик переполнен? Принимаю ли я почту с этого момента?
        Что сделать, чтобы начать принимать почту после сообщения о превышении лимита?
  • 	Если Вы обратили внимание, что в последнее время Вы не получили ни одного нового письма 
    	и Ваши корреспонденты жалуются, что почта отправленная Вам возвращается с ошибками вида:
    		    : Mail quota exceeded ,
    		или  (expanded from ): system resource problem. Command output: 5.7.1 Message can't be delivered
    		или : Не удалось доставить . Время ожидания истекло ;
    	при этом user@your-domain.e4u.ru - Ваш ящик, 
    	то это обычно значит, что указанный ящик переполнен и новая почта не принимается.
    
    	Если Вы не освободите ящик, то новая почта в ящик доставляться не будет!!! 
    	Пользователям, которые шлют письма на этот email в это время, будут выдаваться сообщения о переполнении ящика и новые письма в таком случае не доставляются.
    
    	Чтобы ящик не переполнялся, необходимо:
    	  а) в почтовой программе в учетных записях почты указать - "НЕ оставлять почту на сервере", 
    	  б) с должной периодичностью получать всю принятую сервером почту в почтовую программу (кнопка "доставить почту")
    
    	Примечание 1: В случае когда пп а) сделали и несколько раз полностью получили почту, а новая почта всё равно отбивается с указанными сообщениями (такое бывает при использовании некоторых версий почтовых программ, которые не могут корректно убрать старую почту с сервера)
    	попробуйте в дополнение к пп а) почистить почту напрямую на сервере вручную - см. ответ "Как  очистить содержимое ящика (user@mydomain.e4u.ru) через web-интерфейс?"
    
    	Примечание 2: Возможны ситуации, что почта на сервер приходит нормально, ящик на сервере не переполнен,
    	но почтовая программа не может сохранить у себя новую почту из-за превышения размеров базы почты в самой программе на Вашем ПК 
    	- в этом случае необходимо почистить локальные папки почты на Вашем ПК, настроить архивацию почты по необходимости, сжать базы почты и тп - для решения этого вопроса обратитесь за помощью к Вашему системному администратору.
    
  • Не могу скачать очень-очень большое письмо с ящика user@mydomain.e4u.ru. Что делать?
  • 	воспользуйтесь веб-интерфейсом чтения почты по адресу https://webmail.mydomain.e4u.ru   (логин - Ваш емайл целиком, например user@e4u.ru , пароль - Ваш пароль к ящику).
    		а)просмотрите почту (папка "Входящие")  
    		б)найдите большое письмо - если требуются какие-либо вложения, то скачайте их на свой компьютер
    		в)удалите ненужные письма (отметьте галочками и нажмите "удалить" - слева над списком писем)
    		г)очистите корзину (нажмите "очистить корзину" - справа над списком писем)
    
  • Подозрение что ко мне не доходит почта от некоторых отправителей. Что делать?
        Не работает почтовый ящик zzzz@qqqqq.e4u.ru!!! не получает письма!
  • 	1. Возможно ваш ящик переполнен 
    		см. вопросы:
    			Как я узнаю, что мой ящик переполнен? Принимаю ли я почту с этого момента? 
    			Что сделать, чтобы начать принимать почту после сообщения о превышении лимита?
    			Не могу скачать очень-очень большое письмо с ящика user@mydomain.e4u.ru. Что делать? (webmail)
            2. Возможно для ящика выставлены слишком жесткие ограничения антиспама 
    		см. вопрос 
    			Как лучше настроить антиспам (в панели управления -> в почтовом ящике -> в настройках антиспам фильтра) ?
    
  • Некоторые приходящие письма дублируются. Что может быть?
  • 	Отправляющая сторона отправляет вам два письма или вы находитесь в 2-х группах получателей письма. Действия:
    		1. убедитесь, что отправляющая сторона действительно отправляет одно письмо
    			(без скрытых копий/без отправки в группы рассылок и тд)
        		2. убедитесь, что программы отправляющего работают корректно
    			(например в связке thebat + kaspersky в давние времена (в старых версиях) в некоторых случаях было иногда такое)
    
  • Наблюдается ошибка (сообщение о проблеме, окно с текстом и тд) при работе с почтовой системой. Что делать?
  • 	Смотрите отдельный документ: 
    	        Часто задаваемые вопросы по ошибкам почты в системе е4u.ru. 
    	Если в указанном документе нет наблюдаемой вами ошибки -
            пишите, звоните в службу поддержки !!! (при обращении будут очень кстати скриншоты и любая дополнительная информация)
    

    Миграции

    Вот как выглядит стандартная миграция в Laravel:

    Пример обычной миграции
    bigIncrements('id');
                $table->timestamps();
                $table->softDeletes();
                $table->string('number');
                $table->date('issued_date')->nullable();
                $table->date('expiry_date')->nullable();
                $table->string('file');
                $table->bigInteger('author_id');
                $table->bigInteger('type_id');
                $table->foreign('author_id')->references('id')->on('users');
                $table->foreign('type_id')->references('id')->on('document_types');
            });
        }
    
        public function down()
        {
            Schema::dropIfExists(static::TABLE);
        }
    }

    Но, тут вы прочитали статью на Хабре про новые типы в Postgres, например, tsrange и захотели добавить в миграцию что-то вроде этого...

    $table->addColumn('tsrange', 'period')->nullable();

    Казалось бы, все просто, но ваш перфекционизм наводит вас на мысль, а почему бы не залезть в сорцы и не пропатчить Laravel, ведь я буду часть использовать это, хочется чтобы можно было использовать это примерно так:

    $table->tsRange('period')->nullable();

    Для тех, кому интересно сколько вендоровских классов нужно пропатчить, чтобы добиться этого, загляните под спойлер:

    Пример как пропатчить Laravel миграции

    Патчим Blueprint

    addColumn('tsrange', $columnName);
    });
    

    Патчим PostgresGrammar

    Далее создаем какой-нить провайдер, типа ExtendDatabaseProvider:

    addColumn('tsrange', $columnName);
            });
    
            PostgresGrammar::macro('typeTsrange', function () {
                return 'tsrange';
            });
        }
    }

    Вроде бы все, запускаем миграцию, все работает..

    И не важно, переопределили ли вы половину компонентов Laravel для работы с БД или воспользовались макросами и миксинами из MacroableTrait, круги ада еще не закончились.

    Круги ада (часть 1)

    И вот вы локально все это крутите, все работает как часы, написали +100500 строк кода, и решили выкатить готовую таску в гитлаб. Мы же идем в ногу со временем и там у нас Докер, CI, тесты и тд...

    И вот мы замечаем, что наши миграции в "не локальном" окружении не работают из-за ошибки:

    Doctrine\DBAL\Driver\PDOException: SQLSTATE[08006] [7]
    FATAL:  sorry, too many clients already

    И вот ты сидишь и думаешь, что ты не так делаешь, начинаешь подпихивать в локальный .env окружения из CI вашего GitLab, переписывать код, вместо макросов переопределять разные классы, распихивать везде и всюду дебаги, все идеально, локально ошибки нет. А в пайплайнах CI не так-то просто дебажить, начинаешь пихать везде и всюду логирование, и это не помогает, ведь ошибка где-то внутри, в vendor. Но ты об этом еще пока не знаешь.

    Затем, спустя целый дня гугления ошибки, решения так и нет, куча бессмысленных советов.

    Начинаешь ощущать потихоньку себя идиотом (простите за мой французский), который не способен ни на что, в прямом смысле этого слова, словно ты школьник, который только-только выпустился из школы, день убит, проблема не решена.

    Важен контекст

    Ошибка sorry, too many clients already может быть совершенно по любой причине.

    Ты возвращаешься к началу, гуглишь то с чего начинал, с внедрения макросами в PostgresGrammar нового типа и вот чудо, ты натыкаешься на похожую проблему, но с первого взгляда она немного другая.... где кто-то, как и ты добавлял новый тип и у него не заводится БД. Но у него ошибка другая:

    Doctrine\DBAL\DBALException: Unknown database type tsrange requested,
    Doctrine\DBAL\Platforms\PostgreSQL100Platform may not support it.

    Отчаявшись, первая мысль, а чем черт не шутит... ты пробуешь чужие решения, даже самые абсурдные и в один прекрасный день все начинает работать. Вы уже догадались в чем дело?

    Барабанная дробь

    Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType().

    You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap().

    If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type.

    Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes().

    If the type name is empty you might have a problem with the cache or forgot some mapping information.

    Иными словами, нужно успеть зарегистрировать тип в Doctrine\Dbal прежде, чем до вашего Database Connection дойдет информация, что вы используете кастомные типы (под кастомными я подразумеваю те, которые есть в Postgres, но отсутствуют в заветном getTypesMap в недрах Doctrine.

    Круги ада (часть 2)

    Вы лезете в исходники, куда-то очень глубоко в vendor в недры doctrine\dbal...

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

    О боже, часть из них приватные!

    Все больше не могу, это единственные мысли и слова, которые выходят из ваших уст..

    Руки опускаются окончательно..

    Спасительный круг

    Не буду ходить вокруг, да около.

    Это, как вы уже поняли, был мой личный опыт, мои руки не опустились, все-таки я победил этот великий и ужасный Doctrine.

    Подумаем о будущем

    А что, если я не первый, что если не мне одному надо это, что если сделать публичный пакет, который бы позволял расширять возможности наших миграций любому, добавлять новые типы, чтобы это было просто, прозрачно, и чтобы не приходилось лезть в исходники Laravel и Doctrine, и чтобы он работал по принципу автоботов.

    Помните, как Оптимус Прайм при помощи трейлера приобретал способности летать, а другие автоботы, были для него своего рода доп. орудиями.

    Представим себе такой DatabaseProvider, который мы внедряем в свой проект вместо стандартного от Laravel, опишем структуру будущих Extension-ов в виде маленьких библиотек с похожей структурой, чтобы они легко коннектились к нашему провайдеру, и забыть, как страшный сон исходники Doctrine.

    Основные компоненты

    Эти объекты нам надо модифицировать, но сделать это в стиле ООП, сбоку, по типу как трейты инъектятся в классы:

    • Blueprint - объект, использующийся в миграциях, по сути билдер

    • Builder - он же фасад Schema

    • PostgresGrammar - объект для компиляции Blueprint-а в SQL-выражения

    • Types - наши типы

    Давайте, придумаем объект, который будет подмешивать объекты расширений во внутренние объекты Laravel таким образом, чтобы и овцы были целы и волки сыты, имею ввиду, чтобы IDE был счастлив, все работало, а наш код был понятным.

    Пример класса, описывающего такое расширение
    each(static function ($extension, $mixin) {
                if (!is_subclass_of($mixin, AbstractComponent::class)) {
                    throw new MixinInvalidException(sprintf(
                        'Mixed class %s is not descendant of %s.',
                        $mixin,
                        AbstractComponent::class
                    ));
                }
                if (!method_exists($extension, 'mixin')) {
                    throw new MacroableMissedException(sprintf('Class %s doesn’t use Macroable Trait.', $extension));
                }
                /** @var Macroable $extension */
                $extension::mixin(new $mixin());
            });
        }
    }

    Теперь, пропатчим соединение базы данных, чтобы оно умело работать с этим объектом и решало все наши проблемы, регистрировало в нужные внутренние компоненты Laravel наши дополнения, в том числе и решало проблему с регистрацией типов в Doctrine.

    Патчим PostgresConnection
    schemaGrammar === null) {
                $this->useDefaultSchemaGrammar();
            }
            return new Builder($this);
        }
    
        public function useDefaultPostProcessor(): void
        {
            parent::useDefaultPostProcessor();
    
            $this->registerExtensions();
        }
    
        protected function getDefaultSchemaGrammar()
        {
            return $this->withTablePrefix(new PostgresGrammar());
        }
    
        private function registerExtensions(): void
        {
            collect(self::$extensions)->each(function ($extension) {
                /** @var AbstractExtension $extension */
                $extension::register();
                foreach ($extension::getTypes() as $type => $typeClass) {
                    $this
                        ->getSchemaBuilder()
                        ->registerCustomDoctrineType($typeClass, $type, $type);
                }
            });
        }
    }

    А также необходимо переопределить провайдер и фабрику для работы с БД:

    Патчим DatabaseProvider
    app->singleton('db.factory', function ($app) {
                return new ConnectionFactory($app);
            });
    
            $this->app->singleton('db', function ($app) {
                return new DatabaseManager($app, $app['db.factory']);
            });
    
            $this->app->bind('db.connection', function ($app) {
                return $app['db']->connection();
            });
        }
    }
    Патчим ConnectionFactory

    Начало работы

    Представим что нам надо добавить поддержку нового типа tsrange в наши миграции. Как будет выглядеть наше расширение в нашем проекте теперь.

    TsRangeExtension.php
     Blueprint::class,
                TsRangeSchemaGrammar::class => PostgresGrammar::class,
                // ... список миксинов может включать в себя почти любой внутренний компонент Laravel
            ];
        }
    
        public static function getName(): string
        {
            return static::NAME;
        }
    
        public static function getTypes(): array
        {
            return [
                static::NAME => TsRangeType::class,
            ];
        }
    }
    TsRangeBlueprint.php
    addColumn(TsRangeType::TYPE_NAME, $column);
            };
        }
    }
    TsRangeSchemaGrammar.php
    TsRangeType.php

    Теперь необходимо зарегистрировать наше расширение TsRangeExtension в нашем провайдере для работы с БД:

    Ââåäåíèå â ïîëíîòåêñòîâûé ïîèñê â PostgreSQL

    Àâòîðñêîå íåôîðìàëüíîå îïèñàíèå ïîëíîòåêñòîâîãî ïîèñêà âñòðîåííîãî â PostgreSQL âåðñèè 8.3+, ïðèìåðû è ðåêîìåíäàöèè ïî íàñòðîéêå. Òàêæå ïðèâåäåí ñïðàâî÷íèê SQL êîìàíä äëÿ óïðàâëåíèÿ ïîëíîòåêñòîâûì ïîèñêîì. Ïîëíîå îïèñàíèå ïîëíîòåêñòîâîãî ïîèñêà äîñòóïíî íà ñàéòå ðàçðàáîò÷èêîâ [FTSBOOK].

    Ñîäåðæàíèå

    • Ââåäåíèå
    • Ïîëíîòåêñòîâûé ïîèñê â PostgreSQL
    • ×òî íàäî çíàòü î ïîëíîòåêñòîâîé êîíôèãóðàöèè
    • ×òî íàäî çíàòü î ñëîâàðÿõ
    • ×òî íóæíî çíàòü îá èíäåêñàõ
    • Ñèíõðîíèçàöèÿ ïîëíîòåêñòîâîãî èíäåêñà
    • Òåñòèðîâàíèå íàñòðîåê
    • Ïðèìåð: Àñòðîíîìè÷åñêèé ïîèñê
    • Ïðèìåð: FTS êîíôèãóðàöèÿ äëÿ www.postgresql.org
    • Ïîääåðæêà psql
    • SQL êîìàíäû
    • Ññûëêè
    • Ïðèëîæåíèå: Ïîèñê ñ î÷åïÿòêàìè
    • Ïðèëîæåíèå: Ñîâåòû ïî ïîâûøåíèþ ïðîèçâîäèòåëüíîñòè
    • Ïðèëîæåíèå: Ñëîâàðü äëÿ öåëûõ ÷èñåë
    • Ïðèëîæåíèå: Î÷åíü ïðîñòîé ïàðñåð

    Ââåäåíèå

    Ïîëíîòåêñòîâûé ïîèñê â áàçàõ äàííûõ ÿâëÿåòñÿ îäíèì èç âîñòðåáîâàííûõ ìåõàíèçìîâ äîñòóïà ê ñîäåðæèìîìó ëþáîé ñîâðåìåííîé èíôîðìàöèîííîé ñèñòåìû, êîòîðûå õðàíÿò ìåòàèíôîðìàöèþ, à çà÷àñòóþ, è ñàìè äîêóìåíòû, â áàçå äàííûõ. Ñîâðåìåííûå âåá-ñàéòû, ïî ñóòè, ÿâëÿþòñÿ èíòåðôåéñîì, ñïîñîáîì îðãàíèçàöèè äîñòóïà ê áàçàì äàííûõ. Ïî ìåðå íàêîïëåíèÿ äîêóìåíòîâ â ñèñòåìå íåìèíóåìî âîçíèêàåò ïðîáëåìà îðãàíèçàöèè ýôôåêòèâíîé íàâèãàöèè ïî ñèñòåìå, ÷òîáû ïîñåòèòåëü ñàéòà ñìîã çà ìèíèìàëüíîå êîëè÷åñòâî êëèêîâ íàéòè íóæíûé äîêóìåíò. Ïîìèìî ñòàíäàðòíîé, çà÷àñòóþ ðó÷íîé, íàâèãàöèè ñ èñïîëüçîâàíèåì ðóáðèêàöèè (òåìàòè÷åñêîé, ïî òèïó ìàòåðèàëîâ, êàòåãîðèè ïîëüçîâàòåëåé è ò.ä.), ïîëíîòåêñòîâûé ïîèñê ÿâëÿåòñÿ îäíèì èç ñàìûõ ýôôåêòèâíûõ ìåòîäîâ íàâèãàöèè, îñîáåííî äëÿ íîâè÷êîâ, íåçíàêîìûõ ñ óñòðîéñòâîì ñàéòà.

    Èç íàøåãî ïîâñåäíåâíîãî îïûòà ìû ïîíèìàåì, ÷òî õîðîøèé ïîèñê - ýòî ïîèñê, êîòîðûé â îòâåò íà íàø çàïðîñ áûñòðî íàéäåò ðåëåâàíòíûå äîêóìåíòû. È òàêèå ìàøèíû, êàçàëîñü áû, ñóùåñòâóþò, íàïðèìåð, øèðîêî èçâåñòíûå ïîèñêîâûå ìàøèíû êàê ãëîáàëüíûå - "Google", òàê è íàøè ðîññèéñêèå - "ßíäåêñ", "Ðàìáëåð". Áîëåå òîãî, ñóùåñòâóåò áîëüøîå êîëè÷åñòâî ïîèñêîâèêîâ, ïëàòíûõ è áåñïëàòíûõ, êîòîðûå ïîçâîëÿþò èíäåêñèðîâàòü âñþ âàøó êîëëåêöèþ äîêóìåíòîâ è îðãàíèçîâàòü âïîëíå êà÷åñòâåííûé ïîèñê. Âëàäåëüöó ñàéòà îñòàåòñÿ òîëüêî "ñêàðìëèâàòü" òàêèì ïîèñêîâèêàì êîíòåíò ïî ìåðå åãî ïîÿâëåíèÿ. Ýòî ìîæíî îðãàíèçîâàòü íåñêîëüêèìè ñïîñîáàìè - äîñòóï ÷åðåç http-ïðîòîêîë, èñïîëüçóÿ URL äîêóìåíòà, êàê ýòî äåëàþò áîëüøèå âíåøíèå ïîèñêîâèêè, èëè îðãàíèçàöèÿ äîñòóïà ê ñîäåðæèìîìó áàçû äàííûõ.  îáîèõ ñëó÷àÿõ ïîëíîòåêñòîâûé èíäåêñ ÿâëÿåòñÿ âíåøíèì ïî îòíîøåíèþ ê áàçå äàííûõ. ×àñòî òàêîé ïîäõîä îïðàâäàí è õîðîøî ðàáîòàåò íà ìíîãèõ ñàéòàõ, íåñìîòðÿ íà íåêîòîðûå íåäîñòàòêè, òàêèå êàê íåïîëíàÿ ñèíõðîíèçàöèÿ ñîäåðæèìîãî ÁÄ, íåòðàíçàêöèîííîñòü, îòñóòñòâèå äîñòóïà ê ìåòàäàííûì è èñïîëüçîâàíèå èõ äëÿ îãðàíè÷åíèÿ îáëàñòè ïîèñêà èëè, íàïðèìåð, îðãàíèçàöèè îïðåäåëåííîé ïîëèòèêè äîñòóïà ê äîêóìåíòàì, è ò.ä.

    Ìû íå áóäåì êàñàòüñÿ òàêèõ ïîèñêîâûõ ìàøèí, à áóäåì ðàññìàòðèâàòü ïîëíîòåêñòîâûé ïîèñê, êîòîðûé ïîëíîñòüþ èíòåãðèðîâàí ñ ÑÓÁÄ. Î÷åâèäíî, ÷òî ïîäîáíûé ïîèñê îáÿçàí ñîîòâåòñòâîâàòü àðõèòåêòóðå ÑÓÁÄ, ÷òî íàëàãàåò îïðåäåëåííûå îãðàíè÷åíèÿ íà àëãîðèòìû è ìåòîäû äîñòóïà ê äàííûì. Íåñìîòðÿ íà òî, ÷òî ïîäîáíûå îãðàíè÷åíèÿ ìîãóò âëèÿòü íà ïðîèçâîäèòåëüíîñòü ïîèñêà, ïîëíûé äîñòóï êî âñåì ìåòàäàííûì áàçû äàííûõ äàåò âîçìîæíîñòü äëÿ ðåàëèçàöèè î÷åíü ñëîæíûõ ïîèñêîâ, ïðîñòî íåâîçìîæíûõ äëÿ âíåøíèõ ïîèñêîâèêîâ. Íàïðèìåð, ïîíÿòèå äîêóìåíòà â ÁÄ îòëè÷àåòñÿ îò îáû÷íîãî âîñïðèÿòèÿ êàê ñòðàíèöà íà ñàéòå, êîòîðóþ ìîæíî ñîõðàíèòü, îòêðûòü, ìîäèôèöèðîâàòü, óäàëèòü. Òî, ÷òî ïîëüçîâàòåëü èëè ïîèñêîâûé ðîáîò âèäèò íà ñàéòå ÿâëÿåòñÿ ðåçóëüòàòîì ëèøü îäíîé êîìáèíàöèåé ìåòàäàííûõ, ïîëíîå ìíîæåñòâî êîòîðûõ ïðàêòè÷åñêè íåäîñòóïíî äëÿ ïîèñêîâûõ ðîáîòîâ. Ñóùåñòâóåò äàæå ïîíÿòèå "ñêðûòîãî âåáà" (Hidden Web), íåäîñòóïíîãî äëÿ ïîèñêîâûõ ìàøèí è êîòîðûé âî ìíîãî ðàç ïðåâûøàåò ðàçìåðû âèäèìîãî âåáà. Îäíèì èç êîìïîíåíòîâ ýòîé "ñêðûòîé" ÷àñòè âåáà ÿâëÿåòñÿ ñîäåðæèìîå áàç äàííûõ.

    ×òî òàêîå äîêóìåíò â áàçå äàííûõ ? Ýòî ìîæåò áûòü ïðîèçâîëüíûé òåêñòîâûé àòðèáóò èëè èõ êîìáèíàöèÿ. Àòðèáóòû ìîãóò õðàíèòüñÿ â ðàçíûõ òàáëèöàõ è òîãäà äîêóìåíò ìîæåò ÿâëÿòüñÿ ðåçóëüòàòîì ñëîæíîé "ñâÿçêè" íåñêîëüêèõ òàáëèö. Áîëåå òîãî, òåêñòîâûå àòðèáóòû ìîãóò áûòü íà ñàìîì äåëå ðåçóëüòàòîì ðàáîòû ïðîãðàìì-êîíâåðòåðîâ, êîòîðûå âûòàñêèâàþò òåêñòîâóþ èíôîðìàöèþ èç áèíàðíûõ ïîëåé (.doc, .pdf, .ps, ...).  áîëüøèíñòâå ñëó÷àåâ, äîêóìåíò ÿâëÿåòñÿ ðåçóëüòàòîì ðàáîòû SQL êîìàíä è âèðòóàëüíûì ïî ñâîåé ïðèðîäå. Î÷åâèäíî, ÷òî åäèíñòâåííîå òðåáîâàíèå äëÿ äîêóìåíòà ÿâëÿåòñÿ íàëè÷èå óíèêàëüíîãî êëþ÷à, ïî êîòîðîìó åãî ìîæíî èäåíòèôèöèðîâàòü. Äëÿ âíåøíåãî ïîèñêîâèêà òàêîé äîêóìåíò ÿâëÿåòñÿ ïðîñòî íàáîðîì ñëîâ ("bag of words"), áåç íèêàêîãî ïîíèìàíèÿ ñòðóêòóðû, ò.å. èç êàêèõ àòðèáóòîâ ýòîò äîêóìåíò áûë ñîñòàâëåí, êàêîâà âàæíîñòü òîãî èëè èíîãî äîêóìåíòà. Âîò ïðèìåð äîêóìåíòà, ñîñòàâëåííîãî èç íåñêîëüêèõ òåêñòîâûõ àòðèáóòîâ.

    SELECT m.title ||' '|| m.author ||' '||  m.abstract ||' '|| d.body as document 
    FROM messages m, docs d 
    WHERE m.id = d.id and m.id = 12;
    

    Èíòóèòèâíî ÿñíî, ÷òî íå âñå ÷àñòè äîêóìåíòà îäèíàêîâî âàæíû. Òàê, íàïðèìåð, çàãîëîâîê èëè àáñòðàêò îáëàäàþò áîëüøåé èíôîðìàòèâíîé ïëîòíîñòüþ, ÷åì îñòàëüíàÿ ÷àñòü äîêóìåíòà.

    Çàïðîñ èìååò ÷èñòî èëëþñòðàòèâíûé õàðàêòåð, òàê êàê íà ñàìîì äåëå, çäåñü íàäî áûëî áû èñïîëüçîâàòü ôóíêöèþ coalesce(), ÷òîáû çàùèòèòüñÿ îò ñèòóàöèè, êîãäà îäèí èç àòðèáóòîâ èìååò çíà÷åíèå NULL.

    Êàê è îáû÷íûé äîêóìåíò îí ñîñòîèò èç ñëîâ, ïî êîòîðûì åãî ìîæíî íàéòè. Äëÿ ýòîãî äîêóìåíò íàäî óìåòü ðàçáèâàòü íà ýòè ñëîâà, ÷òî òàêæå ìîæåò áûòü íå ïðîñòîé çàäà÷åé, òàê êàê äëÿ ðàçíûõ çàäà÷ ïîíÿòèå ñëîâà ìîæåò áûòü ðàçíûì. Ìû èñïîëüçóåì òåðìèí "òîêåí" äëÿ îáîçíà÷åíèÿ "ñëîâ", êîòîðûå ïîëó÷àþòñÿ ïîñëå ðàáîòû ïàðñåðà, è òåðìèí "ëåêñåìà" äëÿ îáîçíà÷åíèÿ òîãî, ÷òî áóäåò èíäåêñèðîâàíî. Èòàê, ïàðñåð ðàçáèâàåò äîêóìåíò íà òîêåíû, ÷àñòü èç êîòîðûõ èíäåêñèðóåòñÿ. Êàêèì îáðàçîì òîêåí ñòàíîâèòñÿ ëåêñåìîé - ýòî îïðåäåëÿåòñÿ êîíêðåòíîé çàäà÷åé, íàïðèìåð, äëÿ ïîèñêà ïî öâåòàì òðåáóåòñÿ èíäåêñèðîâàòü íå òîëüêî îáû÷íûå ñëîâà, îáîçíà÷àþùèå öâåòà êðàñîê, íî è èõ ðàçëè÷íûå ýêâèâàëåíòû, èñïîëüçóþùèåñÿ â âåá-òåõíîëîãèÿõ, íàïðèìåð, èõ øåñòíàäöàòåðè÷íûå îáîçíà÷åíèÿ.

    Ïîëíîòåêñòîâûé ïîèñê â PostgreSQL

    Êàê è ìíîãèå ñîâðåìåííûå ÑÓÁÄ, PostgreSQL [PGSQL] èìååò âñòðîåííûé ìåõàíèçì ïîëíîòåêñòîâîãî ïîèñêà. Îòìåòèì, ÷òî îïåðàòîðû ïîèñêà ïî òåêñòîâûì äàííûõ ñóùåñòâîâàëè î÷åíü äàâíî, ýòî îïåðàòîðû LIKE, ILIKE, ~, ~*. Îäíàêî, îíè íå ãîäèëèñü äëÿ ýôôåêòèâíîãî ïîëíîòåêñòîâîãî ïîèñêà, òàê êàê

    • ó íèõ íå áûëî ëèíãâèñòè÷åñêîé ïîääåðæêè, íàïðèìåð, ïðè ïîèñêå ñëîâà satisfies áóäóò íå íàéäåíû äîêóìåíòû ñî ñëîâîì satisfy è íèêàêèìè ðåãóëÿðíûìè âûðàæåíèÿìè ýòîìó íå ïîìî÷ü.  ïðèíöèïå, èñïîëüçóÿ OR è âñå ôîðìû ñëîâà, ìîæíî íàéòè âñå íåîáõîäèìûå äîêóìåíòû, íî ýòî î÷åíü íåýôôåêòèâíî, òàê êàê â íåêîòîðûõ ÿçûêàõ ìîãóò áûòü ñëîâà ñî ìíîãèìè òûñÿ÷àìè ôîðì!
    • îíè íå ïðåäîñòàâëÿþò íèêàêîé èíôîðìàöèè äëÿ ðàíæèðîâàíèÿ (ñîðòèðîâêè) äîêóìåíòîâ, ÷òî äåëàåò òàêîé ïîèñê ïðàêòè÷åñêè áåñïîëåçíûì, åñëè òîëüêî íå ñóùåñòâóåò äðóãîé ñîðòèðîâêè èëè â ñëó÷àå ìàëîãî êîëè÷åñòâà íàéäåííûõ äîêóìåíòîâ.
    • îíè, â öåëîì, î÷åíü ìåäëåííûå èç-çà òîãî, ÷òî îíè êàæäûé ðàç ïðîñìàòðèâàþò âåñü äîêóìåíò è íå èìåþò èíäåêñíîé ïîääåðæêè.

    Äëÿ óëó÷øåíèÿ ñèòóàöèè àâòîðû ýòîé ñòàòüè ïðåäëîæèëè è ðåàëèçîâàëè íîâûé ïîëíîòåêñòîâûé ïîèñê, ñóùåñòâîâàâøèé êàê ìîäóëü ðàñøèðåíèÿ è èíòåãðèðîâàííûé â PostgreSQL, íà÷èíàÿ ñ âåðñèè 8.3.

    Èäåÿ íîâîãî ïîèñêà ñîñòîÿëà â òîì, ÷òîáû çàòðàòèòü âðåìÿ íà îáðàáîòêó äîêóìåíòà îäèí ðàç è ñîõðàíèòü âðåìÿ ïðè ïîèñêå, èñïîëüçîâàòü ñïåöèàëüíûå ïðîãðàììû-ñëîâàðè äëÿ íîðìàëèçàöèè ñëîâ, ÷òîáû íå çàáîòèòüñÿ, íàïðèìåð, î ôîðìàõ ñëîâ, ó÷èòûâàòü èíôîðìàöèþ î âàæíîñòè ðàçëè÷íûõ àòðèáóòîâ äîêóìåíòà è ïîëîæåíèÿ ñëîâà èç çàïðîñà â äîêóìåíòå äëÿ ðàíæèðîâàíèÿ íàéäåííûõ äîêóìåíòîâ. Äëÿ ýòîãî, òðåáîâàëîñü ñîçäàòü íîâûå òèïû äàííûõ, ñîîòâåòñòâóþùèå äîêóìåíòó è çàïðîñó, è ïîëíîòåêñòîâûé îïåðàòîð äëÿ ñðàâíåíèÿ äîêóìåíòà è çàïðîñà, êîòîðûé âîçâðàùàåò TRUE, åñëè çàïðîñ óäîâëåòâîðÿåò çàïðîñó, è â ïðîòèâíîì ñëó÷àå - FALSE.

    PostgreSQL ïðåäîñòàâëÿåò âîçìîæíîñòü êàê äëÿ ñîçäàíèÿ íîâûõ òèïîâ äàííûõ, îïåðàòîðîâ, òàê è ñîçäàíèÿ èíäåêñíîé ïîääåðæêè äëÿ äîñòóïà ê íèì, ïðè÷åì ñ ïîääåðæêîé êîíêóðåíòíîñòè è âîññòàíîâëåíèÿ ïîñëå ñáîåâ ! Îäíàêî, íàäî ïîíèìàòü, ÷òî èíäåêñû íóæíû òîëüêî óñêîðåíèÿ ïîèñêà, ñàì ïîèñê îáÿçàí ðàáîòàòü è áåç íèõ.

    Òàêèì îáðàçîì, áûëè ñîçäàíû íîâûå òèïû äàííûõ - tsvector, êîòîðûé ÿâëÿåòñÿ õðàíèëèùåì äëÿ ëåêñåì èç äîêóìåíòà, îïòèìèçèðîâàííîãî äëÿ ïîèñêà, è tsquery - äëÿ çàïðîñà ñ ïîääåðæêîé ëîãè÷åñêèõ îïåðàöèé, ïîëíîòåêñòîâûé îïåðàòîð "äâå ñîáàêè" @@ è èíäåêñíàÿ ïîääåðæêà äëÿ íåãî ñ èñïîëüçîâàíèåì [GiST] è [GIN]. tsvector ïîìèìî ñàìèõ ëåêñåì ìîæåò õðàíèòü èíôîðìàöèþ î ïîëîæåíèè ëåêñåìû â äîêóìåíòå è åå âåñå (âàæíîñòè), êîòîðàÿ ïîòîì ìîæåò èñïîëüçîâàòüñÿ äëÿ âû÷èñëåíèÿ ðàíæèðóþùåé èíôîðìàöèè.

    =# select 'cat & rat':: tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector;
     ?column?
     ----------
      t
    =# select 'fat & cow':: tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector;
       ?column?
     ----------
      f
    

    Êðîìå ýòîãî, áûëè ðåàëèçîâàíû âñïîìîãàòåëüíûå ôóíêöèè

    • to_tsvector äëÿ ïðåîáðàçîâàíèÿ äîêóìåíòà â tsvector
      =# select to_tsvector('a fat  cat sat on a mat - it ate a fat rats');
                           to_tsvector
      -----------------------------------------------------
      'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4
      
    • to_tsquery - äëÿ ïîëó÷åíèÿ tsquery
      =# select to_tsquery('fat & cats');
        to_tsquery   
      ---------------
         'fat' & 'cat'
      

    Äëÿ ðàçáèåíèÿ äîêóìåíòà íà òîêåíû èñïîëüçóåòñÿ ïàðñåð, êîòîðûé âûäàåò òîêåí è åãî òèï, ñì. ïðèìåð íèæå.

    =# select "Alias","Token","Description" from ts_debug('12 cats');
     Alias | Token |   Description    
    -------+-------+------------------
     uint  | 12    | Unsigned integer
     blank |       | Space symbols
     lword | cats  | Latin word
    

    Êàæäîìó òèïó òîêåíà ñòàâèòñÿ â ñîîòâåòñòâèå íàáîð ñëîâàðåé, êîòîðûå áóäóò ñòàðàòüñÿ ðàñïîçíàòü è "íîðìàëèçîâàòü" åãî. Ïîðÿäîê ñëîâàðåé ôèêñèðîâàí è âàæåí, òàê êàê èìåííî â ýòîì ïîðÿäêå òîêåí áóäåò ïîïàäàòü íà âõîä ñëîâàðþ, äî òåõ ïîð, ïîêà îí íå îïîçíàåòñÿ îäíèì èç íèõ. Åñëè òîêåí íå ðàñïîçíàëñÿ íè îäíèì èç ñëîâàðåé, èëè ñëîâàðü îïîçíàë åãî êàê ñòîï-ñëîâî, òî ýòîò òîêåí íå èíäåêñèðóåòñÿ. Òàêèì îáðàçîì, ìîæíî ñêàçàòü, ÷òî äëÿ êàæäîãî òèïà òîêåíà ñóùåñòâóåò ïðàâèëî îáðàáîòêè òîêåíà, êîòîðîå îïèñûâàåò ñõåìó ïîïàäàíèÿ òîêåíà â ïîëíîòåêñòîâûé èíäåêñ.

    =# select "Alias","Token","Dicts list","Lexized token" from ts_debug('as 12
     cats');
     Alias | Token |      Dicts list      |       Lexized token       
    -------+-------+----------------------+---------------------------
     lword | as    | {pg_catalog.en_stem} | pg_catalog.en_stem: {}
     blank |       |                      | 
     uint  | 12    | {pg_catalog.simple}  | pg_catalog.simple: {12}
     blank |       |                      | 
     lword | cats  | {pg_catalog.en_stem} | pg_catalog.en_stem: {cat}
    

    Íà ýòîì ïðèìåðå ìû âèäèì, ÷òî òîêåí 'as' îáðàáîòàëñÿ ñëîâàðåì pg_catalog.en_stem, ðàñïîçíàëñÿ êàê ñòîï-ñëîâî è íå ïîïàë â ïîëíîòåêñòîâûé èíäåêñ, â òî âðåìÿ êàê òîêåíû '12' è 'cats' ðàñïîçíàëèñü ñëîâàðÿìè, íîðìàëèçîâàëèñü è ïîïàëè â èíäåêñ.

    Êàæäûé ñëîâàðü ïî-ñâîåìó ïîíèìàåò, ÷òî òàêîå "íîðìàëèçàöèÿ", îäíàêî, èíòóèòèâíî ïîíÿòíî, ÷òî â ðåçóëüòàòå íîðìàëèçàöèè, ãðóïïû ñëîâ, îáúåäèíåííûå ïî òîìó èëè èíîìó ïðèçíàêó, ïðèâîäÿòñÿ ê îäíîìó ñëîâó. Ýòî ïîçâîëÿåò ïðè ïîèñêå ýòîãî "íîðìàëèçîâàííîãî" ñëîâà íàéòè âñå äîêóìåíòû, ñîäåðæàùèå ñëîâà èç ýòîé ãðóïïû. Íàèáîëåå ïðèâû÷íàÿ íîðìàëèçàöèÿ äëÿ íàñ - ýòî ïðèâåäåíèå ñóùåñòâèòåëüíîãî ê åäèíñòâåííîìó ÷èñëó è èìåíèòåëüíîìó ïàäåæó, íàïðèìåð, ñëîâî 'ñòîë' ÿâëÿåòñÿ íîðìàëüíîé ôîðìîé ñëîâ 'ñòîëû', 'ñòîëîâ', 'ñòîëàìè', 'ñòîëó' è ò.ä. Íå ìåíåå åñòåñòâåííûì ïðåäñòàâëÿåòñÿ ïðèâåäåíèå èìåí äèðåêòîðèé '/usr/local/bin', '/usr/local/share/../bin', '/usr/local/./bin/' ê ê ñòàíäàðòíîìó âèäó '/usr/local/bin'.

    Êîìáèíàöèÿ ïàðñåðà è ïðàâèë îáðàáîòêè òîêåíîâ îïðåäåëÿåò ïîëíîòåêñòîâóþ êîíôèãóðàöèþ, êîòîðûõ ìîæåò áûòü ïðîèçâîëüíîå êîëè÷åñòâî. Áîëüøîå êîëè÷åñòâî êîíôèãóðàöèé äëÿ 10 åâðîïåéñêèõ ÿçûêîâ è ðàçíûõ ëîêàëåé óæå âñòðîåíî â PostgreSQL è õðàíèòñÿ â ñèñòåìíîì êàòàëîãå, â ñõåìå pg_catalog. Ïðàêòè÷åñêè âñå ôóíêöèè ïîèñêà çàâèñÿò îò ïîëíîòåêñòîâîé êîíôèãóðàöèè, êîòîðàÿ ÿâëÿåòñÿ íåîáÿçàòåëüíûì ïàðàìåòðîì. Íåîáÿçàòåëüíîñòü îïðåäåëÿåò íåîáõîäèìîñòü íàëè÷èÿ ñïîñîáà âûáîðà êîíôèãóðàöèè ïî óìîë÷àíèþ. Ýòèì ñïîñîáîì ÿâëÿåòñÿ ñîîòâåòñòâèå íàçâàíèÿ ñåðâåðíîé ëîêàëè, êîòîðóþ ìîæíî ïîñìîòðåòü ñ ïîìîùüþ êîìàíä show lc_ctype; è show lc_collate; è ëîêàëè, ïðèïèñàííîé ê ïîëíîòåêñòîâîé êîíôèãóðàöèè.

    Ñàìè ïàðñåðû è ñëîâàðè òàêæå õðàíÿòñÿ â ñèñòåìå, èõ ìîæíî äîáàâëÿòü, èçìåíÿòü è óäàëÿòü ñ ïîìîùüþ SQL êîìàíä.

    Íåñìîòðÿ íà áîãàòûå âîçìîæíîñòè ïî íàñòðàèâàíèþ ïîëíîòåêñòîâîãî ïîèñêà ïðàêòè÷åñêè ïîä ëþáóþ çàäà÷ó, âîçìîæíîñòè, ïðåäîñòàâëåííûå ïî óìîë÷àíèþ, âïîëíå äîñòàòî÷íû äëÿ îðãàíèçàöèè ïîëíîöåííîãî ïîèñêà äëÿ øèðîêîãî êëàññà çàäà÷. Áîëåå òîãî, äëÿ î÷åíü ïðîñòîãî ïîèñêà, êîãäà íå òðåáóåòñÿ ðàíæèðîâàíèÿ äîêóìåíòîâ, íàïðèìåð, ïîèñê ïî çàãîëîâêàì íîâîñòåé, êîãäà åñòü åñòåñòâåííûé ñïîñîá ñîðòèðîâêè äîêóìåíòîâ ïî âðåìåíè, ìîæíî îðãàíèçîâàòü ñ ïîìîùüþ âñåãî îäíîé êîìàíäû. Äëÿ ïðèìåðà ìû áóäåì èñïîëüçîâàòü òàáëèöó apod, êîòîðàÿ ñîäåðæèò àðõèâ èçâåñòíîé Àñòðîíîìè÷åñêîé Êàðòèíêè Äíÿ [APOD].

    =# \d apod
           Table "public.apod"
      Column  |   Type   | Modifiers 
    ----------+----------+-----------
     id       | integer  | not null
     title    | text     | 
     body     | text     | 
     sdate    | date     | 
     keywords | text     | 
    Indexes:
        "apod_pkey" PRIMARY KEY, btree (id)
    

     ýòîé òàáëèöå sdate - ýòî äàòà äîêóìåíòà, à àòðèáóò keywords - ñòðîêà ñ êëþ÷åâûìè ñëîâàìè ÷åðåç çàïÿòóþ, êîòîðûå âðó÷íóþ ðåäàêòîð ïåðåâîäà ïðèñâîèë äîêóìåíòó. Ñîçäàäèì èíäåêñ ïî çàãîëîâêàì:

    CREATE INDEX tit_idx ON apod USING gin(title);
    

    Ïîñëå ýòîãî óæå ìîæíî èñêàòü

    SELECT title FROM apod WHERE title @@ 'supernovae stars' ORDER by  sdate limit 10;
    

    ×òîáû ïîíÿòü, ÷òî íà ñàìîì äåëå ïðîèñõîäèò ïðè ñîçäàíèè èíäåêñà, îïèøåì âñå øàãè.

    1. Îïðåäåëÿåòñÿ àêòèâíàÿ ïîëíîòåêñòîâàÿ êîíôèãóðàöèÿ ïî ñåðâåðíîé ëîêàëè. Íàçâàíèå êîíôèãóðàöèè ìîæíî ïîñìîòðåòü ñ ïîìîùüþ show tsearch_conf_name;
    2. Àòðèáóò title ïðåâðàùàåòñÿ â tsvector, ïî êîòîðîìó ñòðîèòñÿ îáðàòíûé èíäåêñ. Ïðè ýòîì èñïîëüçóåòñÿ èíôîðìàöèÿ î ïàðñåðàõ è ñëîâàðÿõ, êîòîðàÿ îïðåäåëÿåòñÿ ïîëíîòåêñòîâîé êîíôèãóðàöèåé ñ èìåíåì tsearch_conf_name. Çàìåòèì, ÷òî òàê êàê tsvector íå ìàòåðèàëèçîâàí êàê îòäåëüíûé àòðèáóò, à èñïîëüçóåòñÿ âèðòóàëüíî, òî íèêàêîé èíôîðìàöèè î ðàíæèðîâàíèè íåäîñòóïíî.  ñèëó òåêóùåãî îãðàíè÷åíèÿ PostgreSQL, â èíäåêñå íåëüçÿ õðàíèòü íèêàêóþ äîïîëíèòåëüíóþ èíôîðìàöèþ.

    Ïîëíîôóíêöèîíàëüíûé ïîèñê òðåáóåò ñîçäàíèÿ íîâîãî àòðèáóòà äëÿ õðàíåíèÿ tsvector, êîòîðûé îïòèìèçèðîâàí äëÿ ïîèñêà è õðàíèò ïîçèöèîííóþ èíôîðìàöèþ ëåêñåìû â äîêóìåíòå è åå âåñ. Ýòî ìîæíî ñäåëàòü ñòàíäàðòíûìè êîìàíäàìè SQL

    =# UPDATE apod SET fts=
    setweight( coalesce( to_tsvector(keywords),''),'A') || ' ' || 
    setweight( coalesce( to_tsvector(title),''),'B') || ' ' ||
    setweight( coalesce( to_tsvector(body),''),'D');
    

     ýòîì ïðèìåðå ìû äîáàâèëè àòðèáóò fts, êîòîðûé ïðåäñòàâëÿåò ñîáîé êîíêàòåíàöèþ òåêñòîâûõ ïîëåé keywords, title è body. Ïðè ýòîì, ñ ïîìîùüþ ôóíêöèè setweight ìû ïðèïèñàëè ðàçíûå âåñà ëåêñåìàì èç ðàçíûõ ÷àñòåé. Çàìåòèì, ÷òî ìû ïðèïèñàëè òîëüêî "ìåòêè", íå ÷èñëåííûå çíà÷åíèÿ, êîòîðûå áóäóò ïðèïèñàíû ýòèì ñàìûì ìåòêàì â ìîìåíò ïîèñêà. Ýòî ïîçâîëÿåò íàñòðàèâàòü ïîèñê áóêâàëüíî íàëåòó, íàïðèìåð, èñïîëüçóÿ îäèí è òîò æå ïîëíîòåêñòîâûé èíäåêñ ìîæíî îðãàíèçîâûâàòü ïîèñê òîëüêî ïî çàãîëîâêàì è êëþ÷åâûì ñëîâàì.

    =# select * from apod where fts @@ to_tsquery('supernovae:ab');
    

    Íà ýòîì ìû çàêîí÷èì ââåäåíèå â ïîëíîòåêñòîâûé ïîèñê â PostgreSQL è ïðèâåäåì ñïèñîê îñíîâíûõ âîçìîæíîñòåé.

    • Ïîëíàÿ èíòåãðàöèÿ ñ áàçîé äàííûõ, ÷òî äàåò äîñòóï êî âñåì ìåòàäàííûì è ïîëíóþ ñèíõðîíèçàöèþ ïîëíîòåêñòîâîãî èíäåêñà ñ èçìåíÿþùèìñÿ êîíòåíòîì.
    • Ãèáêàÿ íàñòðîéêà âñåõ êîìïîíåíòîâ ïîèñêà ñ ïîìîùüþ SQL êîìàíä. Âñòðîåííàÿ ïîääåðæêà äëÿ 10 åâðîïåéñêèõ ÿçûêîâ.
    • Ïîäêëþ÷åíèå ðàçíûõ ïàðñåðîâ, êîòîðûå ìîæíî ïèñàòü ñ èñïîëüçîâàíèåì API. Âñòðîåííûé ïàðñåð ïîääåðæèâàåò 23 òèïà òîêåíîâ.
    • Áîãàòàÿ ïîääåðæêà ëèíãâèñòèêè, âêëþ÷àÿ ïîäêëþ÷àåìûå ñëîâàðè ñ ïîääåðæêîé ñòîï-ñëîâ. Âñòðîåííûå ñëîâàðè-øàáëîíû äëÿ ðàñïðîñòðàíåííûõ îòêðûòûõ ñëîâàðåé ispell, snowball ïîçâîëÿþò èñïîëüçîâàòü áîëüøîå êîëè÷åñòâî ñëîâàðåé äëÿ ðàçíûõ ÿçûêîâ. Òàêæå, åñòü âñòðîåííûå ñëîâàðè-øàáëîíû thesaurus, synonym. Îòêðûòûé API ïîçâîëÿþò ðàçðàáàòûâàòü íîâûå ñëîâàðè äëÿ ðåøåíèÿ ñïåöèôè÷íûõ çàäà÷.
    • Ïîëíàÿ ïîääåðæêà ìíîãîáàéòíûõ êîäèðîâîê, â ÷àñòíîñòè, UTF-8.
    • âîçìîæíîñòüþ ïðèïèñûâàíèÿ âåñîâ ðàçíûì ëåêñåìàì ïîçâîëÿþò ñîðòèðîâêó ðåçóëüòàòîâ ïîèñêà.
    • Ïîääåðæêà èíäåêñîâ äëÿ óñêîðåíèÿ ïîèñêîâ, ïðè ýòîì èíäåêñû ïîääåðæèâàþò êîíêóðåíòíîñòü è âîçìîæíîñòü âîññòàíîâëåíèÿ ïîñëå ñáîåâ (concurrency and recovery), ÷òî î÷åíü âàæíî äëÿ óñïåøíîé ðàáîòû â êîíêóðåíòíûõ óñëîâèÿõ. Ïîääåðæèâàþòñÿ äâà òèïà èíäåêñîâ - GiST èíäåêñû î÷åíü õîðîøè äëÿ ÷àñòûõ îáíîâëåíèé, â òî âðåìÿ êàê GIN èíäåêñ î÷åíü õîðîøî øêàëèðóåì ñ ðîñòîì êîëëåêöèè. Ýòî ïîçâîëÿåò ðåàëèçîâûâàòü ïîëíîòåêñòîâûé ïîèñê ïî î÷åíü áîëüøèì êîëëåêöèÿì äîêóìåíòîâ, êîòîðûå ìîãóò íåïðåðûâíî îáíîâëÿòüñÿ.
    • Áîãàòûé ÿçûê çàïðîñîâ ñ ïîääåðæêîé íàñòðàèâàåìûõ ïðàâèë èçìåíåíèÿ çàïðîñà íàëåòó áåç òðåáîâàíèÿ ïåðåèíäåêñàöèè.

    Åùå ðàç íàïîìíèì, ÷òî ïîëíîå è èñ÷åðïûâàþùåå îïèñàíèå ïîëíîòåêñòîâîãî ïîèñêà â PostgreSQL ïðèâåäåíî â [FTSBOOK] (òåõíè÷åñêèé àíãëèéñêèé), ñîâåòû è ðåêîìåíäàöèè ìîæíî ïîñìîòðåòü â ïðåçåíòàöèè [RIT2007].

    ×òî íàäî çíàòü î ïîëíîòåêñòîâîé êîíôèãóðàöèè

    1) FTS êîíôèãóðàöèÿ îáúåäèíÿåò âñå íåîáõîäèìîå äëÿ îðãàíèçàöèè ïîëíîòåêñòîâîãî ïîèñêà, à èìåííî:

    • Ïàðñåð, êîòîðûé ðàçáèâàåò òåêñò íà òîêåíû è êàæäîìó òîêåíó ïðèïèñûâàåò åãî òèï;
    • Ïðàâèëà, ïî êîòîðûì òîêåí ïðåâðàùàåòñÿ â ëåêñåìó.

    2) FTS êîíôèãóðàöèé ìîæåò áûòü ìíîãî, îíè ìîãóò áûòü îïðåäåëåíû â ðàçíûõ ñõåìàõ. Èìÿ àêòèâíîé FTS êîíôèãóðàöèè ñîäåðæèòñÿ â ïåðåìåííîé default_text_search_config. Ïî óìîë÷àíèþ, îíà âûáèðàåòñÿ èç âñåõ êîíôèãóðàöèé, èìåþùèõ ôëàã DEFAULT, êîòîðûå ñîçäàíû äëÿ ñåðâåðíîé ëîêàëè, â ñîîòâåòñòâèè ñ ïðàâèëîì âèäèìîñòè îáúåêòîâ â PostgreSQL, ò.å. îïðåäåëÿåòñÿ ïåðåìåííîé search_path. Çäåñü íàäî óòî÷íèòü, ÷òî ñïåöèàëüíàÿ ñõåìà pg_catalog íåÿâíî ñòàâèòñÿ ïåðâîé â search_path, åñëè òîëüêî åå ïîëîæåíèå íå óêàçàëè ÿâíî. Òàê êàê âñòðîåííûå FTS êîíôèãóðàöèè îïðåäåëåíû â ñõåìå pg_catalog, òî îíè ìîãóò ìàñêèðîâàòü êîíôèãóðàöèè, ñîçäàííûå â ñõåìå ïî óìîë÷àíèþ, îáû÷íî public, ñîâïàäàþùèå ïî èìåíè, åñëè search_path íå ñîäåðæèò ÿâíî pg_catalog. Ïðåäïîëîæèì, ÷òî ìû èìååì äâå êîíôèãóðàöèè ñ èìåíåì russian îïðåäåëåííûå äëÿ ëîêàëè ru_RU.UTF-8 è èìåþùèå ôëàã DEFAULT.

    =# \dF *.russ*
                List of text search configurations
       Schema   |  Name   |            Description
    ------------+---------+------------------------------------
     pg_catalog | russian | configuration for russian language
     public     | russian |
    (2 row)
    

    Â çàâèñèìîñòè îò search_path ìû áóäåì èìåòü ðàçíóþ àêòèâíóþ FTS êîíôèãóðàöèþ.

    =# show tsearch_conf_name;
        tsearch_conf_name
    -------------------------
     pg_catalog.russian
    (1 row)
    
    =# set search_path=public, pg_catalog;
    SET
    =# show tsearch_conf_name;
      tsearch_conf_name
    ---------------------
     public.russian
    

    Òàêèì îáðàçîì, ÷òîáû íå âîçíèêàëè ðàçíîãî ðîäà êîíôóçû ìû ðåêîìåíäóåì:

    • Èñïîëüçîâàòü óíèêàëüíûå èìåíà FTS êîíôèãóðàöèé, êîòîðûå íå ïåðåêðûâàþòñÿ ñ ñèñòåìíûìè.
    • Èñïîëüçîâàòü ïîëíîå èìÿ FTS êîíôèãóðàöèè ñ óêàçàíèåì ñõåìû
    • Ñëåäèòü çà ïåðåìåííîé search_path. Ìîæíî çàäàòü åå ãëîáàëüíî â postgresql.conf, ëîêàëüíî â ~/.psqlrc èëè íà ïåðèîä ñåññèè. Îäíàêî, ýòî

    3) FTS êîíôèãóðàöèÿ êàê ëþáîé îáû÷íûé îáúåêò áàçû äàííûõ èìååò âëàäåëüöà, åå ìîæíî óäàëÿòü, ñîçäàâàòü, èçìåíÿòü òîëüêî ïðè íàëè÷èè ñîîòâåòñòâóþùèõ ïðàâ.

    4) Êàê ïðàâèëî, äëÿ óñïåøíîãî ïîèñêà òðåáóåòñÿ ñëåäèòü, ÷òîáû èñïîëüçîâàëàñü îäíà è òà æå FTS êîíôèãóðàöèÿ ïðè èíäåêñèðîâàíèè è ïðè ïîèñêå.

    5) Ðåêîìåíäóåòñÿ ÿâíî èñïîëüçîâàòü íàçâàíèå ïîëíîòåêñòîâîé êîíôèãóðàöèè â ôóíêöèÿõ to_tsquery(), to_tsvector(), ÷òîáû èçáåæàòü âîçìîæíûõ íàêëàäíûõ ðàñõîäîâ.

    ×òî íàäî çíàòü î ñëîâàðÿõ

    1) Ñëîâàðü - ýòî ïðîãðàììà, êîòîðàÿ ïðèíèìàåò íà âõîä ñëîâî, à íà âûõîäå

    • âûäàåò ìàññèâ ëåêñåì, åñëè ñëîâàðü îïîçíàë ñëîâî
    • ïóñòîé ìàññèâ (void array), åñëè ñëîâàðü çíàåò ñëîâî, íî îíî ÿâëÿåòñÿ ñòîï-ñëîâîì
    • NULL, åñëè ñëîâàðü íå ðàñïîçíàë ñëîâî.

    2) Íàäî ñëåäèòü, ÷òîáû âñå äàííûå, êîòîðûå èñïîëüçóþò ñëîâàðè,áûëè â server_encoding.

    Âñòðîåííûå ñëîâàðè âêëþ÷àþò:

    • Simple - âîçâðàùàåò âõîäíîå ñëîâî â íèæíåì ðåãèñòðå èëè NULL, åñëè ýòî ñòîï-ñëîâî.
    • Ispell - øàáëîí äëÿ ñîçäàíèÿ ñëîâàðåé, êîòîðûå ìîãóò èñïîëüçîâàòü ñëîâàðè Ispell[ISPELL], êîòîðûå äîñòóïíû äëÿ áîëüøîãî êîëè÷åñòâà ÿçûêîâ. Òàêæå ïîääåðæèâàþòñÿ ñëîâàðè MySpell[MYSPELL] (OO Hunspell [HUNSPELL] (OO >= 2.0.2). Áîëüøîé ñïèñîê ñëîâàðåé äîñòóïåí íà ñòðàíèöå [OODICTS].
    • Snowball stemmer - øàáëîí ñëîâàðÿ, êîòîðûé ïî îïðåäåëåííûì ïðàâèëàì, ñïåöèôè÷åñêèì äëÿ êàæäîãî ÿçûêà, îòðåçàåò îêîí÷àíèÿ ó ñëîâ. Ïðàâèëà äîñòóïíû äëÿ áîëüøîãî êîëè÷åñòâà ÿçûêîâ [SNOWBALL] è äëÿ 10 ÿçûêîâ äîñòóïíû â ñèñòåìå ïî óìîë÷àíèþ. Ñëîâàðü ïðèíèìàåò ïàðàìåòð, óêàçûâàþùèé íà ïîëîæåíèå ôàéëà ñî ñïèñêîì ñòîï-ñëîâ.
    • synonym øàáëîí èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ ñëîâàðåé, êîòîðûå çàìåíÿþò îäíî ñëîâî íà äðóãîå. Äëÿ ïîääåðæêè ôðàç èñïîëüçóéòå Thesaurus ñëîâàðü. Îäíèì èç ïðèìåðîâ èñïîëüçîâàíèÿ ñèíîíèìîâ - ýòî ðåøåíèå ëèíãâèñòè÷åñêèõ ïðîáëåì. Íàïðèìåð, ñëîâî 'Paris', ðàñïîçíàåòñÿ àíãëèéñêèì ñòåììåðîì êàê 'pari'. ×òîáû èçáåæàòü ýòîãî, äîñòàòî÷íî ñîçäàòü ñëîâàðü ñèíîíèìîâ
      Paris paris
      
      è ïîñòàâèòü åãî ïåðåä ñòåììåðîì.
      =# select * from ts_debug('english','Paris');
       Alias | Description | Token |      Dicts list      |       Lexized token
      -------+-------------+-------+----------------------+----------------------------
       lword | Latin word  | Paris | {pg_catalog.en_stem} | pg_catalog.en_stem: {pari}
      
      =# alter fulltext mapping on english for lword with synonym,en_stem;
      =# select * from ts_debug('english','Paris');
       Alias | Description | Token |               Dicts list                |        Lexized token
      -------+-------------+-------+-----------------------------------------+-----------------------------
       lword | Latin word  | Paris | {pg_catalog.synonym,pg_catalog.en_stem} | pg_catalog.synonym: {paris}
      (1 row)
      
    • thesaurus - øàáëîí äëÿ ñîçäàíèÿ ñëîâàðåé, ïîäîáíûõ ñëîâàðþ synonym, íî ñ ïîääåðæêîé ôðàç è íîðìàëèçàöèè ñëîâ. Ïîêàæåì íà ïðèìåðå àñòðîíîìè÷åñêîãî òåçàóðóñà:
      cat tz_astro.txt
      supernovae stars : sn
      crab nebulae : crab
      
      Äàëåå, ìû ñîçäàåì ñëîâàðü tz_astro è êðîìå ôàéëà ñ ñèíîíèìàìè óêàçûâàåì ñëîâàðü, êîòîðûé áóäåò èñïîëüçîâàòüñÿ äëÿ íîðìàëèçàöèè ñëîâ, òàê ÷òî 'supernovae stars' è 'supernovae star' áóäóò îïîçíàíû êàê 'sn'.
      apod=# CREATE TEXT SEARCH DICTIONARY tz_astro OPTION 
         'DictFile="tz_astro.txt", Dictionary="en_stem"' 
         LIKE thesaurus_template;
      
      Äàëåå, ìû óêàçûâàåì, ÷òî àíãëèéñêèå ñëîâà áóäóò îáðàáàòûâàòüñÿ ñíà÷àëà àñòðîíîìè÷åñêèì òåçàóðóñîì.
      apod=# ALTER TEXT SEARCH MAPPING ON russian_utf8 FOR lword,lhword,lpart_hword 
         WITH tz_astro,en_stem;
      
      Òåïåðü òåñòèðóåì:
      apod=# select plainto_tsquery('great supernovae stars');
       plainto_tsquery
       -----------------
        'great' & 'sn'
      apod=# select plainto_tsquery('great supernovae star');
       plainto_tsquery
       -----------------
        'great' & 'sn'
        
      

    3) Òåñòèðîâàòü ñëîâàðè ìîæíî ñ ïîìîùüþ ôóíêöèè lexize

    =# select lexize('en_stem', 'stars');
     lexize
    --------
     {star}
    
    =# select lexize('en_stem', 'a');
     lexize
    --------
     {}
    

    4) Ñëîâàðè ìîæíî äîáàâëÿòü â ñèñòåìó, ñì. ïðèìåð [FTSBOOKAPPC]

    ×òî íóæíî çíàòü îá èíäåêñàõ

    • Èíäåêñû èñïîëüçóþòñÿ òîëüêî äëÿ óñêîðåíèÿ îïåðàöèé
    • Ðåçóëüòàò âûïîëíåíèÿ çàïðîñà íå çàâèñèò îò èñïîëüçîâàíèÿ èíäåêñîâ
    • Èíäåêñû íå âñåãäà óñêîðÿþò îïåðàöèè
    • Äëÿ óñêîðåíèÿ ïîëíîòåêñòîâîãî ïîèñêà ìîæíî èñïîëüçîâàòü äâà èíäåêñà - íà îñíîâå GiST [GIST] èëè GIN [GIN].

    GIN èíäåêñ, èëè îáîáùåííûé îáðàòíûé èíäåêñ - ýòî ñòðóêòóðà äàííûõ, ó êîòîðîé êëþ÷îì ÿâëÿåòñÿ ëåêñåìà, à çíà÷åíèåì - ñîðòèðîâàííûé ñïèñîê èäåíòèôèêàòîðîâ äîêóìåíòîâ, êîòîðûå ñîäåðæàò ýòó ëåêñåìó. Îòìåòèì, ÷òî ïîçèöèîííàÿ èíôîðìàöèÿ íå õðàíèòñÿ â èíäåêñå, ÷òî ñâÿçàíî ñ îãðàíè÷åíèÿìè PostgreSQL. Òàê êàê â îáðàòíîì èíäåêñå èñïîëüçóåòñÿ áèíàðíîå äåðåâî äëÿ ïîèñêà êëþ÷åé, òî îí ñëàáî çàâèñèò îò èõ êîëè÷åñòâà è ïîòîìó õîðîøî øêàëèðóåòñÿ. Ýòîò èíäåêñ èñïîëüçóåòñÿ ïðàêòè÷åñêè âñåìè áîëüøèìè ïîèñêîâûìè ìàøèíàìè, îäíàêî åãî èñïîëüçîâàíèå â áàçàõ äàííûõ äëÿ èíäåêñèðîâàíèÿ èçìåíÿþùèõñÿ äîêóìåíòîâ çàòðóäíåíî, òàê êàê ëþáûå èçìåíåíèÿ (äîáàâëåíèå íîâîãî äîêóìåíòà, îáíîâëåíèå èëè óäàëåíèå) ïðèâîäÿò ê áîëüøîìó êîëè÷åñòâó îáíîâëåíèé èíäåêñà. Íàïðèìåð, äîáàâëåíèå íîâîãî äîêóìåíòà, êîòîðûé ñîäåðæèò N óíèêàëüíûõ ëåêñåì ïðèâîäèò ê îáíîâëåíèþ N çàïèñåé â èíäåêñå. Ïîýòîìó ýòîò èíäåêñ ëó÷øå âñåãî ïîäõîäèò äëÿ íåìåíÿþùèõñÿ êîëëåêöèé äîêóìåíòîâ. GIN èíäåêñ ïîääåðæèâàåò ãðóïïîâîå îáíîâëåíèå èíäåêñà, êîòîðîå ÿâëÿåòñÿ î÷åíü ýôôåêòèâíûì, ïîýòîìó èíîãäà áûñòðåå ñîçäàòü èíäåêñ çàíîâî, ÷åì îáíîâëÿòü èíäåêñ ïðè äîáàâêå êàæäîãî äîêóìåíòà.

    Â òîæå âðåìÿ, GiST èíäåêñ ÿâëÿåòñÿ "ïðÿìûì" èíäåêñîì, ò.å. äëÿ êàæäîãî äîêóìåíòà ñòàâèòñÿ â ñîîòâåòñòâèå áèòîâàÿ ñèãíàòóðà, â êîòîðîé ñîäåðæèòñÿ èíôîðìàöèÿ î âñåõ ëåêñåìàõ, êîòîðûå ñîäåðæàòüñÿ â ýòîì äîêóìåíòå, ïîýòîìó äîáàâëåíèå íîâîãî äîêóìåíòà ïðèâîäèò ê äîáàâëåíèþ òîëüêî îäíîé ñèãíàòóðû. Äëÿ áûñòðîãî ïîèñêà ñèãíàòóðû õðàíÿòñÿ â ñèãíàòóðíîì äåðåâå RD-Tree (russian doll, ìàòðåøêà), ðåàëèçîâàííàÿ ïîìîùüþ GiST.

    Ñèãíàòóðà - ýòî áèòîâàÿ ñòðîêà ôèêñèðîâàííîé äëèíû, â êîòîðîé âñå áèòû èçíà÷àëüíî âûñòàâëåííû â '0'. Ñ ïîìîùüþ õýø-ôóíêöèè ñëîâî îòîáðàæàåòñÿ â îïðåäåëåííûé áèò ñèãíàòóðû, êîòîðûé ñòàíîâèòñÿ '1'. Ñèãíàòóðà äîêóìåíòà ÿâëÿåòñÿ íàëîæåíèåì èíäèâèäóàëüíûõ ñèãíàòóð âñåõ ñëîâ. Òàêàÿ òåõíèêà íàçûâàåòñÿ superimposed coding è ðåàëèçóåòñÿ êàê bitwise OR, ÷òî ÿâëÿåòñÿ î÷åíü áûñòðîé îïåðàöèåé.
     word   signature
     ----------------
     w1 ->  01000000 
     w2 ->  00010000
     w3 ->  10000000
     ----------------------
            11010000  
    
     ýòîì ïðèìåðå, '11010000' ÿâëÿåòñÿ ñèãíàòóðîé äîêóìåíòà, ñîñòîÿùåãî èç òðåõ óíèêàëüíûõ ñëîâ w1,w2,w3. Ñèãíàòóðà ÿâëÿåòñÿ íåêîòîðûì êîìïàêòíûì ïðåäñòàâëåíèåì äîêóìåíòà, ÷òî ïðèâîäèò ê çíà÷èòåëüíîìó óìåíüøåíèþ ðàçìåðà êîëëåêöèè. Êðîìå òîãî, ôèêñèðîâàííûé ðàçìåð cèãíàòóðû ñèëüíî îáëåã÷àåò îïåðàöèè ñðàâíåíèÿ. Âñå ýòî äåëàåò èñïîëüçîâàíèå ñèãíàòóð âìåñòî äîêóìåíòîâ ïðèâëåêàòåëüíûì ñ òî÷êè çðåíèÿ ïðîèçâîäèòåëüíîñòè.

    Ïðè ïîèñêå, çàïðîñ ìîæíî àíàëîãè÷íûì îáðàçîì ïðåäñòàâèòü â âèäå ñèãíàòóðû è òîãäà ïðîöåññ ïîèñêà áóäåò çàêëþ÷àòüñÿ â ñðàâíåíèè ñèãíàòóð. Åñëè õîòÿ áû îäíî ïîëîæåíèå '1' â ñèãíàòóðàõ íå ñîâïàäàåò, òî ìîæíî ñ óâåðåííîñòüþ óòâåðæäàòü, ÷òî äîêóìåíò íå ñîäåðæèò ïîèñêîâûé çàïðîñ. Îäíàêî, åñëè âñå '1' ïîèñêîâîé ñèãíàòóðà ñîâïàäàþò ñ '1' ñèãíàòóðû äîêóìåíòà, òî ýòî îçíà÷àåò ëèøü òî, ÷òî ïîèñêîâûé çàïðîñ ìîæåò ñîäåðæàòüñÿ â äîêóìåíòå è ýòî òðåáóåò ïðîâåðêè ñ èñïîëüçîâàíèåì ñàìîãî äîêóìåíòà, à íå åãî ñèãíàòóðû. Âåðîÿòíîñòíûé îòâåò ñâÿçàí ñ èñïîëüçîâàíèåì õåøèðîâàíèÿ è ñóïåðïîçèöèè. Íèæå ïðèâîäÿòñÿ íåñêîëüêî ïðèìåðîâ ïîèñêîâûõ ñèãíàòóð.

     11010000  - ñèãíàòóðà äîêóìåíòà
     00000001  - ñèãíàòóðà çàïðîñà Q1, òî÷íî íå ñîäåðæèòñÿ â äîêóìåíòå
     01000000  - ñèãíàòóðà çàïðîñà Q2, âîçìîæíî ñîäåðæèòñÿ â äîêóìåíòå
     01010000  - cèãíàòóðà çàïðîñà Q3, âîçìîæíî ñîäåðæèòñÿ â äîêóìåíòå
    
    Ñèãíàòóðà Q2 ÿâëÿåòñÿ ñèãíàòóðîé ñëîâà w1 è, òàêèì îáðàçîì, ÿâëÿåòñÿ ïðàâèëüíûì ïîïàäàíèåì, â òî âðåìÿ êàê ñèãíàòóðà Q3 - ëîæíûì ïîïàäàíèåì (false drop), íåñìîòðÿ íà òî, ÷òî îíà óäîâëåòâîðÿåò ñèãíàòóðå äîêóìåíòà. ßñíî, ÷òî êîíå÷íîñòü ðàçìåðà ñèãíàòóðû è óâåëè÷åíèå êîëè÷åñòâà óíèêàëüíûõ ñëîâ ïðèâîäèò ê íàñûùåíèþ ñèãíàòóðû, ò.å., êîãäà âñå áèòû áóäóò '1', ÷òî ñèëüíî óìåíüøàåò èçáèðàòåëüíîñòü ñèãíàòóðû è óõóäøàåò ïðîèçâîäèòåëüíîñòü ïîèñêà.

    Ñóùåñòâóþò íåñêîëüêî ñòðóêòóð äàííûõ äëÿ õðàíåíèÿ ñèãíàòóð, òàêèå êàê ñèãíàòóðíûé ôàéë (signature file),íî îíè íå ÿâëÿþòñÿ èíäåêñàìè, òàê êàê òðåáóåò ïîëíîãî ïðîñìîòðà. Äåðåâî RD-Tree ÿâëÿåòñÿ àíàëîãîì R-Tree, ïðèñïîñîáëåííîå ê ðàáîòå ñî ìíîæåñòâàìè äëÿ ðåøåíèÿ çàäà÷è ïîèñêà âñåõ ìíîæåñòâ, êîòîðûå ñîäåðæàò â ñåáå íåêîå ïîäìíîæåñòâî, ÿâëÿåòñÿ èíäåêñíîé ñòðóêòóðîé è ìîæåò ñèëüíî óñêîðÿòü ïîèñê. Ïîäðîáíåå î RD-Tree ìîæíî ïðî÷èòàòü â îðèãèíàëüíîé ñòàòüå [RDTREE]

     ñëó÷àåò ïîëíîòåêñòîâîãî ïîèñêà, â êà÷åñòâå êëþ÷åé âûñòóïàþò ñèãíàòóðû - ñèãíàòóðû äîêóìåíòîâ íàõîäÿòñÿ â êîíöåâûõ óçëàõ, à âî âíóòðåííèõ óçëàõ íàõîäÿòñÿ ñèãíàòóðû, êîòîðûå óäîâëåòâîðÿþò îñíîâíîìó ïðàâèëó äåðåâà - ðîäèòåëüñêàÿ ñèãíàòóðà ñîäåðæèò â ñåáå ñèãíàòóðû âñåõ ïîòîìêîâ, ò.å. îíà ÿâëÿåòñÿ íàëîæåíèåì (ñóïåðïîçèöèåé) âñåõ ñèãíàòóð ïîòîìêîâ ( íàïîäîáèå òîìó, êàê ïîëó÷àëàñü ñèãíàòóðà äîêóìåíòà). Ïîèñêîâûé çàïðîñ àíàëîãè÷íî äîêóìåíòó ïðåîáðàçîâûâàåòñÿ â ïîèñêîâóþ ñèãíàòóðó è ïîèñê ïðîèñõîäèò ñðàâíåíèåì åå ñ ñèãíàòóðàìè â óçëàõ â äåðåâå.

    Èç-çà èñïîëüçîâàíèÿ ñóïåðïîçèöèè ïîèñê ïî äåðåâó ìîæåò îòâåòèòü îäíîçíà÷íî òîëüêî íà òî, ÷òî ïîèñêîâàÿ ñèãíàòóðà òî÷íî íå ñîäåðæèòñÿ â êàêîé-ëèáî ñèãíàòóðå, ÷òî ïîçâîëÿåò íå ðàññìàòðèâàòü íå òîëüêî ýòó ñèãíàòóðó, íî è âñå ïîääåðåâî ïîä íåé, ÷òî è ïðèâîäèò ê çíà÷èòåëüíîìó óñêîðåíèþ ïîèñêà. Íàïðèìåð, äëÿ ñèãíàòóðû 11011000 ïðàâóþ âåòêó ìîæíî òî÷íî íå ðàññìàòðèâàòü, îäíàêî îíà ìîæåò íàõîäèòüñÿ â ëåâîé âåòêå.

       
                                             ROOT
                                           11011011
                                       
    Internal nodes:           11011001                 10010011
                                 |                        |
    Leaves:          11010000, 11010001, 11011000   10010010,10010001
    

    Î÷åâèäíî, ÷òî ÷åì áîëüøå ãëóáèíà äåðåâà, òåì áîëüøå âåðîÿòíîñòü òîãî, ÷òî ñèãíàòóðà âûðîæäàåòñÿ, ò.å., íà÷èíàåò ñîñòîÿòü èç îäíèõ '1', à ýòî ïðèâîäèò ê òîìó, ÷òî ïðèõîäèòñÿ ïðîñìàòðèâàòü ìíîãî âåòîê è ïîèñê çàìåäëÿåòñÿ.  ïðåäåëüíîì ñëó÷àå, êîãäà ñèãíàòóðà ñîñòîèò èç îäíèõ '1', îíà ñòàíîâèòñÿ áåñïîëåçíîé, ò.å., ïðèõîäèòñÿ ïðîñìàòðèâàòü âñå âåòêè, íàõîäÿùèåñÿ ïîä íåé.

    Íàéäåííûå ðåçóëüòàòû ïðèõîäèòñÿ äîïîëíèòåëüíî ïðîâåðÿòü íà íàëè÷èå "false drops", ò.å., ïðîâåðÿòü ñàìè èñõîäíûå äîêóìåíòû, äåéñòâèòåëüíî ëè îíè óäîâëåòâîðÿþò ïîèñêîâîìó çàïðîñó, ÷òî òðåáóåò ïðîèçâîëüíîãî äîñòóïà ê "heap" (òàáëèöå) è ýòî ñèëüíî ñêàçûâàåòñÿ íà ïðîèçâîäèòåëüíîñòè. Ñòåïåíü íåîäíîçíà÷íîñòè (lossiness), à ñëåäîâàòåëüíî è ïðîèçâîäèòåëüíîñòü GiST-èíäåêñà, çàâèñèò îò êîë-âà óíèêàëüíûõ ëåêñåì è êîëè÷åñòâà äîêóìåíòîâ, ÷òî îãðàíè÷èâàåò ïðèìåíèìîñòü ýòîãî èíäåêñà äëÿ áîëüøèõ êîëëåêöèé.

    Ýòî ìîæíî ïðîèëëþñòðèðîâàòü ñ ïîìîùüþ explain analyze íà ïðèìåðå ïîèñêà ïî öåëî÷èñëåííûì ìàññèâàì ñ ïîìîùüþ ðàñøèðåíèÿ intarray, â êîòîðîì òîæå èñïîëüçóþòñÿ ñèãíàòóðû è RD-Tree.

     Bitmap Heap Scan on tt  (cost=29.27..405.87 rows=100 width=979) (actual time=68.714..6311.757 rows=678 loops=1)
       Filter: (a @> '{2}'::integer[])
       ->  Bitmap Index Scan on gist_idx  (cost=0.00..29.24 rows=100 width=0) (actual time=43.430..43.430 rows=10774 loops=1)
             Index Cond: (a @> '{2}'::integer[])
     Total runtime: 6312.807 ms
    

    Âèäíî, ÷òî GiST èíäåêñ (gist_idx) íàøåë 10774 çàïèñåé èç êîòîðûõ òîëüêî 678 ÿâëÿþòñÿ ïðàâèëüíûì îòâåòîì. Ïðîâåðêà 10774 çàïèñåé è ïîòðåáîâàëà âñå âðåìÿ. GIN èíäåêñ â ýòîì ñëó÷àå âûïîëíèë çàïðîñ âñåãî çà 11.892 ms. Êàê ãîâîðèòñÿ, ïî÷óâñòâóéòå ðàçíèöó !

    Bitmap Heap Scan on tt  (cost=150.50..527.11 rows=100 width=982) (actual time=0.610..11.277 rows=678 loops=1)
       Recheck Cond: (a @> '{2}'::integer[])
       ->  Bitmap Index Scan on gin_idx  (cost=0.00..150.48 rows=100 width=0) (actual time=0.433..0.433 rows=678 loops=1)
             Index Cond: (a @> '{2}'::integer[])
     Total runtime: 11.892 ms
    

    Íî ýòî íå âñÿ ïðàâäà î GiST-èíäåêñå ! Íà ñàìîì äåëå, â ëèñòüÿõ ìîãóò õðàíèòüñÿ íå ñèãíàòóðû, à ñàìè tsvector-à, åñëè îíè íå ïðåâûøàþò TOAST_INDEX_TARGET áàéò, ÷òî-òî îêîëî 512 áàéò.  ýòîì ñëó÷àå ïîïàäàíèå ÿâëÿåòñÿ òî÷íûì è ïðîâåðÿòü íè÷åãî íå íàäî. Ê ñîæàëåíèþ, ïîêà íåò âîçìîæíîñòè èíäåêñó ñêàçàòü êàêîå áûëî ïîïàäàíèå, íî â áóäóùåì, êîãäà ïîÿâèòñÿ òàêàÿ âîçìîæíîñòü, ýòà îïòèìèçàöèÿ ìîæåò î÷åíü õîðîøî ðàáîòàòü äëÿ íîâîñòíûõ ñàéòîâ, ãäå äîêóìåíòû íå î÷åíü áîëüøèå. ×òîáû èçó÷èòü GiST-èíäåêñ, ìîæíî âîñïîëüçîâàòüñÿ ñïåöèàëüíûì ìîäóëåì Gevel [GEVEL], êîòîðûé âûäàåò ïîëåçíóþ èíôîðìàöèþ îá èíäåêñå. Âîò ïðèìåð òàêîé âûäà÷è äëÿ èíäåêñà gist_idx_50 äëÿ áàçû, êîòîðàÿ ñîäåðæèò íåáîëüøèå ñîîáùåíèÿ. Îáðàòèòå âíèìàíèå, ÷òî ëèñòüÿ ñîäåðæàò êàê ñàìè tsvector-à, òàê è ñèãíàòóðû, à âíóòðåííèå íîäû - òîëüêî ñèãíàòóðû.

    arxiv=# select gist_stat('gist_idx_90');
                     gist_stat                  
    --------------------------------------------
     Number of levels:          4
     Number of pages:           18296
     Number of leaf pages:      17496
     Number of tuples:          435661
     Number of invalid tuples:  0
     Number of leaf tuples:     417366
     Total size of tuples:      124776048 bytes
     Total size of leaf tuples: 119803816 bytes
     Total size of index:       149880832 bytes
    
    -- leaf node
    arxiv=# select * from gist_print('gist_idx_90') as 
            t(level int,valid bool, fts gtsvector) where level =4;
     level | valid |              fts               
    -------+-------+--------------------------------
         4 | t     | 130 true bits, 1886 false bits
         4 | t     | 95 unique words
         4 | t     | 33 unique words
         4 | t     | 77 unique words
         4 | t     | 68 unique words
         4 | t     | 86 unique words
         4 | t     | 77 unique words
         4 | t     | 51 unique words
         4 | t     | 122 unique words
         4 | t     | 127 true bits, 1889 false bits
         4 | t     | 105 unique words
         4 | t     | 170 true bits, 1846 false bits
         4 | t     | 77 unique words
         4 | t     | 121 true bits, 1895 false bits
    ....................................
         4 | t     | 61 unique words
    (417366 rows)
    
    -- internal node
    arxiv=# select * from gist_print('gist_idx_90') as 
            t(level int, valid bool, fts gtsvector) where level =3;
    
     level | valid |              fts               
    -------+-------+--------------------------------
         3 | t     | 852 true bits, 1164 false bits
         3 | t     | 861 true bits, 1155 false bits
         3 | t     | 858 true bits, 1158 false bits
         3 | t     | 872 true bits, 1144 false bits
         3 | t     | 858 true bits, 1158 false bits
         3 | t     | 855 true bits, 1161 false bits
         3 | t     | 853 true bits, 1163 false bits
         3 | t     | 857 true bits, 1159 false bits
    ..................................................
         3 | t     | 782 true bits, 1234 false bits
         3 | t     | 773 true bits, 1243 false bits
    (17496 rows)
    

    Êàêîé èíäåêñ èñïîëüçîâàòü ?

    Ïîñëå ïîÿâëåíèÿ GIN-èíäåêñà, êîòîðûé õîðîøî øêàëèðóåòñÿ, ìîæåò âîçíèêíóòü îùóùåíèå, ÷òî GiST-èíäåêñ íå íóæåí. ×òîáû ñðàâíèòü ýòè èíäåêñû ìû âçÿëè áîëüøóþ êîëëåêöèþ àáñòðàêòîâ íàó÷íûõ ñòàòåé èç arxiv.org (ñïàñèáî Ñåðãåþ Êàðïîâó, êîòîðûé ñêà÷àë è çàëèë èõ â áàçó äàííûõ), êîòîðàÿ ñîäåðæèò 459841 àáñòðàêòîâ. Âñÿ áàçà çàíèìàåò ÷óòü áîëüøå îäíîãî ãèãàáàéòà. Ïîäðîáíåå ìîæíî ïðî÷èòàòü íà wiki [GINGIST], à çäåñü ìû ïðèâåäåì òîëüêî ðåçóëüòàòû (âñå âðåìåíà ïðèâåäåíû â ìèëëèñåêóíäàõ). Òåñòèðîâàëèñü òðè èíäåêñà - GiN-èíäåêñ è äâà GiST-èíäåêñà ñ ðàçíûìè ôàêòîðàìè çàïîëíåíèÿ (fillfactor). GiN-èíäåêñ ïîêà íå ïîääåðæèâàòå fillfactor.

    index           creation(ms)    size (b)        count(*)        rank query
    -------------------------------------------------------------------------
    GiN             532310.368      305864704       38.739          130.488
    GIST100         189321.561      130465792       120.730         215.153
    GIST50          164669.614      279306240       122.101         200.963
    

    Çäåñü count(*) - ýòî ïðîñòîé ïîèñêîâûé çàïðîñ, à rank query - ýòî ïîèñêîâûé çàïðîñ ñ ðàíæèðîâàíèåì. Îáíîâëåíèå èíäåêñà ïðîâåðÿëîñü äëÿ 95,1035,10546 çàïèñåé.

    index (nlev)      95            1035            10546
    -----------------------------------------------------------
    GIN             3343.881        36337.733       217577.424
    GIST50 (5)      238.101         2952.362        33984.443
    GIST100 (4)     232.674         2460.621        27852.507
    

    Âûâîäû:

    • ñîçäàíèå èíäåêñà - GIN òðåáóåò â 3 ðàçà áîëüøå âðåìåíè ÷åì GiST
    • ðàçìåð èíäåêñà - GiN-èíäåêñ â 2-3 ðàçà áîëüøå GiST-èíäåêñà
    • âðåìÿ ïîèñêà - GiN-èíäåêñ â 3 ðàçà áûñòðåå, ÷åì GiST-èíäåêñ
    • îáíîâëåíèå èíäåêñà - GiN-èíäåêñ îáíîâëÿåòñÿ â 10 ðàç ìåäëåííåå

    Òàêèì îáðàçîì, GiST-èíäåêñ íàäî èñïîëüçîâàòü äëÿ îáíîâëÿåìûõ äàííûõ, à GIN - äëÿ ñòàòè÷íûõ àðõèâîâ. Ðàçáèåíèå äàííûõ íà îáíîâëÿåìóþ ÷àñòü è àðõèâ è èñïîëüçîâàíèå ñîîòâåòñòâóþùèõ èíäåêñîâ, ïîçâîëÿåò ïîëó÷àòü ïðîèçâîäèòåëüíûé ïîèñê íà áîëüøèõ êîëëåêöèÿõ ñ îáíîâëÿåìûì êîíòåíòîì.

    Ñèíõðîíèçàöèÿ ïîëíîòåêñòîâîãî èíäåêñà

    Åñëè âàøà áàçà äàííûõ õîòü ñêîëüêî-íèáóäü îáíîâëÿåòñÿ, òî âàì íóæíî áóäåò ñëåäèòü çà ïîääåðæàíèåì ïîëíîòåêñòîâîãî èíäåêñ ïî ìåðå äîáàâëåíèå íîâûõ äîêóìåíòîâ. PostgreSQL ïîçâîëÿåò àâòîìàòèçèðîâàòü ýòîò ïðîöåññ ñ ïîìîùüþ îïðåäåëåíèÿ òðèããåðà, êîòîðûé çàïóñêàåòñÿ ïîñëå äîáàâëåíèÿ íîâîé ñòðîêè èëè îáíîâëåíèÿ ñóùåñòâóþùèõ çàïèñåé. Âñòðîåííûé òðèããåð tsearch() ïîçâîëÿåò ëåãêî íàñòðîèòü îáíîâëåíèå èíäåêñà, ìîæíî çàäàòü íåñêîëüêî òåêñòîâûõ êîëîíîê è èìÿ ôóíêöèè äëÿ îáðàáîòêè ñîîòâåòñòâóþùåé êîëîíêè. Âîò ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè äëÿ çàìåíû çíàêà @ íà çíàê ïðîáåëà.

    CREATE FUNCTION dropatsymbol(text) RETURNS text 
    AS 'select replace($1, ''@'', '' '');'
    LANGUAGE SQL;
    
    CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT 
    ON tblMessages FOR EACH ROW EXECUTE PROCEDURE 
    tsearch(tsvector_column,dropatsymbol, strMessage);
    

    Äëÿ áîëåå ñëîæíîãî ñëó÷àÿ, êîãäà äîêóìåíò ñîñòîèò èç íåñêîëüêèõ ÷àñòåé ñ ðàçíûìè âåñàìè ìîæíî íàïèñàòü ïðîöåäóðó íà ÿçûêå plpgsql (íå çàáóäüòå ðàçðåøèòü åãî èñïîëüçîâàíèå ñ ïîìîùüþ êîìàíäû createlang plpgsql DBNAME).

    Ñîçäàäèì òåñòîâóþ òàáëè÷êó ñî ñëåäóþùåé ñòðóêòóðîé.

    CREATE TABLE aa ( 
    	id integer primary key, 
    	t1 text, 
    	t2 text, 
    	fts tsvector
    );
    
    =# create function my_update() returns trigger as 
    $$
    BEGIN
       NEW.fts=
       setweight( to_tsvector('english',NEW.t1),'A') || ' ' ||
       setweight( to_tsvector('english',NEW.t2),'B');
     RETURN NEW;
    END;
    $$ 
    language plpgsql;
    

    Â ýòîé ôóíêöèè ìû äëÿ ïðîñòîòû îïóñòèëè èñïîëüçîâàíèå coalesce().

    CREATE TRIGGER fts_update BEFORE INSERT OR UPDATE ON aa
    FOR EACH ROW EXECUTE PROCEDURE my_update();
    
    =# insert into aa (id, t1,t2) values(1,'12,15,789,3','500');
    =# insert into aa (id, t1,t2) values(2,'-546,3','150');
    =# select * from aa;
     id |     t1      | t2  |                   fts
    ----+-------------+-----+------------------------------------------
      1 | 12,15,789,3 | 500 | '3':4A '12':1A '15':2A '500':5B '789':3A
      2 | -546,3      | 150 | '3':2A '150':3B '-546':1A
    (2 rows)
    

    Êàê ìû âèäèì, âñòàâêà íîâûõ çàïèñåé ðàáîòàåò êàê è îæèäàëîñü. Ïðîâåðèì îáíîâëåíèå.

    =# update aa set t1 = '1234567' where id=1;
    =# select * from aa;
     id |   t1    | t2  |            fts
    ----+---------+-----+---------------------------
      2 | -546,3  | 150 | '3':2A '150':3B '-546':1A
      1 | 1234567 | 500 | '500':2B '1234567':1A
    (2 rows)
    

    Òàê êàê òðèããåð çàïóñêàåòñÿ ïðè ëþáîì îáíîâëåíèè èëè äîáàâëåíèè çàïèñåé, òî ðàáîòà ñ òàáëèöàìè ìîæåò çàìåäëÿòüñÿ, åñëè îáíîâëåíèå ïîëíîòåêñòîâîãî èíäåêñà ÿâëÿåòñÿ î÷åíü äîðîãîñòîÿùåé îïåðàöèåé, äàæå êîãäà îáíîâëÿþòñÿ àòðèáóòû, êîòîðûå íå èìåþò îòíîøåíèå ê íåìó. ×òîáû èçáåæàòü ëèøíåé ðàáîòû â ôóíêöèè fts_update ìîæíî âñòàâèòü ïðîâåðêó íà èçìåíåíèå òåêñòîâîãî àòðèáóòà, íàïðèìåð

    If ( OLD.t1  NEW.t1 or OLD.t2  NEW.t2 ) Then
      -- ïîëó÷åíèå fts
    Endif
    

    Òåñòèðîâàíèå íàñòðîåê

    Çà÷àñòóþ áûâàåò íåîáõîäèìî ïîòåñòèðîâàòü ñâîþ ïîëíîòåêñòîâóþ êîíôèãóðàöèþ. Äëÿ ýòîã ñóùåñòâóåò âñòðîåííàÿ ôóíêöèÿ ts_debug, êîòîðàÿ íàãëÿäíî ïîêàçûâàåò ÷òî ïðîèñõîäèò ñ òåêñòîì. Îíà ïîäðîáíî îïèñàíà â äîêóìåíòàöèè [FTSBOOKDEBUG], ìû ïðèâåäåì ëèøü ïðèìåð:

    apod=# select * from ts_debug('the Supernovae stars');
     Alias |  Description  |   Token    |      Dicts list      |          Lexized token          
    -------+---------------+------------+----------------------+---------------------------------
     lword | Latin word    | the        | {pg_catalog.en_stem} | pg_catalog.en_stem: {}
     blank | Space symbols |            |                      | 
     lword | Latin word    | Supernovae | {pg_catalog.en_stem} | pg_catalog.en_stem: {supernova}
     blank | Space symbols |            |                      | 
     lword | Latin word    | stars      | {pg_catalog.en_stem} | pg_catalog.en_stem: {star}
    (5 rows)
    

    Çäåñü çàñëóæèâàåò âíèìàíèå ïîñëåäíÿÿ êîëîíêà, êîòîðàÿ íàçûâàåòñÿ "Lexized token".  íåé ñîäåðæèòñÿ èìÿ ñëîâàðÿ, êîòîðûé ðàñïîçíàë òîêåí è ìàññèâ ëåêñåì, â êîòîðûé ýòîò ñëîâàðü ïðåîáðàçîâàë òîêåí. Òàê êàê ó íàñ íàñòðîåí òîëüêî îäèí ñëîâàðü pg_catalog.en_stem, êîòîðûé ê òîìó æå ðàñïîçíàåò ëþáûå ñëîâà, òî âñå òîêåíû èì è ðàñïîçíàëèñü. Òîêåí the ðàñïîçíàëñÿ êàê ñòîï-ñëîâî, ïîýòîìó ìû ïîëó÷èëè ïóñòîé ìàññèâ è îíî íå áóäåò ïðîèíäåêñèðîâàíî. Îñòàëüíûå òîêåíû áûëè ïðèâåäåíû ê íåêîòîðîìó íîðìàëüíîìó âèäó.

    Ìîæíî óêàçàòü ÿâíî íàçâàíèå ïîëíîòåêñòîâîé êîíôèãóðàöèè, ÷òî áû ïðîòåñòèðîâàòü åå.

    apod=# select * from ts_debug('simple','the Supernovae stars');
     Alias |  Description  |   Token    |     Dicts list      |          Lexized token          
    -------+---------------+------------+---------------------+---------------------------------
     lword | Latin word    | the        | {pg_catalog.simple} | pg_catalog.simple: {the}
     blank | Space symbols |            |                     | 
     lword | Latin word    | Supernovae | {pg_catalog.simple} | pg_catalog.simple: {supernovae}
     blank | Space symbols |            |                     | 
     lword | Latin word    | stars      | {pg_catalog.simple} | pg_catalog.simple: {stars}
    (5 rows)
    

    Êàê ìû óæå óêàçûâàëè âûøå, òåñòèðîâàòü ñëîâàðè ìîæíî ñ ïîìîùüþ ôóíêöèè lexize.

    Ïàðñåðû òàêæå ìîæíî òåñòèðîâàòü èñïîëüçóþ ôóíêöèþ parse.

    =# select * from parse('default','123 - a number');
     tokid | token
    -------+--------
        22 | 123
        12 |
        12 | -
         1 | a
        12 |
         1 | number
    

    çåäñü tokid - ýòî id òèïà òîêåíà

    =# select * from token_type('default');
     tokid |    alias     |            description
    -------+--------------+-----------------------------------
         1 | lword        | Latin word
         2 | nlword       | Non-latin word
         3 | word         | Word
         4 | email        | Email
         5 | url          | URL
         6 | host         | Host
         7 | sfloat       | Scientific notation
         8 | version      | VERSION
         9 | part_hword   | Part of hyphenated word
        10 | nlpart_hword | Non-latin part of hyphenated word
        11 | lpart_hword  | Latin part of hyphenated word
        12 | blank        | Space symbols
        13 | tag          | HTML Tag
        14 | protocol     | Protocol head
        15 | hword        | Hyphenated word
        16 | lhword       | Latin hyphenated word
        17 | nlhword      | Non-latin hyphenated word
        18 | uri          | URI
        19 | file         | File or path name
        20 | float        | Decimal notation
        21 | int          | Signed integer
        22 | uint         | Unsigned integer
        23 | entity       | HTML Entity
    

    Ïðèìåð: Àñòðîíîìè÷åñêèé ïîèñê

    Ìû ïðèâåäåì ïðèìåð îðãàíèçàöèè ïîëíîòåêñòîâîãî ïîèñêà, êîòîðûé êàæäûé ìîæåò ïîâòîðèòü ñ âåðñèåé PostgreSQL 8.3+. Îäíàêî, áîëüøèíñòâî êîìàíä âïîëíå äîëæíî ðàáîòàòü è ñ PostgreSQL 8.2+, òîëüêî âàì äëÿ ýòîãî ïðèäåòñÿ óñòàíîâèòü contrib/tsearch2 è çàãðóçèòü â ñâîþ òåñòîâóþ áàçó äàííûõ.

    Èñõîäíûå äàííûå - àðõèâ [APOD].

    > curl -O http://www.sai.msu.su/~megera/postgres/fts/apod.dump.gz
    > createdb apod
    (äëÿ PostgreSQL 8.2+ íàäî óñòàíîâèòü ìîäóëü contrib/tsearch2 è çàãðóçèòü åãî
    â ÁÄ apod)
    > zcat apod.dump.gz | psql apod
    > psql apod
    

    Ñòðóêòóðà òàáëèöû apod. Îòìåòèì, ÷òî ïîëå keywords ñîäåðæèò êëþ÷åâûå ñëîâà, ïðèñâîåííûå ýêñïåðòàìè âðó÷íóþ.

    apod=# \d apod
           Table "public.apod"
      Column  |   Type   | Modifiers 
    ----------+----------+-----------
     id       | integer  | not null
     title    | text     | 
     body     | text     | 
     sdate    | date     | 
     keywords | text     | 
    Indexes:
        "apod_pkey" PRIMARY KEY, btree (id)
    

    Òåêóùàÿ ïîëíîòåêñòîâàÿ êîíôèãóðàöèÿ ïî óìîë÷àíèþ ó íàñ pg_catalog.russian_utf8, òàê êàê íàø êëàñòåð áûë ñîçäàí êîìàíäîé ñ ïàðàìåòðîì --locale=ru_RU.UTF-8.

    apod=# \dF+ pg_catalog.russian_utf8
    Configuration "pg_catalog.russian_utf8"
    Parser name: "pg_catalog.default"
    Locale: 'ru_RU.UTF-8' (default)
        Token     |      Dictionaries       
    --------------+-------------------------
     email        | pg_catalog.simple
     file         | pg_catalog.simple
     float        | pg_catalog.simple
     host         | pg_catalog.simple
     hword        | pg_catalog.ru_stem_utf8
     int          | pg_catalog.simple
     lhword       | pg_catalog.en_stem
     lpart_hword  | pg_catalog.en_stem
     lword        | pg_catalog.en_stem
     nlhword      | pg_catalog.ru_stem_utf8
     nlpart_hword | pg_catalog.ru_stem_utf8
     nlword       | pg_catalog.ru_stem_utf8
     part_hword   | pg_catalog.simple
     sfloat       | pg_catalog.simple
     uint         | pg_catalog.simple
     uri          | pg_catalog.simple
     url          | pg_catalog.simple
     version      | pg_catalog.simple
     word         | pg_catalog.ru_stem_utf8
    

    Âûøå, ìû óæå óïîìèíàëè, ÷òî íà÷èíàÿ ñ âåðñèè 8.3+ ìîæíî ñäåëàòü ïðîñòîé ïîëíîòåêñòîâûé ïîèñê â îäíó êîìàíäó è ïðèâîäèëè êîìàíäó äëÿ äîáàâëåíèÿ ïîëÿ òèïà tsvector, ÷òîáû ïîëó÷èòü ïîëíîöåííûé ïîèñê.

    apod=# UPDATE apod SET fts=
    setweight( coalesce( to_tsvector(keywords),''),'A')|| ' ' ||
    setweight( coalesce( to_tsvector(title),''),'B') || ' ' ||
    setweight( coalesce( to_tsvector(body),''),'D');
    apod=# \d apod
           Table "public.apod"
      Column  |   Type   | Modifiers
    ----------+----------+-----------
     id       | integer  | not null
     title    | text     |
     body     | text     |
     sdate    | date     |
     keywords | text     |
     fts      | tsvector |
    Indexes:
        "apod_pkey" PRIMARY KEY, btree (id)
    

    Ïîñëå ýòîãî ìû óæå ìîæåì èñêàòü è ðàíæèðîâàòü ðåçóëüòàòû ïîèñêà.

    apod=# select title,ts_rank_cd(fts, q) from apod, 
    to_tsquery('supernovae & x-ray') q 
    where fts  @@ q order by ts_rank_cd desc limit 5;
                         title                      | ts_rank_cd 
    ------------------------------------------------+---------
     Supernova Remnant E0102-72 from Radio to X-Ray | 1.59087
     An X-ray Hot Supernova in M81                  | 1.47733
     X-ray Hot Supernova Remnant in the SMC         | 1.34823
     Tycho's Supernova Remnant in X-ray             | 1.14318
     Supernova Remnant and Neutron Star             | 1.08116
    (5 rows)
    
    Time: 11.948 ms
    

    Çàìåòèì, ÷òî íèêàêèõ èíäåêñîâ íå áûëî ñîçäàíî, ïîëíîòåêñòîâûé ïîèñê îáÿçàí ðàáîòàòü è áåç íèõ. Äëÿ óñêîðåíèÿ ïîèñêà ìû ìîæåì ñîçäàòü èíäåêñ è ïîâòîðèòü çàïðîñ.

    apod=# create index fts_idx on apod using gin (fts);
    apod=# select title,ts_rank_cd(fts, to_tsquery('supernovae & x-ray')) from apod
    where fts  @@ to_tsquery('supernovae & x-ray') order by ts_rank_cd desc limit 5;
                         title                      | ts_rank_cd
    ------------------------------------------------+---------
     Supernova Remnant E0102-72 from Radio to X-Ray | 1.59087
     An X-ray Hot Supernova in M81                  | 1.47733
     X-ray Hot Supernova Remnant in the SMC         | 1.34823
     Tycho's Supernova Remnant in X-ray             | 1.14318
     Supernova Remnant and Neutron Star             | 1.08116
    (5 rows)
    
    Time: 1.998 ms
    

    Âèäíî, ÷òî ðåçóëüòàòû íå èçìåíèëèñü, êàê è äîëæíî áûòü, íî âðåìÿ èñïîëíåíèÿ çàïðîñû óìåíüøèëîñü íà ïîðÿäîê. ×òî ìû è õîòåëè ïîëó÷èòü.

     çàïðîñå ìû èñïîëüçîâàëè ôóíêöèþ ts_rank_cd, êîòîðàÿ âîçâðàùàåò ðàíê äîêóìåíòà îòíîñèòåëüíî çàïðîñà.  íàøåì ñëó÷àå äîêóìåíò - ýòî fts, à çàïðîñ - to_tsquery('supernovae & x-ray'). fts ìû ñîçäàâàëè èç íåñêîëüêèõ òåêñòîâûõ àòðèáóòîâ, êîòîðûì áûëè ïðèñâîåíû ðàçíûå âåñà. Èõ ÷èñëåííûå çíà÷åíèÿ ìîãóò áûòü çàäàíû â ôóíêöèè ts_rank_cd, êîòîðûå ïî óìîë÷àíèþ èìååò ñëåäóþùèå çíà÷åíèÿ 0.1, 0.2, 0.4, 1.0, ÷òî ñîîòâåòñòâóåò D,C,B,A. Ìû ìîæåì ÿâíî óêàçàòü íîâûå çíà÷åíèÿ, íàïðèìåð, ïîäíÿâ âàæíîñòü ñëîâ â çàãîëîâêàõ, à âàæíîñòü êëþ÷åâûõ ñëîâ ñèëüíî ïîíèçèâ, ñ÷èòàÿ ýêñïåðòîâ íå î÷åíü êîìïåòåíòíûìè.

    apod=# select title,ts_rank_cd('{0.1,0.2,1.0,0.1}',fts, to_tsquery('supernovae & x-ray')) from apod
    where fts  @@ to_tsquery('supernovae & x-ray') order by ts_rank_cd desc limit 5;
                         title                      | ts_rank_cd
    ------------------------------------------------+----------
     An X-ray Hot Supernova in M81                  | 0.708395
     X-ray Hot Supernova Remnant in the SMC         | 0.646742
     Supernova Remnant N132D in X-Rays              | 0.577618
     Cas A Supernova Remnant in X-Rays              | 0.458009
     Supernova Remnant E0102-72 from Radio to X-Ray |  0.44515
    (5 rows)
    

    Ìû âèäèì, êàê ïîìåíÿëèñü ðåçóëüòàòû. Îòìåòèì, ÷òî çíà÷åíèÿ ts_rank_cd íå èìåþò îñîáåííîãî ñìûñëà, èìååò çíà÷åíèå òîëüêî ïîðÿäîê. Îäíàêî, èíîãäà õî÷åòñÿ èìåòü íîðìèðîâàííîå çíà÷åíèå è â òàêîì ñëó÷àå ìîæíî èñïîëüçîâàòü ts_rank_cd/(ts_rank_cd+1), íàïðèìåð.

    Åñëè ìû õîòèì ïîêàçàòü â ðåçóëüòàòàõ ïîèñêà âûäåðæêè èç òåêñòà, òî ìîæíî âîñïîëüçîâàòüñÿ ôóíêöèåé ts_headline.

    apod=# select ts_headline(body,to_tsquery('supernovae & x-ray'),'StartSel=,MaxWords=10,MinWords=5'),
    ts_rank_cd(fts, to_tsquery('supernovae & x-ray')) from apod
    where fts  @@ to_tsquery('supernovae & x-ray') order by ts_rank_cd desc limit 5;
                                   ts_headline                               | ts_rank_cd 
    ----------------------------------------------------------------------+---------
      remnant  E0102-72, however, is giving astronomers a clue | 1.59087
      explosion. The picture was taken in  -          | 1.47733
      - glow is produced by  multi-million degree                 | 1.34823
      - emitted by this shockwave made by a telescope            | 1.14318
      - glow. Pictured is the                          | 1.08116
    (5 rows)
    
    Time: 2.191 ms
    

    Çäåñü ìû óêàçàëè, ÷òî âûäåëÿòü íàéäåííûå ñëîâà íàäî ñ ïîìîùüþ óãîëêîâ è ðàçìåð òåêñòà äîëæåí áûòü íå ìåíüøå 5 ñëîâ, íî íå áîëåå 10. Äëÿ âåðñèé PostgreSQL 9.5- ðåêîìåíäóåòñÿ èñïîëüçîâàòü subselect, ÷òîáû íå âû÷èñëÿòü ëèøíèé ðàç ts_headline, íàïðèìåð òàê:

    apod=# select ts_headline(body, to_tsquery('supernovae & x-ray'), 'StartSel=,MaxWords=10,MinWords=5'),
    rank from ( 
      select body, ts_rank_cd(fts,to_tsquery('supernovae & x-ray')) as rank from apod
      where fts @@ to_tsquery('supernovae & x-ray') 
      order by rank desc limit 5
    ) as foo;
                                   ts_headline                               | ts_rank_cd 
    ----------------------------------------------------------------------+---------
      remnant  E0102-72, however, is giving astronomers a clue | 1.59087
      explosion. The picture was taken in  -          | 1.47733
      - glow is produced by  multi-million degree                 | 1.34823
      - emitted by this shockwave made by a telescope            | 1.14318
      - glow. Pictured is the                          | 1.08116
    (5 rows)
    
    Time: 2.096 ms
    

    Èñïîëüçóÿ îäèí è òîò æå ïîëíîòåêñòîâûé èíäåêñ fts ìû ìîæåì èñêàòü ïî ÷àñòÿì äîêóìåíòà èëè èõ êîìáèíàöèÿì. Íàïðèìåð, ìîæíî ïîòðåáîâàòü, ÷òîáû ñëîâî x-ray âñòðå÷àëîñü â çàãîëîâêàõ äîêóìåíòîâ.

    apod=# select title,ts_rank_cd(fts, to_tsquery('supernovae & x-ray:b')) from apod
    where fts  @@ to_tsquery('supernovae & x-ray:b')  order by ts_rank_cd desc limit 5;
                         title                      | ts_rank_cd  
    ------------------------------------------------+----------
     Supernova Remnant E0102-72 from Radio to X-Ray |  1.59087
     An X-ray Hot Supernova in M81                  |  1.47733
     X-ray Hot Supernova Remnant in the SMC         |  1.34823
     Tycho's Supernova Remnant in X-ray             |  1.14318
     Vela Supernova Remnant in X-ray                | 0.703056
    (5 rows)
    

    Ïðèìåð: FTS êîíôèãóðàöèÿ äëÿ www.postgresql.org

    Íà ñàéòàõ postgresql.org âû ìîæåòå óâèäåòü ïîëíîòåêñòîâûé ïîèñê â æèçíè. Îáúåì èíäåêñèðîâàííûõ äîêóìåíòîâ - ýòî îêîëî 600,0000 ïîñòèíãîâ â àðõèâàõ ðàññûëîê è áîëåå 20,000 äîêóìåíòîâ íà ñàéòå www.postgresql.org. Ñîçäàäèì ïîëíîòåêñòîâóþ êîíôèãóðàöèþ äëÿ òàêîãî ïîèñêà. Òàê êàê ìû ñîçäàåì òåìàòè÷åñêèé ïîèñê, ìû äîëæíû ñîçäàòü ñëîâàðü ñèíîíèìîâ pg_dict.txt, êîòîðûé ñîäåðæèò, íàïðèìåð, âñå íàçâàíèÿ áàçû äàííûõ PostgreSQL è ïîëîæèì åãî â äèðåêòîðèþ $PGROOT/share/dicts_data.

    postgres postgresql
    pgsql    postgresql
    postgres postgresql
    

    Òåïåðü ìîæíî ñîçäàòü íàøó êîíôèãóðàöèþ public.pg èñïîëüçóÿ ñòàíäàðòíóþ êîíôèãóðàöèþ äëÿ àíãëèéñêîãî ÿçûêà english. Êîíå÷íî, âñå äåëàåì â òðàíçàêöèè, ÷òîáû íå îñòàâàëîñü "ìóñîðà", åñëè ãäå-òî âîçíèêëà ïðîáëåìà.

    BEGIN;
    CREATE TEXT SEARCH CONFIGURATION public.pg  LOCALE  'ru_RU.UTF-8' 
           LIKE english WITH MAP AS DEFAULT;
    CREATE TEXT SEARCH DICTIONARY pg_dict OPTION 'pg_dict.txt'  LIKE synonym;
    CREATE TEXT SEARCH DICTIONARY en_ispell 
    OPTION 'DictFile="english-utf8.dict",
            AffFile="english-utf8.aff",
            StopFile="english-utf8.stop"'
    LIKE ispell_template;
    ALTER TEXT SEARCH DICTIONARY en_stem SET OPTION 'english-utf8.stop';
    ALTER TEXT SEARCH MAPPING ON pg FOR lword,lhword,lpart_hword
                                 WITH pg_dict,en_ispell,en_stem;
    DROP TEXT SEARCH MAPPING ON pg FOR email, url, sfloat, uri, float;
    END;
    

    Ìû ñîçäàëè ñëîâàðü íà îñíîâå ñëîâàðÿ ispell. Òàê êàê ìû èñïîëüçóåì UTF-8, òî ìû èñïîëüçóåì êîíâåðòèðîâàííûå â UTF-8 ôàéëû ispell. Äàëåå, ìû óêàçàëè ñëîâàðÿì en_ispell, en_stem èñïîëüçîâàòü ñòîï-ñëîâà äëÿ àíãëèéñêîãî ÿçûêà â äèðåêòîðèè $PGROOT/share/dicts_data. Çàòåì, ìû çàäàëè, ÷òî òîêåíû òèïà lword,lhword,lpart_hword, îáîçíà÷àþùèå àíãëèéñêèå ñëîâà, äîëæíû îáðàáàòûâàòüñÿ ñëîâàðÿìè pg_dict,en_ispell,en_stem è èìåííî â òàêîì ïîðÿäêå. È íàïîñëåäîê, ìû óäàëèëè ïðàâèëà äëÿ òîêåíîâ, êîòîðûå íàñ íå èíòåðåñóþò - ýòî email, url, sfloat, uri, float.

    Áîëåå ïîäðîáíî ìîæíî ïðî÷èòàòü â [FTSBOOKAPPA].

    Ïîääåðæêà â psql

    Èíôîðìàöèþ î ïîëíîòåêñòîâûõ îáúåêòàõ ìîæíî ïîëó÷èòü â psql ñ ïîìîùüþ êîìàíä \dF{,d,p}[+] [PATTERN]. Çäåñü

    • çíàê + èñïîëüçóåòñÿ äëÿ ïîêàçà ðàñøèðåííîé èíôîðìàöèè
    • {,d,p} - óêàçûâàåò èíôîðìàöèþ î êàêèõ îáúåêòàõ ïîêàçûâàòü. Ïî óìîë÷àíèþ ïîêàçûâàåòñÿ èíôîðìàöèÿ î ïîëíîòåêñòîâûõ êîíèôãóðàöèÿõ.
    • PATTERN - íåîáÿçàòåëüíûé ïàðàìåòð, çàäàåò èìÿ îáúåêòà. Åñëè èìÿ íå óêàçàíî, òî ïîêàçûâàåòñÿ èíôîðìàöèÿ î îáúåêòå, êîòîðûé ïðåäñòàâëÿåò êîíôèãóðàöèþ, ïàðñåð, ñëîâàðü ïî óìîë÷àíèþ. PATTERN ìîæåò áûòü ðåãóëÿðíûì âûðàæåíèåì, êîòîðîå ïðèìåíÿåòñÿ ïî îòäåëüíîñòè - ê íàçâàíèþ ñõåìû è ê íàçâàíèþ îáúåêòà.
    =# \dF *fts*
           List of fulltext configurations
     Schema |  Name   |   Locale    | Description
    --------+---------+-------------+-------------
     public | fts_cfg | ru_RU.UTF-8 |
    
    =# \dF *.fts*
           List of fulltext configurations
     Schema |  Name   |   Locale    | Description
    --------+---------+-------------+-------------
     fts    | fts_cfg | ru_RU.UTF-8 |
     public | fts_cfg | ru_RU.UTF-8 |
    

    SQL êîìàíäû

    Âíèìàíèå: Îêîí÷àòåëüíûé ñèíòàêñèñ SQL êîììàíä åùå íå óòâåðæäåí !
    CREATE TEXT SEARCH CONFIGURATION - ñîçäàíèå ïîëíîòåêñòîâîé êîíôèãóðàöèè
    CREATE TEXT SEARCH CONFIGURATION cfgname 
    PARSER  prsname  [ LOCALE localename] 
    [AS DEFAULT];
    
    CREATE TEXT SEARCH CONFIGURATION cfgname 
    [{  PARSER  prsname | LOCALE  localename  }  [ ...]] 
    LIKE template_cfg [WITH MAP] 
    [AS DEFAULT];
    
    • FTS êîíôèãóðàöèÿ ïðèíàäëåæèò ïîëüçîâàòåëþ, êîòîðûé ñîçäàë åå
    • Èìÿ êîíôèãóðàöèè cfgname ìîæåò ñîäåðæàòü íàçâàíèå ñõåìû, òîãäà îíà áóäåò ñîçäàíà â ýòîé ñõåìå, èíà÷å êîíôèãóðàöèÿ áóäåò ñîçäàíà â òåêóùåé ñõåìå.
    • PARSER prsname çàäàåò ïàðñåð, êîòîðûé êîòîðûé èñïîëüçóåòñÿ äëÿ ðàçáèâàíèÿ òåêñòà íà òîêåíû. Èìÿ ïàðñåðà òàêæå ìîæåò ñîäåðæàòü íàçâàíèå ñõåìû.
    • LOCALE localename - çàäàåò íàçâàíèå ñåðâåðíîé ëîêàëå, äëÿ êîòîðîé ýòà êîíôèãóðàöèÿ áóäåò âûáèðàòüñÿ ïî óìîë÷àíèþ, åñëè çàäàíà îïöèÿ AS DEFAULT.
    • LIKE template_cfg óêàçûâàåò, ÷òî â êà÷åñòâå øàáëîíà èñïîëüçóåòñÿ ñóùåñòâóþùàÿ FTS êîíôèãóðàöèÿ template_cfg.
    • WITH MAP èñïîëüçóåòñÿ ñ LIKE template_cfg è îçíà÷àåò, ÷òî òàêæå êîïèðóþòñÿ ïðàâèëà îáðàáîòêè òîêåíîâ ñëîâàðÿìè.
    Ïðèìåðû:
    =# CREATE TEXT SEARCH CONFIGURATION test LIKE pg_catalog.russian_utf8 AS DEFAULT;
    =# \dF public.test
               List of fulltext configurations
     Schema | Name |   Locale    | Default | Description
    --------+------+-------------+---------+-------------
     public | test | ru_RU.UTF-8 | Y       |
    
    DROP TEXT SEARCH CONFIGURATION - óäàëèòü FTS êîíôèãóðàöèþ
    DROP TEXT SEARCH CONFIGURATION [IF EXISTS]cfgname [ CASCADE | RESTRICT ];
    
    • IF EXISTS óêàçûâàòü íå âûäàâàòü îøèáêó, åñëè óäàëÿåìàÿ êîíôèãóðàöèÿ íå ñóùåñòâóåò.
    • CASCADE - àâòîìàòè÷åñêè óäàëèòü âñå FTS îáúåêòû, çàâèñÿùèå îò óäàëÿåìîé FTS êîíôèãóðàöèè.
    • RESTRICT - íå óäàëÿòü FTS êîíôèãóðàöèþ, åñëè åñòü êàêèå-ëèáî FTS îáúåêòû, çàâèñÿùèå îò íåå. Ýòîò ðåæèì èñïîëüçóåòñÿ ïî óìîë÷àíèþ.
    ALTER TEXT SEARCH CONFIGURATION - èçìåíèòü FTS êîíôèãóðàöèþ
    ALTER TEXT SEARCH CONFIGURATION cfgname RENAME TO newcfgname;
    
    ALTER TEXT SEARCH CONFIGURATION cfgname 
    SET { LOCALE localename | PARSER prsname } [, ...];
    
    ALTER TEXT SEARCH CONFIGURATION cfgname { SET AS | DROP } DEFAULT;
    
    Ýòà êîìàíäà ïîçâîëÿåò èçìåíèòü ïàðàìåòðû, çàäàâàåìûå ïðè åå ñîçäàíèè.
    CREATE TEXT SEARCH DICTIONARY - ñîçäàòü ñëîâàðü
    CREATE TEXT SEARCH DICTIONARY dictname 
        LEXIZE  lexize_function
        [INIT  init_function ]
        [OPTION  opt_text ]
    ;
      
    
    CREATE TEXT SEARCH DICTIONARY dictname 
    [    {   INIT  init_function 
            | LEXIZE  lexize_function 
            | OPTION opt_text } 
    [ ... ]] LIKE template_dictname;
    
    • Íàçâàíèå ñëîâàðÿ dictname ìîæåò ñîäåðæàòü íàçâàíèå ñõåìû, â êîòîðîé îí áóäåò ñîçäàí, íàïðèìåð, public.english.
    • LEXIZE lexize_function - íàçâàíèå ôóíêöèè, êîòîðàÿ çàíèìàåòñÿ ïðåîáðàçîâàíèåì òîêåíà â ëåêñåìó.
    • INIT init_function - íàçâàíèå ôóíêöèè, êîòîðàÿ èíèöèàëèçèðóåò ñëîâàðü
    • OPTION opt_text - çàäàåò òåêñòîâóþ ñòðîêó, êîòîðàÿ äîñòóïíà ñëîâàðþ. Îáû÷íî, åå èñïîëüçóþò äëÿ óêàçàíèÿ ôàéëîâ, èñïîëüçóåìûõ ñëîâàðåì. Îòíîñèòåëüíûå ïóòè äëÿ ñëîâàðíûõ ôàéëîâ èíòåðïðåòèðóþòñÿ îòíîñèòåëüíî äèðåêòîðèè $PGROOT/share/dicts_data.
    • LIKE template_dictname - çàäàåò ñëîâàðü-øàáëîí, èñïîëüçóåìûé äëÿ ñîçäàíèÿ ñëîâàðÿ. Ïðè ýòîì, çíà÷åíèÿ ïàðàìåòðîâ INIT, LEXIZE, OPTION, åñëè çàäàíû, ïåðåêðûâàþò çíà÷åíèÿ ïî óìîë÷àíèþ.
    Äëÿ ïðèìåðà, ñîçäàäèì ñëîâàðü my_simple, êîòîðûé áóäåò àíàëîãè÷åí âñòðîåííîìó ñëîâàðþ simple, íî ñïîñîáåí ðàçëè÷àòü ñòîï-ñëîâà àíãëèéñêîãî ÿçûêà.
    =# CREATE TEXT SEARCH DICTIONARY public.my_simple OPTION 'english.stop' 
    LIKE pg_catalog.simple;
    =# select lexize('public.my_simple','YeS');
     lexize
    --------
     {yes}
    =# select lexize('public.my_simple','The');
     lexize
    --------
     {}
    
    Ïðèìåð ñîçäàíèÿ íîâîãî ñëîâàðÿ ìîæíî ïîñìîòðåòü â Ïðèëîæåíèè.
    DROP TEXT SEARCH DICTIONARY - óäàëÿåò ñëîâàðü
    DROP TEXT SEARCH DICTIONARY [IF EXISTS]dictname [ CASCADE | RESTRICT ];
    
    ALTER TEXT SEARCH DICTIONARY - èçìåíÿåò ïàðàìåòðû ñëîâàðÿ
    ALTER TEXT SEARCH DICTIONARY dictname RENAME TO newdictname;
    
    ALTER TEXT SEARCH DICTIONARY dictname SET OPTION opt_text;
    
    CREATE TEXT SEARCH MAPPING - ñîçäàòü ïðàâèëà îáðàáîòêè òîêåíîâ ñëîâàðÿìè
    CREATE TEXT SEARCH MAPPING ON cfgname FOR tokentypename[, ...] WITH dictname1[, ...];
    
    Äëÿ FTS êîíôèãóðàöèè cfgname çàäàåòñÿ ñîîòâåòñòâèå ìåæäó ñïèñêîì tokentypename1,tokentypename2,... è ñëîâàðÿìè, ÷åðåç êîòîðûå ýòè òîêåíû ýòèõ òèïîâ áóäóò ïðîõîäèòü.
    • tokentypename[, ...] - ñïèñîê òèïîâ òîêåíîâ, íàïðèìåð, lword,lhword,lpart_hword.
    • dictname1[, ...] - ñïèñîê ñëîâàðåé, êîòîðûå áóäóò ïûòàòüñÿ îïîçíàòü òîêåíû. Ïîðÿäîê ñëîâàðåé âàæåí.
    Íàïðèìåð, ñîçäàäèì òåñòîâóþ êîíôèãóðàöèþ testcfg íà îñíîâå øàáëîíà russian_utf8 è çàäàäèì ïðàâèëà îáðàáîòêè àíãëèéñêèõ ñëîâ lhword,lpart_hword,lword.
    =# CREATE TEXT SEARCH CONFIGURATION testcfg LOCALE  'testlocale'  LIKE russian_utf8;
    =# CREATE TEXT SEARCH MAPPING ON testcfg FOR lword,lhword,lpart_hword 
    WITH simple,en_stem;
    =# \dF+ testcfg
    Configuration 'testcfg'
    Parser name: 'default'
    Locale: 'testlocale'
         Token   |  Dictionaries
    -------------+----------------
     lhword      | simple,en_stem
     lpart_hword | simple,en_stem
     lword       | simple,en_stem
    
    ALTER TEXT SEARCH MAPPING - èçìåíèòü ïðàâèëî îáðàáîòêè òîêåíîâ
    ALTER TEXT SEARCH MAPPING ON cfgname FOR tokentypename[, ...] WITH dictname1[, ...];
    
    ALTER TEXT SEARCH MAPPING ON cfgname [FOR tokentypename[, ...] ] 
    REPLACE olddictname TO newdictname;
    
    Ïîçâîëÿåò äîáàâëÿòü íîâûå ïðàâèëà îáðàáîòêè òîêåíîâ èëè èçìåíÿòü ñòàðûå. Èçìåíèì ïðàâèëî äëÿ òîêåíà òèïà lword, ñì. ïðåäûäóùèé ïðèìåð.
    =# ALTER TEXT SEARCH MAPPING ON testcfg FOR lhword WITH simple;
    =# \dF+ testcfg
     Configuration 'testcfg'
    Parser name: 'default'
    Locale: 'testlocale'
     Token  |  Dictionaries
    --------+----------------
     lhword      | simple,en_stem
     lpart_hword | simple,en_stem
     lword       | simple
    
    DROP TEXT SEARCH MAPPING - óäàëèòü ïðàâèëî îáðàáîòêè òîêåíà
    DROP TEXT SEARCH MAPPING [IF EXISTS] ON cfgname FOR tokentypename;
    
    CREATE TEXT SEARCH PARSER - ñîçäàòü FTS ïàðñåð
    CREATE TEXT SEARCH PARSER prsname 
        START= start_function
        GETTOKEN  gettoken_function
        END  end_function
        LEXTYPES  lextypes_function
        [  ts_headline  ts_headline_function ]
    ;
    
    • prsname - èìÿ ñîçäàâàåìîãî ïàðñåðà, ìîæåò ñîäåðæàòü íàçâàíèå ñõåìû, â êîòîðîé îí áóäåò ñîçäàí.
    • start_function - íàçâàíèå ôóíêöèè, êîòîðàÿ èíèöèàëèçèðóåò ïàðñåð.
    • gettoken_function - íàçâàíèå ôóíêöèè, êîòîðàÿ âîçâðàùàåò òîêåí.
    • end_function - íàçâàíèå ôóíêöèè, êîòîðàÿ âûçûâàåòñÿ ïîñëå îêîí÷àíèÿ ðàáîòû ïàðñåðà.
    • lextypes_function - íàçâàíèå ôóíêöèè, êîòîðàÿ âîçâðàùàåò ìàññèâ, ñîäåðæàùèé {id,alias,full descr} - èäåíòèôèêàòîð, êðàòêîå íàçâàíèå òîêåíà è ïîëíîå îïèñàíèå. Ïîäðîáíåå, ñìîòðè â src/include/utils/ts_public.h.
    • ts_headline_function, - íàçâàíèå ôóíêöèè, êîòîðàÿ âîçâðàùàåò ÷àñòü äîêóìåíòà, ñîäåðæàùàÿ çàïðîñ.
    Âñòðîåííûé ïàðñåð íàçûâàåòñÿ default è ðàñïîçíàåò 23 òèïà òîêåíîâ, ñïèñîê êîòîðûõ ìîæíî ïîëó÷èòü ñ ïîìîùüþ ôóíêöèè token_type(prsname). Ïðèìåð ñîçäàíèÿ íîâîãî ïàðñåðà ìîæíî ïîñìîòðåòü â Ïðèëîæåíèè
    DROP TEXT SEARCH PARSER - óäàëèòü FTS ïàðñåð
    DROP TEXT SEARCH PARSER [IF EXISTS] prsname [ CASCADE | RESTRICT ];
    
    ALTER TEXT SEARCH PARSER - èçìåíèòü èìÿ FTS ïàðñåðà
    ALTER TEXT SEARCH PARSER prsname RENAME TO newprsname;
    
    ALTER TEXT SEARCH ... OWNER - èçìåíèòü âëàäåëüöà
    ALTER TEXT SEARCH { PARSER|DICTIONARY|CONFIGURATION } name OWNER TO newowner;
    
    Ïî óìîë÷àíèþ, âëàäåëüöåì FTS îáúåêòà ÿâëÿåòñÿ òîò, êòî ñîçäàë åãî. Êîìàíäà ALTER TEXT SEARCH ... OWNER ïîçâîëÿåò ìåíÿòü âëàäåëüöà.
    COMMENT ON TEXT SEARCH - ñîçäàòü èëè èçìåíèòü êîììåíòàðèé FTS îáúåêòà
    COMMENT ON TEXT SEARCH { CONFIGURATION | DICTIONARY | PARSER }  objname IS text;
    
    • Êîììåíòàðèé âèäåí ïðè èñïîëüçîâàíèè + â êîìàíäå psql, íàïðèìåð, \dFd+ - ïîêàçàòü ðàñøèðåííóþ èíôîðìàöèþ î ñëîâàðÿõ.
    • Äëÿ òîãî ÷òîáû óáðàòü êîììåíòàðèé, íàäî çàäàòü NULL äëÿ ïàðàìåòðà text.
    =# COMMENT ON TEXT SEARCH DICTIONARY intdict IS 'Dictionary for integers';
    

    Áëàãîäàðíîñòè

    Ðàáîòà íàä ñîçäàíèåì ïîëíîòåêñòîâîãî ïîèñêà â PostgreSQL ïîääåðæèâàëàñü Ðîññèéñêèì Ôîíäîì Ôóíäàìåíòàëüíûõ Èññëåäîâàíèé (05-07-90225), EnterprizeDB PostgreSQL Development Fund, Mannheim University, jfg:networks, Georgia Public Library Service, Ðàìáëåð.

    Ññûëêè

    • [PGSQL], "×òî òàêîå PostgreSQL", Î.Áàðòóíîâ, http://www.sai.msu.su/~megera/postgres/talks/what_is_postgresql.html,
      Ñàéò ïðîåêòà, http://www.postgresql.org
    • [GIST], "Íàïèñàíèå ðàñøèðåíèé äëÿ PostgreSQL ñ èñïîëüçîâàíèåì GiST", Î.Áàðòóíîâ, Ô. Ñèãàåâ, http://www.sai.msu.su/~megera/postgres/talks/gist_tutorial.html
    • [RDTREE], "THE RD-TREE: AN INDEX STRUCTURE FOR SETS", Joseph M. Hellerstein, http://epoch.cs.berkeley.edu/postgres/papers/UW-CS-TR-1252.pdf
    • [GIN], "Gin for PostgreSQL", http://www.sai.msu.su/~megera/wiki/Gin,
      "GIN Presentation on PostgreSQL Anniversary Summit, 2006, http://www.sigaev.ru/gin/Gin.pdf
    • [APOD], Astronomical Picture of the Day, http://antwrp.gsfc.nasa.gov/apod/,
      Ðóññêèé ïåðåâîä íà ñàéòå Àñòðîíåò, http://www.astronet.ru/db/apod.html
    • [FTSBOOK], "Full-Text Search in PostgreSQL", O.Bartunov, T.Sigaev, http://www.sai.msu.su/~megera/postgres/fts/doc/
    • [FTSBOOKAPPA], Êðàòêèé ïðèìåð ñîçäàíèÿ ïîëíîòåêñòîâîãî ïîèñêà http://www.sai.msu.su/~megera/postgres/fts/doc/fts-complete-tut.html
    • [FTSBOOKEBUG], Òåñòèðîâàíèå è îòëàäêà ïîëíîòåêñòîâîé êîíôèãóðàöèè http://www.sai.msu.su/~megera/postgres/fts/doc/fts-debug.html
    • [ISPELL], http://ficus-www.cs.ucla.edu/geoff/ispell.html
    • [MYSPELL], http://en.wikipedia.org/wiki/MySpell
    • [HUNSPELL], http://sourceforge.net/projects/hunspell
    • [SNOWBALL], Ïðîåêò Snowball, http://www.tartarus.org
    • [OODICTS], http://wiki.services.openoffice.org/wiki/Dictionaries
    • [RIT2007], Ïðåçåíòàöèÿ íà RIT-2007 http://www.sai.msu.su/~megera/postgres/talks/fts-rit2007.pdf
    • [GINGIST], Gin or GiST ?, http://www.sai.msu.su/~megera/wiki/FTS_Notes
    • [GEVEL], http://www.sai.msu.su/~megera/wiki/Gevel

    Àâòîðû

    Îëåã Áàðòóíîâ è Ôåäîð Ñèãàåâ ÿâëÿþòñÿ ÷ëåíàìè PostgreSQL Global Development Group (ïîääåðæêà è ðàçâèòèå GiST â PostgreSQL), àâòîðàìè èíôîðìàöèîííî-ïîèñêîâîé ñèñòåìû ïî PostgreSQL ðåñóðñàì è çàíèìàþòñÿ ïðîäâèæåíèåì PostgreSQL â Ðîññèè. Îíè ÿâëÿþòñÿ àâòîðàìè ïîëíîòåêñòîâîãî ïîèñêà â PostgreSQL è öåëîãî ðÿäà ïîïóëÿðíûõ ðàñøèðåíèé PostgreSQL, â òîì ÷èñëå, ïîääåðæêà èåðàðõè÷åñêèõ òèïîâ äàííûõ ltree, ðàáîòà ñ öåëî÷èñëåííûìè ìàññèâàìè intarray. Áîëåå ïîäðîáíàÿ èíôîðìàöèÿ äîñòóïíà íà ñòðàíèöå PostgreSQL GiST development.

    PostgreSQL : Документация: 9.6: 16.4. Процедура установки : Компания Postgres Professional

    --with-extra-version=СТРОКА

    Заданная СТРОКА добавляется к номеру версии PostgreSQL. Это можно использовать, например, чтобы двоичные файлы, собранные из промежуточных снимков Git или кода с дополнительными правками, отличались от стандартных дополнительной строкой в версии, например, содержащей идентификатор git describe или номер выпуска дистрибутивного пакета.

    --with-includes=КАТАЛОГИ

    Значение КАТАЛОГИ представляет список каталогов через двоеточие, которые будут просмотрены компилятором при поиске заголовочных файлов. Если дополнительные пакеты (например, GNU Readline) установлены у вас в нестандартное расположение, вам придётся использовать этот параметр и, возможно, также добавить соответствующий параметр --with-libraries.

    Пример: --with-includes=/opt/gnu/include:/usr/sup/include.

    --with-libraries=КАТАЛОГИ

    Значение КАТАЛОГИ представляет список каталогов через двоеточие, в котором следует искать библиотеки. Возможно, вам потребуется использовать этот параметр (и соответствующий --with-includes), если какие-то пакеты установлены у вас в нестандартное размещение.

    Пример: --with-libraries=/opt/gnu/lib:/usr/sup/lib.

    --enable-nls[=ЯЗЫКИ]

    Включает поддержку национальных языков (NLS, Native Language Support), то есть возможность выводить сообщения программы не только на английском языке. Значение ЯЗЫКИ представляет необязательный список кодов языков через пробел, поддержка которых вам нужна, например: --enable-nls='de fr ru'. (Пересечение заданного вами списка и множества действительно доступных переводов будет вычислено автоматически.) Если список не задаётся, устанавливаются все доступные переводы.

    Для использования этой возможности вам потребуется реализация API Gettext; см. выше.

    --with-pgport=НОМЕР

    Задаёт НОМЕР порта по умолчанию для сервера и клиентов. Стандартное значение — 5432. Этот порт всегда можно изменить позже, но если вы укажете другой номер здесь, и сервер, и клиенты будут скомпилированы с одним значением, что очень удобно. Обычно менять это значение имеет смысл, только если вы намерены запускать в одной системе несколько серверов PostgreSQL.

    --with-perl

    Включает поддержку языка PL/Perl на стороне сервера.

    --with-python

    Включает поддержку языка PL/Python на стороне сервера.

    --with-tcl

    Включает поддержку языка PL/Tcl на стороне сервера.

    --with-tclconfig=КАТАЛОГ

    Tcl устанавливает файл tclConfig.sh, содержащий конфигурационные данные, необходимые для сборки модулей, взаимодействующих с Tcl. Этот файл обычно находится автоматически в известном размещении, но если вы хотите использовать другую версию Tcl, вы должны указать каталог, где искать этот файл.

    --with-gssapi

    Включает поддержку аутентификации GSSAPI. На многих платформах подсистема GSSAPI (обычно входящая в состав Kerberos) устанавливается не в то размещение, которое просматривается по умолчанию (например, /usr/include, /usr/lib), так что помимо этого параметра вам придётся задать параметры --with-includes и --with-libraries. Скрипт configure проверит наличие необходимых заголовочных файлов и библиотек, чтобы убедиться в целостности инсталляции GSSAPI, прежде чем продолжить.

    --with-krb-srvnam=ИМЯ

    Задаёт имя по умолчанию для субъекта-службы Kerberos, используемое GSSAPI (по умолчанию это postgres). Обычно менять его имеет смысл только в среде Windows, где оно должно быть задано в верхнем регистре (POSTGRES).

    --with-openssl

    Включает поддержку соединений SSL (зашифрованных). Для этого необходимо установить пакет OpenSSL. Скрипт configure проверит наличие необходимых заголовочных файлов и библиотек, чтобы убедиться в целостности инсталляции OpenSSL, прежде чем продолжить.

    --with-pam

    Включает поддержку PAM (Pluggable Authentication Modules, подключаемых модулей аутентификации).

    --with-bsd-auth

    Включает поддержку аутентификации BSD. (Инфраструктура аутентификации BSD в настоящее время доступна только в OpenBSD.)

    --with-ldap

    Включает поддержку LDAP для проверки подлинности и получения параметров соединения (за дополнительными сведениями обратитесь к Разделу 32.17 и Подразделу 20.3.7). В Unix для этого нужно установить пакет OpenLDAP. В Windows используется стандартная библиотека WinLDAP. Скрипт configure проверит наличие необходимых заголовочных файлов и библиотек, чтобы убедиться в целостности инсталляции OpenLDAP, прежде чем продолжить.

    --with-systemd

    Включает поддержку служебных уведомлений для systemd. Это улучшает интеграцию с системой, когда процесс сервера запускается под управлением systemd, и не оказывает никакого влияния в противном случае; за дополнительными сведениями обратитесь к Разделу 18.3. Для использования этой поддержки в системе должна быть установлена libsystemd с сопутствующими заголовочными файлами.

    --without-readline

    Запрещает использование библиотеки Readline (а также libedit). При этом отключается редактирование командной строки и история в psql, так что этот вариант не рекомендуется.

    --with-libedit-preferred

    Отдаёт предпочтение библиотеке libedit с лицензией BSD, а не Readline (GPL). Этот параметр имеет значение, только если установлены обе библиотеки; по умолчанию в этом случае используется Readline.

    --with-bonjour

    Включает поддержку Bonjour. Для этого Bonjour должен поддерживаться самой операционной системой. Рекомендуется для OS X.

    --with-uuid=БИБЛИОТЕКА

    Собрать модуль uuid-ossp (предоставляющий функции для генерирования UUID. БИБЛИОТЕКА может быть следующей:

    • bsd, чтобы использовались функции получения UUID, имеющиеся во FreeBSD, NetBSD и некоторых других системах на базе BSD

    • e2fs, чтобы использовалась библиотека получения UUID, созданная в рамках проекта e2fsprogs; эта библиотека присутствует в большинстве систем Linux и OS X, также её можно найти и для других платформ.

    • ossp, чтобы использовалась библиотека OSSP UUID

    --with-ossp-uuid

    Устаревший вариант указания --with-uuid=ossp.

    --with-libxml

    Собрать с libxml (включает поддержку SQL/XML). Для этого требуется libxml версии 2.6.23 или новее.

    В составе libxml устанавливается программа xml2-config, с помощью которой можно получить требуемые параметры компилятора и компоновщика. PostgreSQL будет использовать её автоматически, если найдёт. Чтобы указать нестандартное размещение libxml, вы можете воспользоваться переменной окружения XML2_CONFIG и указать в ней путь к программе xml2-config нужной инсталляции, либо задать параметры --with-includes и --with-libraries.

    --with-libxslt

    Использовать libxslt при сборке модуля xml2. Библиотека xml2 задействует её для выполнения XSL-преобразований XML.

    --disable-integer-datetimes

    Отключает применение 64-битных целых для хранения времени и интервалов, чтобы значения даты/времени хранились в виде чисел с плавающей точкой. Числа с плавающей точкой применялись для хранения дат/времени по умолчанию в PostgreSQL до версии 8.4, но сейчас этот вариант считается устаревшим, так как с ним не поддерживается точность до микросекунд во всём диапазоне значений timestamp. Однако для хранения таких значений в целочисленном виде требуется поддержка целочисленного 64-битного типа. Поэтому прежний вариант может использоваться, когда такой тип не поддерживается или для совместимости с приложениями, написанными для предыдущих версий PostgreSQL. Подробнее об этом можно узнать в Разделе 8.5.

    --disable-float4-byval

    Запрещает передачу типа float4 «по значению», чтобы он передавался «по ссылке». Это снижает быстродействие, но может быть необходимо для совместимости со старыми пользовательскими функциями на языке C, которые используют соглашение о вызовах «версии 0». В качестве более долгосрочного решения лучше модернизировать такие функции, чтобы они использовали соглашение «версии 1».

    --disable-float8-byval

    Запрещает передачу типа float8 «по значению», чтобы он передавался «по ссылке». Это снижает быстродействие, но может быть необходимо для совместимости со старыми пользовательскими функциями на языке C, которые используют соглашение о вызовах «версии 0». В качестве более долгосрочного решения лучше модернизировать такие функции, чтобы они использовали соглашение «версии 1». Заметьте, что этот параметр влияет не только на float8, но и на int8, а также некоторые другие типы, например timestamp. На 32-битных платформах параметр --disable-float8-byval действует по умолчанию и задать --enable-float8-byval нельзя.

    --with-segsize=РАЗМЕР_СЕГМЕНТА

    Задаёт размер сегмента (в гигабайтах). Сервер делит большие таблицы на несколько файлов в файловой системе, ограничивая размер каждого данным размером сегмента. Это позволяет обойти ограничения на размер файлов, существующие на многих платформах. Размер сегмента по умолчанию, 1 гигабайт, безопасен для всех поддерживаемых платформ. Если же ваша операционная система поддерживает «большие файлы» (а сегодня это поддерживают почти все), вы можете установить больший размер сегмента. Это позволит уменьшить число файловых дескрипторов, используемых при работе с очень большими таблицами. Но будьте осторожны, чтобы выбранное значение не превысило максимум, поддерживаемый вашей платформой и файловыми системами, которые вы будете применять. Возможно, допустимый размер файла будет ограничиваться и другими утилитами, которые вы захотите использовать, например tar. Рекомендуется, хотя и не требуется, чтобы это значение было степенью 2. Заметьте, что при изменении значения требуется выполнить initdb.

    --with-blocksize=РАЗМЕР_БЛОКА

    Задаёт размер блока (в килобайтах). Эта величина будет единицей хранения и ввода/вывода данных таблиц. Значение по умолчанию, 8 килобайт, достаточно универсально; но в особых случаях может быть оправдан другой размер блока. Это значение должно быть степенью 2 от 1 до 32 (в килобайтах). Заметьте, что при изменении значения требуется выполнить initdb.

    --with-wal-segsize=РАЗМЕР_СЕГМЕНТА

    Задаёт размер сегмента WAL (в мегабайтах). Эта величина определяет размер каждого отдельного файла журнала WAL. Изменять этот размер бывает полезно для оптимизации фрагментации при трансляции журналов. Значение по умолчанию — 16 мегабайт. Значение должно задаваться степенью 2 от 1 до 64 (в мегабайтах). Заметьте, что при изменении значения требуется выполнить initdb.

    --with-wal-blocksize=РАЗМЕР_БЛОКА

    Задаёт размер блока WAL (в килобайтах) Эта величина будет единицей хранения и ввода/вывода записей WAL. Значение по умолчанию, 8 килобайт, достаточно универсально; но в особых случаях может быть оправдан другой размер блока. Это значение должно быть степенью 2 от 1 до 64 (в килобайтах). Заметьте, что при изменении значения требуется выполнить initdb.

    --disable-spinlocks

    Позволяет провести сборку, если PostgreSQL не может воспользоваться циклическими блокировками CPU на данной платформе. Отсутствие таких блокировок приводит к снижению производительности, поэтому использовать этот вариант следует, только если сборка прерывается и выдаётся сообщение, что ваша платформа эти блокировки не поддерживает. Если вы не можете собрать PostgreSQL на вашей платформе без этого указания, сообщите о данной проблеме разработчикам PostgreSQL.

    --disable-thread-safety

    Отключает потокобезопасное поведение клиентских библиотек. При этом параллельные потоки программ на базе libpq и ECPG не будут безопасно контролировать собственные дескрипторы соединений.

    --with-system-tzdata=КАТАЛОГ

    В PostgreSQL включена собственная база данных часовых поясов, необходимая для операций с датой и временем. На самом деле эта база данных совместима с базой часовых поясов IANA, поставляемой в составе многих операционных систем FreeBSD, Linux, Solaris, поэтому устанавливать её дополнительно может быть излишне. С этим параметром вместо базы данных, включённой в пакет исходного кода PostgreSQL, будет использоваться системная база данных часовых поясов, находящаяся в заданном КАТАЛОГЕ. КАТАЛОГ должен задаваться абсолютным путём (в ряде операционных систем принят путь /usr/share/zoneinfo). Заметьте, что процедура установки не будет проверять несоответствия или ошибки в данных часовых поясов. Поэтому, используя этот параметр, рекомендуется выполнить регрессионные тесты, чтобы убедиться, что выбранная вами база данных часовых поясов работает корректно с PostgreSQL.

    Этот параметр в основном предназначен для тех, кто собирает двоичные пакеты для дистрибутивов и хорошо знает свою операционную систему. Основной плюс от использования системных данных в том, что пакет PostgreSQL не придётся обновлять при изменениях местных определений часовых поясов. Ещё один плюс заключается в упрощении кросс-компиляции, так как при инсталляции не требуется собирать базу данных часовых поясов.

    --without-zlib

    Запрещает использование библиотеки Zlib. При этом отключается поддержка сжатых архивов утилитами pg_dump и pg_restore. Этот параметр предназначен только для тех редких систем, в которых нет этой библиотеки.

    --enable-debug

    Включает компиляцию всех программ и библиотек с отладочными символами. Это значит, что вы сможете запускать программы в отладчике для анализа проблем. При такой компиляции размер установленных исполняемых файлов значительно увеличивается, а компиляторы, кроме GCC, обычно отключают оптимизацию, что снижает быстродействие. Однако, наличие отладочных символов очень полезно при решении возможных проблем любой сложности. В настоящее время рекомендуется использовать этот параметр для производственной среды, только если применяется компилятор GCC. Но если вы занимаетесь разработкой или испытываете бета-версию, его следует использовать всегда.--enable-coverage

    При использовании GCC все программы и библиотеки компилируются с инструментарием, оценивающим покрытие кода тестами. Если его запустить, в каталоге сборки будут сформированы файлы с метриками покрытия кода. За дополнительными сведениями обратитесь к Разделу 31.5. Этот параметр предназначен только для GCC и только для использования в процессе разработки.

    --enable-profiling

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

    --enable-cassert

    Включает для сервера проверочные утверждения, проверяющие множество условий, которые «не должны происходить». Это бесценно в процессе разработке кода, но эти проверки могут значительно замедлить работу сервера. Кроме того, включение этих проверок н

    postgrespro.ru

    PostgreSQL - установка и базовая настройка

    PostgreSQL - мощная свободная объектно-реляционная система управления базами данных (СУБД). Базируется на языке SQL и поддерживает многие из возможностей стандарта SQL:2003.

    Основные преимущества PostgreSQL:

    • поддержка БД практически неограниченного размера;
    • мощные и надёжные механизмы транзакций и репликации;
    • расширяемая система встроенных языков программирования;
    • масштабируемость.

    Выполним установку из системы портов:

    # cd /usr/ports/databases/postgresql92-server && make install clean && rehash

    Опции сборки все оставил по умолчанию.

    По завершению установки, порт вывел короткие рекомендации по дальнейшей настройке:

    For procedural languages and postgresql functions, please note that you might have to update them when updating the server. If you have many tables and many clients running, consider raising kern.maxfiles using sysctl(8), or reconfigure your kernel appropriately. The port is set up to use autovacuum for new databases, but you might also want to vacuum and perhaps backup your database regularly. There is a periodic script, /usr/local/etc/periodic/daily/502.pgsql, that you may find useful. You can use it to backup and perfom vacuum on all databases nightly. Per default, it perfoms `vacuum analyze'. See the script for instructions. For autovacuum settings, please review ~pgsql/data/postgresql.conf. To allow many simultaneous connections to your PostgreSQL server, you should raise the SystemV shared memory limits in your kernel. Here are example values for allowing up to 180 clients (configurations in postgresql.conf also needed, of course): options SYSVSHM options SYSVSEM options SYSVMSG options SHMMAXPGS=65536 options SEMMNI=40 options SEMMNS=240 options SEMUME=40 options SEMMNU=120 If you plan to access your PostgreSQL server using ODBC, please consider running the SQL script /usr/local/share/postgresql/odbc.sql to get the functions required for ODBC compliance. Please note that if you use the rc script, /usr/local/etc/rc.d/postgresql, to initialize the database, unicode (UTF-8) will be used to store character data by default. Set postgresql_initdb_flags or use login.conf settings described below to alter this behaviour. See the start rc script for more info. To set limits, environment stuff like locale and collation and other things, you can set up a class in /etc/login.conf before initializing the database. Add something similar to this to /etc/login.conf: --- postgres:\ :lang=en_US.UTF-8:\ :setenv=LC_COLLATE=C:\ :tc=default: --- and run `cap_mkdb /etc/login.conf'. Then add 'postgresql_class="postgres"' to /etc/rc.conf. ====================================================================== To initialize the database, run /usr/local/etc/rc.d/postgresql initdb You can then start PostgreSQL by running: /usr/local/etc/rc.d/postgresql start For postmaster settings, see ~pgsql/data/postgresql.conf NB. FreeBSD's PostgreSQL port logs to syslog by default See ~pgsql/data/postgresql.conf for more info ====================================================================== To run PostgreSQL at startup, add 'postgresql_enable="YES"' to /etc/rc.conf ===> Installing rc.d startup script(s) ===> Correct pkg-plist sequence to create group(s) and user(s) ===> Registering installation for postgresql-server-9.2.b4 ===> SECURITY REPORT: This port has installed the following files which may act as network servers and may therefore pose a remote security risk to the system. /usr/local/bin/postgres This port has installed the following startup scripts which may cause these network services to be started at boot time. /usr/local/etc/rc.d/postgresql If there are vulnerabilities in these programs there may be a security risk to the system. FreeBSD makes no guarantee about the security of ports included in the Ports Collection. Please type 'make deinstall' to deinstall the port if this is a concern. For more information, and contact details about the security status of this software, see the following webpage: http://www.postgresql.org/

    Поскольку PostgreSQL использует кодировку UTF-8 по умолчанию, для избежания проблем в дальнейшем, последуем совету и для пользователя pgsql (в новых версиях PostgreSQL работает от имени пользователя pgsql, а не postgres) немного подкорректируем локаль. Для этого в внесем такой блок в файл /etc/login.conf:

    pgsql:\        :lang=en_US.UTF-8:\        :setenv=LC_COLLATE=C:\        :tc=default:

    Далее:

    # cap_mkdb /etc/login.conf

    Базы данных будем размещать в каталоге /var/db/pgsql. Соответственно создадим необходимый каталог и выставим права доступа:

    # mkdir /var/db/pgsql# chown pgsql:pgsql /var/db/pgsql

    Вносим изменения в rc.conf, указывая каталог хранения данных. Ну и добавим запуск PostgreSQL при старте системы:

    # echo '# PostgreSQL' >> /etc/rc.conf# echo 'postgresql_enable="YES"' >> /etc/rc.conf# echo 'postgresql_data="/var/db/pgsql"' >> /etc/rc.conf# echo 'postgresql_class="postgres"' >> /etc/rc.conf

    После этих манипуляций выполним инициализацию базы данных:

    # /usr/local/etc/rc.d/postgresql initdb

    Скрипт по ходу своей работы будет выводить сообщения на консоль. Пример такого вывода:

    The files belonging to this database system will be owned by user "pgsql". This user must also own the server process. The database cluster will be initialized with locale "C". The default text search configuration will be set to "english". fixing permissions on existing directory /var/db/pgsql ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 32MB creating configuration files ... ok creating template1 database in /var/db/pgsql/base/1 ... ok initializing pg_authid ... ok initializing dependencies ... ok creating system views ... ok loading system objects' descriptions ... ok creating collations ... not supported on this platform creating conversions ... ok creating dictionaries ... ok setting privileges on built-in objects ... ok creating information schema ... ok loading PL/pgSQL server-side language ... ok vacuuming database template1 ... ok copying template1 to template0 ... ok copying template1 to postgres ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: /usr/local/bin/postgres -D /var/db/pgsql or /usr/local/bin/pg_ctl -D /var/db/pgsql -l logfile start

    После инициализации БД запускаем PostgreSQL сервер:

    # sh /usr/local/etc/rc.d/postgresql start

    После запуска проверяем состояние сервера:

    # sh /usr/local/etc/rc.d/postgresql statuspg_ctl: server is running (PID: 30752)/usr/local/bin/postgres "-D" "/var/db/pgsql"

    Что ж, PostgreSQL сервер запущен и работает... Однако, в настройках по умолчанию сервер сконфигурирован так, что к нему можно подключиться с локального хоста без пароля. Это явная дыра в безопасности, поэтому попытаемся исправить ситуацию.

    Сервер PosgreSQL предоставляет два варианта управления  пользователями и базами данных:

    • утилиты коммандной строки (createuser, createdb, dropuser, dropdb... )
    • интерактивный терминал

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

    # psql -U pgsql template1

    psql (9.2beta4)Введите "help", чтобы получить справку.

    template1=#

    Наберем команду help и ознакомимся со справкой:

    template1=# help

    Вы используете psql - интерфейс командной строки к PostgreSQL. Азы: \copyright - условия распространения \h - справка по операторам SQL \? - справка по командам psql \g или ; в конце строки - выполнение запроса \q - выход

    Советую ознакомиться со справкой по операторам SQL и командам psql. Теперь создадим тестового пользователя и базу данных, к которой он будет иметь доступ.

    template1=# CREATE USER username;CREATE ROLE

    Проверим список ролей:

    template1-# \du

    Список ролей Имя роли | Атрибуты | Член ролей ----------+---------------------------------------------------------+------------ pgsql | Суперпользователь, Создаёт роли, Создаёт БД, Репликация | {} username | | {}

    Повысим созданному пользователю права доступа:

    template1=# ALTER USER username superuser createrole createdb;ALTER ROLE

    Повторно проверим список ролей:

    template1=# \du

    Список ролей Имя роли | Атрибуты | Член ролей ----------+---------------------------------------------------------+------------ pgsql | Суперпользователь, Создаёт роли, Создаёт БД, Репликация | {} username | Суперпользователь, Создаёт роли, Создаёт БД | {}

    Обычному пользователю такие права ни к чему, их стоит выдавать только администратору системы. Отменим определенные права доступа:

    template1=# ALTER USER username nosuperuser nocreaterole nocreatedb;ALTER ROLE

    А вот пароли для пользователя - вещь обязательная. Зададим пароль для созданного пользователя:

    template1=# \password usernameВведите новый пароль:Повторите его:

    При вводе пароль не отображается! Также стоит установить пароль для пользователя pgsql. После этого включаем проверку пароля при подключении к PostgreSQL-серверу. Неоходимо внести изменения в файл /var/db/pgsql/pg_hba.conf. Метод подключения trust необходимо изменить на md5 (также полностью удаляем строку для IPv6). В результате имеем такой результат:

    # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 127.0.0.1/32 md5

    Для того, чтобы изменения вступили в силу, необходимо перезапустить PostgreSQL-сервер:

    # sh /usr/local/etc/rc.d/postgresql restart

    Повторно подключаемся к интерактивной оболочке:

    # psql -U pgsql template1Пароль пользователя pgsql:psql (9.2beta4)Введите "help", чтобы получить справку.

    template1=#

    Теперь сервер при подключении запрашивает пароль. Ну и напоследок создадим базу данных и дадим на нее права пользователю username. Сделать это можно двумя способами.

    Первый способ:

    template1=# CREATE DATABASE userdb owner=username;CREATE DATABASE

    Второй способ:

    template1=# CREATE DATABASE userdb;CREATE DATABASEtemplate1=# ALTER DATABASE userdb owner to username;ALTER DATABASE

    Просмотрим список имеющихся баз данных:

    template1=# \l

    Список баз данных Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | Права доступа -----------+----------+-----------+------------+----------+----------------- postgres | pgsql | UTF8 | C | C | template0 | pgsql | UTF8 | C | C | =c/pgsql + | | | | | pgsql=CTc/pgsql template1 | pgsql | UTF8 | C | C | =c/pgsql + | | | | | pgsql=CTc/pgsql userdb | username | UTF8 | C | C | (4 строки)

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

    Последний штрих - тюнинг PostgreSQL-сервера. Все основные настройки хранятся в файле /var/db/pgsql/postgresql.conf. Отметим опции, на которые стоит обратить внимание (перевод описания опций взят здесь):

    • max_connections - максимальное количество одновременных подключений к серверу БД. Используйте этот параметр, чтобы не допустить запуска большого количества процессов сервера. Иначе есть вероятность, что серер БД исчерпает весь объем ОЗУ и будет активно использоваться подкачка, что в свою очередь повлечет за собой падение производительности.
    • shared_buffers - объем разделяемой памяти, используемый сервером БД. По умолчанию - 32 Мб, но может быть меньше, если настройки вашего ядра не позволяют выделить такой объем памяти, определяется при инициализации кластера БД утилитой initdb. Большие значения этого параметра положительно сказываются на производительности сервера БД.Если у вас выделенный компьютер с ОЗУ 1 Гб и больше под сервер БД, то хорошим значением этой переменной будет 25% от объема памяти. При большой нагрузке даже большие значения этого параметра могут быть эффективными, но так как PostgreSQL полагается на кэш ОС, то выделение более 40% от объема памяти вряд ли имеет смысл. Для больших значений этого параметра требуется так же увеличить значение параметра checkpoint_segments.На системах с ОЗУ меньше 1 Гб правильнее будет использовать меньший объем памяти (чем 25%), чтобы не исчерпать весь объем оперативной памяти. На винде большие значения этого параметра могут оказаться эффективными. Вы можете добиться большей производительности сохраняя это значение маленьким и больше используя средства кэширования ОС. Хорошим диапазоном значений для Windows является 64-512 Мб.
    • temp_buffers - максимальный размер временных буферов для каждой сессии. Эта память используется только локально в сессии для временных таблиц. По умолчанию - 8 МБ. Значение может быть изменено во время сессии, но только до первого использования этой памяти.
    • max_prepared_transactions - максимальное количество "prepared" транзакций (смотрите описание SQL команды PREPARE TRANSACTION в документации). Чтобы отключить эту фишку, поставьте значение в 0.
    • work_mem - определяет объем памяти, который будет использоваться внутренними операциями сортировки и хэш-таблицами прежде, чем переключиться на временные дисковые файлы. Учтите, что для сложных запросов несколько внутренних операций сортировки и работа с хэш-таблицами могут работать параллельно (одновременно). Кроме того, несколько сессий могут делать такие операции одновременно. В итоге необходимый объем памяти для этих операций может в несколько раз превышать значение параметра work_mem. Учтите это при выборе значения для этого параметра. Под внутренними операциями сортировки подразумевается - ORDER BY, DISTINCT и слияния.
    • maintenance_work_mem - максимальный объем памяти, используемый для внутренних операций, таких как VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY. По умолчанию - 16 Мб. Эти команды выполняются только во во время сессии, так что можно выбирать большие значения для этого параметра, чем для параметра work_mem. Большие значения могут положительно сказаться на производительности vacuuming и скорости восстановления БД из дампа. Только учтите, что процесс autovacuum запускается autovacuum_max_workers раз, поэтому может потребоваться больше свободной памяти.
    • max_stack_depth - максимальная глубина стека. Хорошим значением этого параметра является максимально разрешенная глубина стека в системе.
    • max_fsm_pages - с помощью этого параметра можно управлять картой свободного пространства. Когда что-то удаляется из таблицы, то место занимаемое этим что-то не освобождается на диске, вместо этого занимаемое место просто помечается как "свободно" в карте свободного пространства. Потом это место используется для новых записей. Если на вашем сервере очень много удаляется/добавляется данных из/в таблицы, то большие значения этого параметра могут положительно сказаться на производительности. 

    muff.kiev.ua