{{tag>drupal cms}}

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

**Документация:**
  * http://sphinxsearch.com/docs/manual-0.9.9.html
  * http://sphinxsearch.com/docs/2.0.1

===== Инсталяция =====

==== 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 ===

<code>
./configure --prefix=/usr --sbindir=/usr/sbin/sphinx
</code>

==== PPA ====

Repositories
<code>
deb http://ppa.launchpad.net/builds/sphinxsearch-stable/ubuntu precise main
deb-src http://ppa.launchpad.net/builds/sphinxsearch-stable/ubuntu precise main
</code>

<code>
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9D8946B16932B16
</code>

======= Sphinx config =======


===== drupal.conf =====


  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
  }

<note tip>Для индексации используется XML pipe</note>

====== Построение 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

  * http://highload.com.ua/index.php/2009/06/25/%D0%B4%D0%B5%D0%BB%D1%8C%D1%82%D0%B0-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81-%D0%B2-sphinx
  * http://highload.com.ua/index.php/2009/11/30/sphinxsearch-index-merging

========= Модуль Drupal ======

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

**остальные модули**
  * http://drupal.org/project/sphinx

**sphinxsearch.xmlpipe.inc**

<note tip>32 битная</note>

  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);
  }


<note tip>32-64 битная</note>

  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);
  }

===== Настройки модуля =====

{{::2011_11_01_02-17-35-033.jpg?200 |}}
{{::2011_11_01_02-19-57-034.jpg?200 |}}

<note important>Обязательные нстройки</note>

===== Запуск демона =====

**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 $?

===== Ссылки =====

  * http://sphinxsearch.com/forum/forum.html?id=2
  * [[http://blog.tty.nl/2010/02/09/distributed-index-setup-sphinx/|A distributed index setup for Sphinx]]
