Solr
Heeft iemand ervaring met
Link doet het niet? Overigens heb ik er geen ervaring mee. Hoi Pim,
Ik heb er al mee zitten spelen en bij mij was het behoorlijk rap. Misschien moet ik eens een testje opzetten..
Een goed alternatief is trouwens Sphinx, deze kun je onder MySQL draaien, en blijkt ook enorm snel te zijn. Volgens zijn functionaliteiten als stemming, etc wel beperkter maar Niels heeft er volgens mij ervaring mee.
Solr heeft overigens ook een mogelijkheid om een index met een bepaalde database tabel te laten syncen.
Ik ben ook direct maar een tutorial aan het maken voor in een ZF1/Doctrin2 applicatie ;) Ik ben er toevallig net mee bezig. Ik ben zelf namelijk ook Zend_Search_Lucene gewend. Maar Solr blijkt vooral sneller te zijn omdat het als aparte webservice (REST) onder Java draait.
Ja en nee. Solr is plat. Maar je kunt wel bijvoorbeeld met dynamic fields onderscheid maken tussen verschillende entities. In Solr maakt het niet uit als sommige velden leeg zijn.
Stel je wilt 2 tabellen syncen met een Solr index kun je twee dingen doen:
1. Een type veld maken met waarde tabel1 of tabel2 en velden prefixen bijvoorbeeld tabel1_kolom (met dynamic columns evt). Deze optie loont vooral als het om een niet al te grote index gaat (minder als een paar miljoen entries). Het klinkt/lijkt heel vies maar dit is een 'geldige' manier in Solr.
2. Een multi-core set-up opzetten met dus twee indexes. Een index voor tabel1 en tabel2 maar dit is wel wat lastiger als bovenstaande optie.
Bovenstaande informatie heb ik uit het boek "Solr 1.4 Enterprise Search Server".
Ik snap niet waarom je zo proberen dat model te laten lijken op de RDBMS model. En dan heb je toch helemaal geen joins e.d. nodig? Het is toch sowieso beter om een heel nieuw datamodel te maken voor de zoekmachine?
Ik heb speciaal voor jou een hele tutorial gemaakt zodat je ermee kan spelen. Alleen de tutorial staat nog niet online maar als jij belooft dat je hem op spelling e.d. checked dan zet ik hem asap online voor je :p
De applicatie die bij de tutorial hoort staat wel online: https://github.com/keesschepers/SolrExample moet alleen nog wat kleine dingetjes fixen.
Je kunt in iedergeval de verschillen in performance met Pike_Grid hier al zien:
http://solrexample.keesschepers.nl/index/mysql-grid
Dit is op een server met 3 cores (6.6gz) en 4gb geheugen. Moet wel zeggen dat zowel Solr en MySQL zelf nog niet echt getweaked zijn dus out-of-the-box installs.
Ben benieuwd wat je ervan vindt en andere wellicht :)
Zo'n Solr grid bouw je dan als volgt op:
Bovenstaande functie staat dan in een controller natuurlijk ;-) En je kunt dezelfde functies gebruiken als bij een doctrine grid. Sorry dat ik niet meer gereageerd heb Pim! Ik snap je laatste vraag ook niet echt.. je kunt inderdaad niet joinen in Solr dus als je relationele dingen wilt opslaan moet je dat plat slaan. Eigenlijk beetje hetzelfde als in Couchdb enzo.
Kan je de verwerkingstijd in het voorbeeld verwerken? Dan mag je ons verbazen.
Bevat Pike Grid eigenlijk een vorm van caching of een aanhechtingspunt voor een cache?
En natuurlijk wil ik wel wat spelfoutjes doorgeven ;). Wordt het een uitgebreide tutorial?
Ik snap mijn eigen vraag eigenlijk ook niet echt meer. Waarschijnlijk vroeg ik me af waarom je per se je datamodel dat je in je DB hebt zou willen spiegelen naar je zoekindex. tabel1_veld als veldnaam is dan toch raar, omdat het toch een ander datamodel is. Verwijzen naar de tabel is dan onnodig. Looks good :)
En het verschil merk je sowieso al als je gaat zoeken want in MySQL duurt dit soms 4-8 sec terwjil in Solr ongeveer 0.02 ofzo.
Pike_Grid ondersteund nog geen caching op dit moment, maar is eigenlijk ook nog niet echt nodig. Met de Doctrine kun je het zelf doen door voordat je je query naar de datasource stuurt $query->setCacheMaxLifetime() te zetten. Hier houdt Pike_Grid dan automatisch rekening mee.
En in Solr zit standaard al caching, en zou het overbodig zijn om dit in de grid ook nog eens te cachen.. Voor de verwerkingstijd kun je het beste even met de console in firebug kijken, want erin tweaken met javascript kost weer een hoop tijd terwijl het maar een voorbeeldje is :p Artikel:
Kan je het aan de PHPHulp library toevoegen?
Niels Mooi artikel Kees,
Als ik weer een laptop heb, ga ik het uitgebreid lezen! Plaats dan gewoon een link ;-).
Gewijzigd op 08/12/2011 19:15:09 door Niels K
Nu wel ;-). Parser doet moeilijk met spaties
Dank :)
Ik heb er al mee zitten spelen en bij mij was het behoorlijk rap. Misschien moet ik eens een testje opzetten..
Een goed alternatief is trouwens Sphinx, deze kun je onder MySQL draaien, en blijkt ook enorm snel te zijn. Volgens zijn functionaliteiten als stemming, etc wel beperkter maar Niels heeft er volgens mij ervaring mee.
Solr heeft overigens ook een mogelijkheid om een index met een bepaalde database tabel te laten syncen.
Ik ben ook direct maar een tutorial aan het maken voor in een ZF1/Doctrin2 applicatie ;)
Gewijzigd op 02/01/2012 00:02:14 door kees Schepers
Is een relationele database wel geschikt voor dit doel?
Pim - op 02/01/2012 20:01:03:
Is een relationele database wel geschikt voor dit doel?
Ja en nee. Solr is plat. Maar je kunt wel bijvoorbeeld met dynamic fields onderscheid maken tussen verschillende entities. In Solr maakt het niet uit als sommige velden leeg zijn.
Stel je wilt 2 tabellen syncen met een Solr index kun je twee dingen doen:
1. Een type veld maken met waarde tabel1 of tabel2 en velden prefixen bijvoorbeeld tabel1_kolom (met dynamic columns evt). Deze optie loont vooral als het om een niet al te grote index gaat (minder als een paar miljoen entries). Het klinkt/lijkt heel vies maar dit is een 'geldige' manier in Solr.
2. Een multi-core set-up opzetten met dus twee indexes. Een index voor tabel1 en tabel2 maar dit is wel wat lastiger als bovenstaande optie.
Bovenstaande informatie heb ik uit het boek "Solr 1.4 Enterprise Search Server".
Ik snap niet waarom je zo proberen dat model te laten lijken op de RDBMS model. En dan heb je toch helemaal geen joins e.d. nodig?
Ik heb speciaal voor jou een hele tutorial gemaakt zodat je ermee kan spelen. Alleen de tutorial staat nog niet online maar als jij belooft dat je hem op spelling e.d. checked dan zet ik hem asap online voor je :p
De applicatie die bij de tutorial hoort staat wel online: https://github.com/keesschepers/SolrExample moet alleen nog wat kleine dingetjes fixen.
Je kunt in iedergeval de verschillen in performance met Pike_Grid hier al zien:
http://solrexample.keesschepers.nl/index/mysql-grid
Dit is op een server met 3 cores (6.6gz) en 4gb geheugen. Moet wel zeggen dat zowel Solr en MySQL zelf nog niet echt getweaked zijn dus out-of-the-box installs.
Ben benieuwd wat je ervan vindt en andere wellicht :)
Zo'n Solr grid bouw je dan als volgt op:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
public function solrGridAction()
{
$this->view->headTitle('Solr sample grid');
$request = $this->getRequest();
$config = Zend_Registry::get('config');
$client = new SolrClient($config->solr->connection->toArray());
$query = new SolrQuery('*:*'); //all documents
$query->addField('id')->addField('title')->addField('author')->addField('url');
$dataSource = new Pike_Grid_DataSource_Solr($client, $query);
$grid = new Pike_Grid($dataSource);
$grid->setId('mysql-grid')
->setCaption('SOLR grid')
->setRowsPerPage(20)
->setColumnAttribute('id', 'search', false)
->setColumnAttribute('title', 'search', true)
->setColumnAttribute('author', 'search', true)
->setColumnAttribute('url', 'search', true)
->setColumnAttribute('url', 'sortable', false);
$this->view->mysqlgrid = $grid;
$this->view->headScript()->appendScript($grid->getJavascript(), 'text/javascript');
if ($request->isXmlHttpRequest()) {
$dataSource->setParameters($request->getPost());
$this->_helper->json->sendJson($dataSource->getJSON(false));
}
}
?>
public function solrGridAction()
{
$this->view->headTitle('Solr sample grid');
$request = $this->getRequest();
$config = Zend_Registry::get('config');
$client = new SolrClient($config->solr->connection->toArray());
$query = new SolrQuery('*:*'); //all documents
$query->addField('id')->addField('title')->addField('author')->addField('url');
$dataSource = new Pike_Grid_DataSource_Solr($client, $query);
$grid = new Pike_Grid($dataSource);
$grid->setId('mysql-grid')
->setCaption('SOLR grid')
->setRowsPerPage(20)
->setColumnAttribute('id', 'search', false)
->setColumnAttribute('title', 'search', true)
->setColumnAttribute('author', 'search', true)
->setColumnAttribute('url', 'search', true)
->setColumnAttribute('url', 'sortable', false);
$this->view->mysqlgrid = $grid;
$this->view->headScript()->appendScript($grid->getJavascript(), 'text/javascript');
if ($request->isXmlHttpRequest()) {
$dataSource->setParameters($request->getPost());
$this->_helper->json->sendJson($dataSource->getJSON(false));
}
}
?>
Bovenstaande functie staat dan in een controller natuurlijk ;-) En je kunt dezelfde functies gebruiken als bij een doctrine grid.
Gewijzigd op 11/01/2012 17:05:17 door kees Schepers
Kan je de verwerkingstijd in het voorbeeld verwerken? Dan mag je ons verbazen.
Bevat Pike Grid eigenlijk een vorm van caching of een aanhechtingspunt voor een cache?
En natuurlijk wil ik wel wat spelfoutjes doorgeven ;). Wordt het een uitgebreide tutorial?
Ik snap mijn eigen vraag eigenlijk ook niet echt meer. Waarschijnlijk vroeg ik me af waarom je per se je datamodel dat je in je DB hebt zou willen spiegelen naar je zoekindex. tabel1_veld als veldnaam is dan toch raar, omdat het toch een ander datamodel is. Verwijzen naar de tabel is dan onnodig.
En het verschil merk je sowieso al als je gaat zoeken want in MySQL duurt dit soms 4-8 sec terwjil in Solr ongeveer 0.02 ofzo.
Pike_Grid ondersteund nog geen caching op dit moment, maar is eigenlijk ook nog niet echt nodig. Met de Doctrine kun je het zelf doen door voordat je je query naar de datasource stuurt $query->setCacheMaxLifetime() te zetten. Hier houdt Pike_Grid dan automatisch rekening mee.
En in Solr zit standaard al caching, en zou het overbodig zijn om dit in de grid ook nog eens te cachen..
Kan je het aan de PHPHulp library toevoegen?
Niels
Uhm, dat zou ik opzich wel willen, maar dan krijg je duplicate content wat voor SEO niet echt goed is...
Als ik weer een laptop heb, ga ik het uitgebreid lezen!
En je al meer verdiept in Solr Pim? Ondertussen ben ik hier zowat dagelijks mee bezig ;-) Zelfs diverse event handlers geschreven in Java voor de Solr DataImportHandler.