18 / 04 / 2017 Developers

Sphinx Search Engine + Symfony

Kontynuując poprzedni artykuł przebrniemy przez proces instalacji i integracji Sphinxa z Symfony pod Windowsem.

Instalacja Sphinxa

Najpierw musimy zainstalować silnik. Można go pobrać z oficjalnej strony.

Konfiguracja Sphinxa

W składnikach zainstalowanego silnika posiadamy pliki między innymi sphinx.conf.in, który przedstawia przykład konfiguracji indeksów. Można skonfigurować na jego podstawie lub tworzyć nowy sphinx.conf. Plik zawiera informacje o tym co indeksować oraz informacje o samym daemonie sphinxa.

Struktura

  • source – jest to źródło danych na których podstawie sphinx oblicza swoje indeksy.
  • index – informacje o samym indeksie, jego parametry, gdzie ma zostać zapisany oraz źródło danych
  • indexer – konfiguracja indexera,
  • searchd – konfiguracja daemona
source productIndex
{
  type			= mysql
  sql_host		= localhost
  sql_user		= db_user
  sql_pass		= db_password
  sql_db			= nazwa_bazy
  sql_port		= 3306

  sql_query		= SELECT id as 'id', name, description, 'product' as 'index_name' FROM product
  sql_attr_string = index_name
  
}


index product
{
  source			= productIndex
  path			= C:/Sphinx/data/product
  min_infix_len 	= 3
  expand_keywords	= 1
}



indexer
{
  mem_limit		= 128M
}


searchd
{
  listen			= 9312
  listen			= 9306:mysql41
  log			= C:/Sphinx/log/searchd.log
  query_log		= C:/Sphinx/log/query.log
  read_timeout		= 5
  max_children		= 30
  pid_file		= C:/Sphinx/log/searchd.pid
  seamless_rotate		= 1
  preopen_indexes		= 1
  unlink_old		= 1
  workers			= threads # for RT to work
  binlog_path		= C:/Sphinx/data

}

 

Stworzyliśmy tutaj index na rekord z tabeli product, wyciągamy dane (stringi) z kolumn ‘name’ oraz ‘description’. Nasz index nazywa się ‘product’. Dane o nim zostaną zapisane w C:/Sphinx/data w plikach z prefixem ‘product’.  Następnie aby stworzyć taki index fizycznie, odpalamy konsolę, wchodzimy do lokalizacji zainstalowanego Sphinxa (C:\Sphinx) oraz odpalamy bin\indexer –rotate –allJeżeli nie pojawiają się błędy, sprawdzamy czy w katalogu data stworzyliśmy poprawnie indeksy. Następnie aby mieć do nich dostęp musimy włączyć sam silnik komendą bin\searchd –config sphinx.conf (plik sphinx.conf znajduje się dokładnie tu gdzie my w konsoli, jeśli jest w innym miejscu, tutaj ścieżka).

Konfiguracja Symfony

  1. Instalacja AkumaI\SphinxsearchBundle\SphinxsearchBundle
  2. Instalujemy Bundle do obsługi Sphinxa.
  3. Do config.yml naszej aplikacji dopisujemy:
sphinxsearch:
    searchd:
        host: localhost
        port: 9312 
    indexes:
        product: "AppBundle:Product"

W tym momencie daliśmy do zrozumienia naszej aplikacji że rekordy znalezione pod indexem ‘product’ będą obiektami klasy Product z AppBundle.

Wyszukiwanie

Nasza metoda w kontrolerze:

  /**
   * @Route("/search")
   */
  public function searchAction(Request $request)
  {   
      	$q = $request->get('q'); 

  	$results =  $this->sphinx->searchEx($q, array(‘product’));

[….]
  }

Voila!

FacebookTwitterGoogle+LinkedIn