Djapian - integracja pełnotekstowej wyszukiwarki Xapian z Django
24 February 2009
Comments
Djapian to komponent integrujący pełnotekstową wyszukiwarkę Xapian z Django. Djapian umożliwia tworzenie "modeli", które służą do indeksowania i wyszukiwania danych - np z powiązanego modelu.Instalacja
- Zaczynamy od instalacji xapiana wraz z pakietem xapian-bindings
- Pobieramy pakiet Djapiana i instalujemy standardowo: python setup.py install
- Do INSTALLED_APPS naszego projektu Django dodajemy: 'djapian'
- W settings.py dodajemy także DJAPIAN_DATABASE_PATH = "/ściezka/do/katalogu/na/dane/xapiana/" - wskazującą na pusty katalog, w którym xapian będzie przetrzymywał swoje dane
Indeksowanie i wyszukiwanie danych
Oto przykładowy model Django:class Content(models.Model):
title = models.CharField(max_length=255, verbose_name=_('Title'))
slug = models.SlugField(max_length=255, unique=True, verbose_name=_('Slug'))
description = models.TextField(verbose_name=_('Description'))
text = models.TextField(verbose_name=_('Text'), blank=True)
class ContentIndexer(djapian.Indexer):
fields=["text"]
tags=[
("title", "title"),
("slug", "slug"),
("description", "description")
]
djapian.add_index(Content, ContentIndexer, attach_as="indexer")
Model Djapiana to klasa dziedzicząca djapian.Indexer. Atrybut fields zawiera listę pól jakie mają być użyte do stworzenia ogólnego indeksu. Atrybut tags zawiera listę dwuelementowych (opcjonalnie 3-elementowych) list klucz-nazwa_pola. Tagi pozwalają na precyzyjne wyszukiwanie po danym polu (a nie po indeksie głównym zdefiniowanym w fields).
Po zdefiniowaniu modelu Djapiana przypisujemy go do danego modelu Django:
djapian.add_index(MODEL_DJANGO, MODEL_DJAPIANA, attach_as="NAZWA_INDEKSU")
Reindeksacja (pierwsze indeksowanie) wszystkich danych można przeprowadzić za pomocą:
Content.indexer.update()
MODEL.NAZWA_INDEKSU.update()
Wyszukiwanie wygląda następująco:
MODEL.NAZWA_INDEKSU.update()
result = Content.indexer.search('python')
# przykład wyszukiwania dla taga
#result = Content.indexer.search('description:python')
for i in result:
# wyświetlenie danych ze znalezionego wpisu
print i.instance.title
# procentowa ocena trafności
print i.percent
print
RkBlog
Comment article