Mediovski Technology

Wyszukiwanie po tagach w Xapian

Data: 16 Grudzień 2009 11:45 Autor: Tomek | Kategoria: PHP

Implementacja silnika wyszukiwania Xapian w serwisie, nie jest bardzo skomplikowanym procesem, jednak xapian jako silnik wyszukiwania nie ma zaimplementowanego bezpośrednio wyszukiwania “po tagach”. W tym artykule przedstawię prosty lecz przydatny sposób zaimplementowania wyszukiwania po tagach oraz aktualizację zindeksowanego dokumentu. Aby wyszukiwać po tagach należy podczas indeksowania dokumentu lub tekstu dodać do niego odpowiedni “Term” z prefixem.

$TAG = 'TAG:' . $row['tag'];
$doc->add_term($TAG);

Wyszukiwanie w takim przypadku odbywa sie w bardzo prosty sposób:

if (is_array($params['tag'])) {
	$i = 0;
	foreach ($params['tag'] as $tag) {
		if ($i == 0) {
			$subQueryTag = new XapianQuery('TAG:' . $tag);
		} else {
			$subQueryTag = new XapianQuery(XapianQuery::OP_OR, $subQueryTag, new XapianQuery('TAG:' . $tag));
		}
		$i++;
	}
} else {
	$subQueryTag = new XapianQuery('TAG:' . $params['tag']);
}

Każdy dokument indeksu xapian powinien mieć zdefiniowany unikalny UID, oprócz docid przypisywanego przez sam silnik. UID będzie wykorzystywany podczas aktualizacji, usuwania, dodawania tagów.

Aby dodać lub usunąć tag należy wyszukać dokument po UID:

$this->xapian_init_readonly();
$UID = 'UID:' . $params['object_type'] . $params['id'];
 
$query = new XapianQuery($UID);
 
$this->xapian_enquire->set_query($query);
 
$matches = $this->xapian_enquire->get_mset(0, 20);
 
$j = 0;
$i = $matches->begin();
while (!$i->equals($matches->end())) {
	$doc = $i->get_document();
 
	$i->next();
	$j++;
}
 
$this->xapian_init_writable();
 
$TAG = 'TAG:' . $params['tag'];
 
if ($params['remove']) {
	$doc->remove_term($TAG);
} else {
	$doc->add_term($TAG);
}

Po odnalezieniu dokumentu można swobodnie dodawać i edytować TAGI, po których będziemy wyszukiwać.

RSS
Get Adobe Flash player