Home > PHP > Wyszukiwarka z Zend_Search

Wyszukiwarka z Zend_Search

Zend_search czyli Zend_Search_Lucen to phpowa implemnetacja popularnej Javowej wyszukiwarki Lucen. Lucen jest pełnotekstową wyszukiwarką opartą na plikach, więc do jej obsługi nie potrzebujemy bazy danych.

Główne zalety to mi. Zwracanie wyniku według trafności wyszukiwania, możliwość tworzenie różnego rodzju zapytań, czy wyszukiwanie po polach tekstowych(np. autor, title, content).

Wyszukiwarkę możemy zaimplementować na różne sosoby w zaleźności od tego czego potrzebujemy.
Ja stworzyłęm sobie dodatkowy model, w którym stworzyłem 4 metody: search(), addSearch(), updateSearch(), delSeaarch(). Dodatkowo stworzyłem sobie skrypt, który indeksuje rekordy już znajdujące się w bazie (nie będę go tutaj opisywał, powstał na potrzeby projektu).

Tego co robią metod chyba nie trzeba opisywać, nazwy mówią wszystko. metoda updateSearch() słada się tak naprawdę z dwóch metod poniewasz Lucen nie obsługuje aktualizacji rekordów. więc trzeba najpierw usunąć stary rekord a później dodać nowy.

Kod klasy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
class SearchModel
{
        //ścieżka do indeksu wyszukiwania
	protected $_path = './data/Index';
	protected $_index;
 
	public function __construct($path = null)
	{
		if(!empty($path))
			$this->_path = $path;
		try {    
		    $this->_index = Zend_Search_Lucene::open($this->_path);
		} catch (Zend_Search_Lucene_Exception $e) {
		    try {
		        $this->_index = Zend_Search_Lucene::create($this->_path);
		    } catch(Zend_Search_Lucene_Exception $e) {
		        $this->layout->err = "Nie można otworzyć ani utwoarzyć nowego indeksu wyszukiwania";
		    }
		}
	}
 
	public function addSearch($id, $title = '', $contents)
	{
	    $doc = new Zend_Search_Lucene_Document();
 
	    if($title != '')
	        $doc->addField(Zend_Search_Lucene_Field::Text('title', $title, 'utf-8'));
 
	    $doc->addField(Zend_Search_Lucene_Field::Text('itemid', $id));
	    $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents, 'utf-8'));
 
	    $this->_index->addDocument($doc);
	    $this->_index->optimize();
	    $this->_index->commit();
	}
 
	public function search($words)
	{
            $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($words, 'utf-8');
            return $this->_index->find($userQuery, 'module', SORT_STRING);
	}
 
	public function update($module, $id, $title = '', $contents, $item)
	{
            $this->delete($item);	
	    $this->addSearch($module, $id, $title, $contents);
	}
 
	public function delSearch($item)
	{
	    $hits = $this->_index->find($item);
 
	    foreach ($hits as $hit)
	    {
		if( $hit->itemid == $item )
		{
	            $this->_index->delete($hit->id);
		    return true;
		}
	    }
	    return false;
	}
}
?>

Samo używanie jest proste, w odpowiednich akcjach inicjujemy model i wywołujemy odpowiednią metodę przekazując do niej odpowiednie dane.

1
2
3
4
 
//w kontrolerze w którym dodajemy np. newsy
$search = new SearchModel();
$search->addSearch("te".$id, "Jakiś tytuł ...", "Kontent, który ma zostać zaindeksowany... ");

W metodzie addSearch jako pierwszy parametr dodaje id z prefiksem (u mnie jest to dwie pierwsze literki modułu) jest to potrzebne do usuwania dokumnetów z indeksu. Zend_Search_Lucen nie wspiera wyszukiwania dla liczb więc metoda find(15) nic by nam nie zwróciła, dlatego przy usuwaniu i updatowaniu podajemy id z prefixem, dodatkowo prefiks możemy wykorzystać do spreparowania urla w wynikach wyszukiwania (spotkałem się w sieci z zapisywaniem urla indeksowanego zasobu, mi jednak wystarczy id z prefiksem). Podobnie wywołujemy pozostałe metody.

Moje implementacja nie jest może idealna ale do stworzenia wyszukiwarki w zupełności wystarczy i może stać się bazą do bardziej rozbudowanego skryptu. A Lucen daje nam jeszcze kilka możliwości np. limitowanie wyników, sortowanie wyników po polach, czy tworzenie skomplikowanych zapytań.

Do przeglądania indexu Lucen możemy uzyć narzędzia Luke

Powiązane wpisy:

  1. Brak komentarzy
  1. Brak jeszcze trackbacków

agencja reklamowa lublin ślub i wesele senniki