Archive for Wrzesień, 2009

Wyszukiwanie danych w procesach

Dziś zajmę się sprawą wyszukiwania danych procesu w NGinn. Problemem w tym przypadku jest sposób przechowywania danych procesu przez NGinn – otóż dane są przechowywane jako fragment dokumentu JSON zawierającego stan procesu. Taki sposób przechowywania danych nie ułatwia ich przeszukiwania – nawet jeśli dokumenty są zapisywane w relacyjnej bazie danych to i tak nie da się za pomocą SQL zadawać zapytań o poszczególne pola w dokumencie.
Rozwiązaniem jest odpowiednie indeksowanie dokumentów, przy czym nie mam tu na myśli indeksów znanych z relacyjnych baz danych a zewnętrzny indeks pełnotekstowy pozwalający na umieszczanie w nim dowolnych danych. Jednym z narzędzi tego typu jest Apache Lucene oraz jego port do środowiska .Net pod nazwą Lucene.Net. Lucene pozwala na budowę indeksów o dowolnej zawartości (każdy wpis w indeksie może zawierać dowolny zestaw pól) które potem mogą być przeszukiwane za pomocą prostych zapytań.

Poświęciłem ostatnio trochę czasu na próbę połączenia NGinn i Lucene i wyniki są bardzo zachęcające. Przede wszystkim wrażenie robi wydajność Lucene.Net – wyniki są zwracane w mgnieniu oka a mechanizm wyszukiwania jest bardzo sprytny i ma wiele interesujących możliwości. Wystarczy w aplikacji umieścić jedno pole wyszukiwania i możemy szukać po dowolnych danych w procesie a nawet konstruować bardziej zaawansowane zapytania zbudowane z kilku predykatów połączonych operatorami logicznymi. Dodatkowo Lucene w naturalny sposób obsługuje paging co znacznie ułatwia budowę aplikacji. Nie będę tu wchodził w techniczne szczegóły, ale mechanizm indeksowania danych NGinn za pomocą Lucene działa w trybie offline, tzn indeksuje dane z pewnym niewielkim opóźnieniem dzięki czemu indeksowanie nie ma negatywnego wpływu na szybkość działania NGinn. Komponent indeksujący uaktywnia się tylko po zmianie stanu jakiegoś procesu i wtedy wpis w indeksie dla tego procesu jest aktualizowany. Nie robiłem testów na milionach rekordów, ale przy właściwym poindeksowaniu danych wyszukiwanie za pomocą Lucene powinno być o wiele szybsze niż jakiekolwiek zapytania SQLowe. Jeśli chodzi o wielkość indeksu to jest ona zaskakująco mała biorąc pod uwagę ilość danych którą można w nim umieścić.

Jeśli chodzi o plany rozwojowe to w najbliższym czasie nie zamierzam umieszczać w NGinn komponentu indeksującego – jest to fajny dodatek ale ponieważ nie jest bezpośrednio związany z funkcjami workflow engine to na razie nie będę go rozwijał w ramach projektu Open Source – no chyba że pojawi się perspektywa jakiegoś interesującego wdrożenia.

Poniżej zamieszczam przykładowy ekran wyszukiwania z prostej aplikacji którą posiłkuję się przy pracach nad NGinn. Łącząc framework Ext JS oraz Lucene udało się bardzo szybko rozbudować tę aplikację o funkcję wyszukiwania procesów na podstawie ich wewnętrznych danych. Tak więc szukającym dobrego search engine dla swojego systemu bardzo polecam Lucene.

screen