Ieskats Clusterpoint. Fulltext search un Geospatial

Clusterpoint šogad izcīnīja BaltCap investīcijas turpmākai projekta virzībai. Tā līdzdibinātājs un stratēģiskā persona G.Ernestsons, kurš pazīstams ar tādiem projektiem, kā lursoft un siets.lv. Clusterpoint pozicionē savu produktu kā ātru, mērogojamu, ar geospatial atbalstu, kā vienu no nedaudzajiem ar fulltext meklēšanu. Rakstā daži PHP paraugi un vērojumi.

Šogad par sevi atgādināja Clusterpoint ar medijos pāršalkušo ziņu par būtisku investīciju piesaisti no riska kapitāla investīciju uzņēmuma BaltCap. Taču Clusterpoint vēsture un pirmsākumi meklējami daudz senākā pagātnē.

Uzņēmuma Clusterpoint līdzdibinātājs un stratēģiskā persona Gints Ernestsons, kurš savulaik bijis Lursoft līdzdibinātājās (1992), kā arī dažādu projektu autors, piemēram, siets.lv (2002). Clusterpoint dbvs, tiek izmantots arī TvNet, ZL, Leta u.c. Ir realizēti projekti arī ārpus Latvijas, piemēram, Izraelā :)

2006. gadā, kad tika izveidots atsevišķs uzņēmums Clusterpoint un, cik nu var noprast, vienīgais tā  produkts un knowhow ir NoSQL datubāze.

NoSQL atšķirībā no klasiskām (relāciju) datubāzēm sastāv nevis no tabulām, bet gan no objektiem (iekšējais formāts gan ir xml, json). Tādā veidā, no programmēšanas viedokļa iegūstam vienu lielu objektu, kur krāmēt datus. Kas, ne mazāk patīkami, ka datubāzes struktūra mainās izstrādes gaitā, t.i. nav nepieciešams definēt tabulas, laukus, datu tipus. Otrs būtisks aspekts NoSQL datubāzēm, ka tās ļoti labi sadzīvo ar virtualizācijām un var tikt neierobežoti mērogots (clustering).

Taču ir arī trūkumi.  Kā būtiskāko var minēt pilnā teksta meklēšanu (fulltext), ko praktiski neviena no NoSQL datubāzēm neatbalsta (izņemot Clusterpoint).

Turpmākajā izklāstā neliels ieskats manos eksperimentos.

Clusterpoint un FullText meklēšana

Clusterpoint tik tiešām piedāvā ļoti daudzveidīgus meklēšanas veidus. Patīkams pārsteigums ir stemming pieejamība daudzām valodām starp kurām beidzot (!) ir arī latviešu. Stemming ļauj veikt meklēšanu locījumos, kas tiešām arī darbojas. Zemāk redzamajā piemērā, meklēto vārdu „zaķis” atrod arī ja teikumā tas lietots kā „zaķu” un „zaķa”. Var meklēt arī frāzes.

