Настройки sphinx + Drupal

yum

yum install sphinx
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
apt-get install sphinx
wget http://sphinxsearch.com/files/sphinx-2.0.3-release.tar.gz
checkinstall
cd ./api/libsphinxclient
dh_make -s -n -p libsphinxclient_2.0.3
dpkg-buildpackage

./configure

./configure --prefix=/usr --sbindir=/usr/sbin/sphinx

PPA

Repositories

deb http://ppa.launchpad.net/builds/sphinxsearch-stable/ubuntu precise main
deb-src http://ppa.launchpad.net/builds/sphinxsearch-stable/ubuntu precise main
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9D8946B16932B16

Sphinx config

source source_main0
{
        type                            = xmlpipe
        xmlpipe_command                 = /usr/bin/wget -O - -q -t 1 http://site.com/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=0\&first_nid=0\&last_nid=49999
}
source source_main1 : source_main0
{
        xmlpipe_command             = /usr/bin/wget -O - -q -t 1 http://site.com/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=1\&first_nid=50000
}
  

source source_delta : source_main0
{
  xmlpipe_command			= /usr/bin/wget -O - -q -t 1 http://site.com/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=delta
}
  
  
index index_main0
{
        source                                  = source_main0
        path                                    = /var/www/vhosts/site.com/sphinxsearch/main0
        docinfo                                 = extern
        morphology                              = stem_ru
        charset_type                            = utf-8
        charset_table                           = 0..9, A..Z->a..z, _, a..z, U 410..U 42F->U 430..U 44F, U 430..U 44F
        min_word_len                            = 1
        html_strip                              = 0
       # agent                                  = /home/user/sphinx/socket/sphinx.s
}

index index_main1 : index_main0
{
        source                                  = source_main1
        path                                    = /var/www/vhosts/site.com/sphinxsearch/main1
}

index index_join
{
        type                                    = distributed
        local                                   = index_main0
        local                                   = index_main1
        local                                   = source_delta
}

indexer
{
#       mem_limit                               = 1024M
#       write_buffer                            = 4M
        mem_limit                               = 32M
}

searchd
{
        #listen                          = /home/user/sphinx/socket/sphinx.s
        #listen                          = localhost:3312
        port                            = 3312
        log                             = /var/log/sphinx/searchd.log
        query_log                       = /var/log/sphinx/query.log
        read_timeout                    = 5
        max_children                    = 30
        pid_file                        = /var/run/sphinx/searchd.pid
        max_matches                     = 1000
        seamless_rotate                 = 1
        preopen_indexes                 = 1
        unlink_old                      = 1
}
Для индексации используется XML pipe

Построение delta

/usr/bin/wget -O - -q -t 1  http://site.com/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=delta

Indexer server

  • indexer --config /etc/sphinx/drupal.conf --all
  • searchd --config /etc/sphinx/drupal.conf
  • indexer --config /etc/sphinx/drupal.conf --rotate source_delta
  • indexer --config /etc/sphinx/drupal.conf --merge index_main0 source_delta --rotate
  • indexer --config /etc/sphinx/drupal.conf --merge index_main0 source_delta --merge-dst-range deleted 0 0

Модуль Drupal

src: http://drupal.org/project/sphinxsearch

остальные модули

sphinxsearch.xmlpipe.inc

32 битная
function sphinxsearch_ip_check_cidr($ip, $cidr) {
  list($net, $mask) = explode('/', $cidr);
  $ip_net = ip2long($net);
  $ip_mask = ~((1 << (32 - $mask)) - 1);
  $ip_ip = ip2long($ip);
  $ip_ip_net = $ip_ip & $ip_mask;
  #watchdog('sphinxsearch', "$ip_ip_net == $ip_net", NULL, WATCHDOG_ERROR);
  return ($ip_ip_net == $ip_net);
}
32-64 битная
function sphinxsearch_ip_check_cidr($ip, $cidr) {
  list($net, $mask) = explode('/', $cidr);
  $ip_net = ip2long($net);
  $ip_mask = ~((1 << ((PHP_INT_SIZE==8 ? 64 : 32) - $mask)) - 1);
  $ip_ip = ip2long($ip);
  $ip_ip_net = $ip_ip & $ip_mask;
  #watchdog('sphinxsearch', "$ip_ip_net == $ip_net", NULL, WATCHDOG_ERROR);
  return ($ip_ip_net == $ip_net);
}

Обязательные нстройки

sphinx - centos

#!/bin/sh
#
# sphinx searchd Free open-source SQL full-text search engine
#
# chkconfig:   - 20 80
# description: Starts and stops the sphinx searchd daemon that handles \
#              all search requests.

### BEGIN INIT INFO
# Provides: searchd
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Should-Start: $remote_fs
# Should-Stop: $remote_fs
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: start and stop sphinx searchd daemon
# Description: Sphinx is a free open-source SQL full-text search engine
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

exec="/usr/bin/searchd"
prog="searchd"
config="/etc/sphinx/drupal.conf"

lockfile=/var/lock/subsys/searchd

start() {
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    # if not running, start it up here, usually something like "daemon $exec"
    daemon $exec --config $config
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    # stop it here, often "killproc $prog"
    killproc $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    stop
    start
}

reload() {
    restart
}

force_reload() {
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?