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

Let us talk about
Name and Mail are required
Join the discuss