Elastic search tudzież inne rozbudowane bundle dla prostych wyszukiwarek i małych stron to strzał w stopę. W firmie mieliśmy CMS dla prostych stronek i prawie zawsze przy przenosinach na inny hosting były problemy (niespełnione zależności, wymagania, zablokowane porty, a nawet brak dostępu do java). Stąd jeśli faktycznie ma to być coś prostego polecam zrobić sql'ową wyszukiwarkę za pomocą union selecta którego doctrine nie obsługuję. Oto prosty kontroler wyszukiwarki z podliczaniem ilości wystąpień słowa kluczowego i sortowaniem podług tego parametru:
public function indexAction(Request $request)
{
$keyword = strtolower($request->query->get('keyword'));
$sql = "select 'sites' as table_name, id, title, content from sites where (title like '%$keyword%' or content like '%$keyword%')
union select 'blog' as table_name, id, title, content from blog where (title like '%$keyword%' or content like '%$keyword%')
union select 'gallery' as table_name, id, title, content from gallery where (title like '%$keyword%' or content like '%$keyword%')
union select 'movies' as table_name, id, title, content from movies where (title like '%$keyword%' or content like '%$keyword%')
union select 'news' as table_name, id, title, content from news where (title like '%$keyword%' or content like '%$keyword%')";
$stmt = $this->getDoctrine()->getManager()->getConnection()->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
for($i = 0; $i < count($result); $i++){
$result[$i]['count'] = substr_count(strtolower($result[$i]['title']), $keyword) + substr_count(strtolower($result[$i]['content']), $keyword);
}
usort($result, function ($a, $b) {
return strnatcmp($b['count'], $a['count']);
});
return array(
'result' => $result
);
}
Ten kod nie spełnia oczywiście Symfonowych założeń i sql nie jest w repozytorium ale działa ;)