Taču neiztikt arī bez trūkumiem, kurus pagaidām tā arī neizdevās atrisināt:

  1. Norādot meklējamo vārdu bez garumzīmes, nekas netiek atrasts. Ja vārdam „zakis” iebūvētais (alternative) spellcheckers piedāvās „zaķis”, tad, piemēram, vārdam „burkans” nepiedāvās. Wildchars nedarbojas kopā ar stemming :(
  2.  Liekvārdi. Piemēram, ja meklētā frāze: „filma par zaķi” neatradīs neko, bet „filma zaķi” atradīs.
<?php

error_reporting(E_ALL);

require_once('php_cps_api-111215/cps_simple.php');

$conn = new CPS_Connection("unix:///usr/local/cps2/storages/eriks/storage.sock", 
                           "eriks", "root", "password");

$items = Array();

try {

   $cps = new CPS_Simple($conn);

   $items[] = Array("title" => "George Cik patiesībā ir droši karšu zaķa norēķini internetā ar 3D Secure");
   $items[] = Array("title" => "Larsa fon Trīra zaķu botanica filmas");
   $items[] = Array("title" => "Pērkamā māksla zaķis ar burkānu bet kultūrā formē filmu"
   $items[] = Array("title" => "Georges Auskaru forma – kā piestāv un kā tevi raksturo kultūrām");

   $cps->updateMultiple($items);


   // search

   $query = '$zaķis$';
  
   $words = $cps->alternatives($query);
   echo 'Suggested query spelling:' . $words;

   // retrieve

   $docs = $cps->search($query, null, null, null, null, DOC_TYPE_SIMPLEXML, "lv");
   print_r($docs);


} catch (CPS_Exception $e) {

   echo '<pre>';
   print_r($e->errors());

}

Geospatial, jeb vietu meklēšana pēc lat, long koordinātēm

Otrs eksperiments ir ar vietu meklēšanu. Lai arī aprakstā melns uz balta aprakstīts, ka Clusterpoint var vienlīdz labi darboties gan „plane”, gan „gps” režīmā, tā arī nekļuva saprotams, kā var meklēt vietas norādot sākumpunktu un rādiusu. Dokumentācijā atrodams paraugs, kurā var kārtot pēc koordinātēm (skat. zemāk).  Darbojas tieši kā paredzēts, sakārto: 1, 2 un 3. Nepārbaudīju, kā (un vai) notiek korekcija pēc globusa izliekuma.

<?php

error_reporting(E_ALL);

require_once('php_cps_api-111215/cps_simple.php');

$conn = new CPS_Connection("unix:///usr/local/cps2/storages/eriks/storage.sock", 
                           "eriks", "root", "password");

$items = Array();

try {

   $cps = new CPS_Simple($conn);
    
   $items[] = Array("title" => "GasOil 1", "type" => "gasstation", 
                    "coordinates" => Array("lat" => 56.926518, "long" => 24.028816));
   $items[] = Array("title" => "GasOil 2", "type" => "gasstation", 
                    "coordinates" => Array("lat" => 56.964345, "long" => 24.148293));
   $items[] = Array("title" => "GasOil 3", "type" => "gasstation", 
                      "coordinates" => Array("lat" => 57.006994, "long" => 24.307594));

   $cps->updateMultiple($items);


   // search
       
   $query     =  CPS_Term('gasstation', 'type');

   $start     = Array('coordinates/lat' => 56.950592, 'coordinates/long' => 24.11911);

   $ordering  = CPS_LatLonDistanceOrdering($start, 'ascending');

   $docs = $cps->search($query, null, null, null, $ordering);

   print_r($docs);


} catch (CPS_Exception $e) {

   echo '<pre>';
   print_r($e->errors());

}

Secinājumi

No licencēšanas viedokļa patīkami ir tas, ka viena servera versija ir par brīvu. Klasterim var iegūt 30 dienu izmēģinājuma versiju, taču cenu politika netiek izpausta un katrs projekts, acīmredzot, tiek vērtēt individuāli.  Baumu līmenī pavīdēja, ka lv.lv (kurš izskatās arī ir uz Clusterpoint) komerclicence izmaksāja 16 000 Ls.

Neskatoties uz to, ka Clusterpoint darbojas kopš 2006. gada, tīmeklī atrodamā informācija ir visnotaļ skopa. Salīdzinājumā ar konkurentiem, trūkst lietojuma piemēru. Arī uzņēmuma mājaslapas paspārnē atrodamais izstrādātāju forums ir vāji apdzīvots.

Iespējams, uzņēmums publisko invāziju sācis pavisam nesen, par ko varētu liecināt tas, ka wiki dokumentācijā vecākais ieraksts ir tikai 2011. gada maijā. Apmēram ap to laiku klajā laists Clusterpoint Server 2 (un brīvi pieejamā versija), kā arī izveidots twitter konts.

[1] http://www.clusterpoint.com

[2] Forums - http://www.clusterpoint.com/vanilla/

Dalies:
Novērtē: 5 (2)
Skatīts: 882

komentāri

Jurģis

Paldies par Clusterpoint datubāzes "iemēģināšanu"!

Daži komentāri lietām, kas iespējams nav pietiekami skaidri izteikti dokumentācijā.

Runājot par tā saukto "collation" atbalstu, kur konkrētiem simboliem tiek definēti alternatīvie simboli, esam domājuši un nākošajās datubāzes relīzēs noteikti tiks iekļauts. Patreiz to pašu var realizēt ar wildcard search, Jūsu gadījumā meklējot [zž][aā][ķk][īi][sš]. Protams nav tas "draudzīgākais" pieraksts, bet iespēja pastāv:) Centīsimies šo risināt, kā jau minēju, nākamajās versijās.

Stopwords - liekvārdi - pēc noklusējuma netiek izslēgti no meklēšanas, jo ir aplikācijas, kur šie vārdi ir svarīgi no datu loģikas viedokļa, piemēram nosaukumos. Taču pastāv iespēja definēt sarakstu ar šādiem vārdiem, kuri būtu jāizslēdz no meklēšanas, tādējādi nodrošinot funkcionalitāti, kuru Jūs vēlējāties sagaidīt no sistēmas.

Attiecībā par meklēšanu objektos, kuriem ir piekārtotas ģeogrāfiskās koordinātes, tad ir iespējams ierobežot meklēšanu noteiktā rādiusā, jeb apgabalā, definējot koordināšu intervālus meklēšanas pieprasījumā.
Jūsu piemērā tas varētu izskatīties šādi:
....
$query = CPS_Term('gasstation', 'type').CPS_Term('55 .. 58', 'coordinates/lat').CPS_Term('24 .. 25', 'coordinates/long');
...
Papildus tam ir iespējams kārtot rezultātus plaknē - klase CPS_PlaneDistanceOrdering (der LKS-92 mūsu pašu JāņaSētas kartēm), vai ģeogrāfiskajā koordināšu sistēmā norādot garuma, platuma grādus, ko izmantojāt piemērā.
Lai šāda veida meklēšanu vēl atvieglotu, tad padomā ir distances meklēšanai norādīt apgabalu nevis ar koordināšu intervāla galapunktiem, bet norādot distanci kurā meklēt, piemēram 1km vai 2500m, lai mazāka rēķināšana :)

Vēlam veiksim un sekojiet līdzi izmaiņām mūsu twitterī http://twitter.com/clusterpoint

Ja rodas jautājumi, ierosinājumi droši rakstiet forumā, kas ir sācis strādāt patiešām relatīvi nesen un ceram uz Latvijas izstrādātāju koncentrēšanos tieši tur :)



Ko lasa citi?