bsd$ sudo pkg install -y sphinxsearch

Установка актуальной версии вызвала конфликт с mysql55-client, пришлось обновить MySQL до версии 5.6 и переписать в index.php подключение к базе данных через mysqli

Кроме того, sphinxsearch запускался с предупреждением о том, что необходимо включить опцию ID64, пришлось собирать из портов

bsd$ whereis -s sphinxsearch

sphinxsearch: /usr/ports/textproc/sphinxsearch

bsd$ sudo make -C /usr/ports/textproc/sphinxsearch config

bsd$ sudo make -C /usr/ports/textproc/sphinxsearch -D BATCH install clean

bsd$ rehash

Для включения леммонайзера потребуются словари, взять их можно с официального сайта

bsd$ sudo mkdir -p /usr/local/share/sphinx/dicts

bsd$ cd /usr/local/share/sphinx/dicts

bsd$ sudo wget http://sphinxsearch.com/files/dicts/ru.pak

bsd$ sudo wget http://sphinxsearch.com/files/dicts/en.pak

bsd$ sudo chown _sphinx:_sphinx /usr/local/share/sphinx

В базе с кодировкой koi8r_general_ci поиск по русским словам наладить не получилось, пришлось переделать на utf8_general_ci (см. файл конфигурации ниже)

bsd$ grep -ve '^[[:space:]]*\(#\|$\)' /usr/local/etc/sphinx.conf

source freebsd_howto

{

sql_query_pre = SET NAMES utf8

sql_query = SELECT id, title, content, href FROM documents

sql_attr_string = href

sql_attr_string = title

}

source freebsd_howto-throttled : freebsd_howto

{

sql_ranged_throttle = 100

}

index freebsd_howto

{

source = freebsd_howto

path = /var/db/sphinxsearch/data/freebsd_howto

morphology = lemmatize_ru,lemmatize_en

min_word_len = 3

html_strip = 1

}

index freebsd_howto_stemmed : freebsd_howto

{

path = /var/db/sphinxsearch/data/stemmed

morphology = lemmatize_ru, lemmatize_en

}

searchd

{

log = /var/log/sphinxsearch/searchd.log

query_log = /var/log/sphinxsearch/sphinx-query.log

collation_server = utf8_general_ci

collation_libc_locale = ru_RU.UTF-8

}

common

{

lemmatizer_base = /usr/local/share/sphinx/dicts

}

Для запуска sphinxsearch требуется предварительно создать директории для ведения логов и файлов индексов

bsd$ sudo mkdir -p /var/db/sphinxsearch/data

bsd$ sudo chown _sphinx:_sphinx /var/db/sphinxsearch/data

bsd$ sudo mkdir -p /var/log/sphinxsearch

bsd$ sudo chown _sphinx:_sphinx /var/log/sphinxsearch

bsd$ sudo mkdir -p /var/run/sphinxsearch

bsd$ sudo chown _sphinx:_sphinx /var/run/sphinxsearch

Теперь можно создать файлы индексов и запустить даемона

bsd$ sudo indexer --all --config /usr/local/etc/sphinx.conf

bsd$ echo 'sphinxsearch_enable="YES"' | sudo tee -a /etc/rc.conf

sphinxsearch_enable="YES"

bsd$ sudo /usr/local/etc/rc.d/sphinxsearch start

Запущенный сервис обязан слушать входящие подключения

bsd$ sockstat -4l | egrep '[s]phinx'

_sphinxsearchd12757tcp4*:9312*:*
_sphinxsearchd12758tcp4*:9306*:*

При запущенном searchd обновление индексов производить с ключом --rotate


bsd$ sudo indexer --all --config /usr/local/etc/sphinx.conf --rotate

Листинг index.php


<?php $m_path = explode('/',$_SERVER[REQUEST_URI]); $m_target = 'index.php'; $ix = 1; while($m_path[$ix]!='') { $m_breadcrumb[$ix] = $m_path; $m_target = $m_path[$ix++]; } $m_site_header = 'Tamed the daemon'; $link = mysqli_connect( 'localhost','bsd235','','bsd235'); if (!$link) die('Could not connect: ' . mysqli_error()); mysqli_set_charset($link,'utf8'); mysqli_change_user($link,'bsd235','bsd235'); if(!$link) die ('Can\'t use bsd235 : ' . mysqli_error()); $result = $link->query('SELECT title FROM documents WHERE href="' . $m_target . '"'); if (!$result) die('Invalid query: ' . mysql_error() . ""); while ( $row = mysqli_fetch_assoc( $result ) ) $m_site_header = $row['title']; include './header.php' echo( '<div id="all-pages" style="text-align: justify;">'); $mm_target = $m_target; if($mm_target == 'search'){ echo '<div style="float: left; width: 70%;">'; $mm_target = 'index.php'; } $result = $link->query ( 'SELECT content FROM documents WHERE href = \'' . $mm_target . '\''); if (!$result) die('Invalid query: ' . mysql_error() . ""); while ( $row = mysqli_fetch_assoc( $result ) ) echo( $row['content']); mysqli_close($link); if($m_target == 'search'){ include './search.php'; } echo( '</div>'); include './footer.php'?>

Листинг search.php


<?php $search = $_POST['search']; $link = mysqli_connect('localhost:9306', 'root','','main'); if (!$link) die('Could not connect: ' . mysqli_error()); $result = $link->query ( 'SELECT id, title, href FROM freebsd_howto_stemmed \ WHERE MATCH(\'' . $search .'\') option ranker = proximity'); if (!$result) die('Invalid query: ' . mysqli_error() . ""); echo('</div><div style="float: right; width: 30%;"><p style="background: #f3f3f3; margin-top: 0;">Результаты поиска</p>'); while ( $row = mysqli_fetch_assoc( $result ) ){ echo '<p style="margin: 0 0 0;"><a href="' . $row['href'] . '">' . $row['title'] . '</a></p>'; } mysql_close($link); echo('</div><div style="clear: both;"></div>');?>

FreeBSD 10.0-RELEASE: Wed Jul 8 19:38:48 YEKT 2015