Post on 10-Sep-2019
Apache Solr
kako i zašto ga koristiti
Josip Maslać, Nabava.net (Aplos d.o.o.)
LIKE “%....%” ??
Što
• Apache Solr - “open source enterprise search server”
• analizira, indeksira i pretražuje tekst
• ne služi za (trajno) spremanje podataka
DB
DOC, XLS, PDF, RTF,
CSV, XML..
XML/JSON(Solr)
SOLRSOLR
Aplikacija
Rezultati pretraživanja
Mogućnosti
• želimo relevantne podatke - score-ing & boosting
– “article_title article_body^0.8”
• wildcard pretraživanje• wildcard pretraživanje
– “run*” => “run”, “runner”, “running”
• pretraživanje po rasponu
– “cijena:[1000 TO 1500]”
Mogućnosti
• fuzzy upiti
– “ranner~0.7” => “runner”
• boolean operatori• boolean operatori
– “web AND (developer OR programer)”
• geolokacijsko pretraživanje
– “sfield=location&pt=45.15,-93.85&d=5"
Mogućnosti
• stemming
– “riding”, "rider" => “ride”
• sinonimi• sinonimi
– “prijenosnik”, “laptop” => “notebook”
• autocomplete, more like this
– nema gotovih default rješenja
– “lako” za implementirati
Mogućnosti
• faceted (drilldown) pretraživanje
“Faceti”
Što
• (Java) web aplikacija - solr.war
http://localhost:8983/solr/
• Lucene ispod haube• Lucene ispod haube
– java library za pretraživanje teksta (od 2000g.)
– Solr & Lucene čvrsto povezani (isti repozitorij, commit-
eri, mail liste)
– Solr = Lucene + (web) server, admin konzola, cache-ove, replication, sharding, pluginovi...
Solr vs. DB
• ACID, sql JOIN & UPDATE
– Solr update = ponovno dodavanje cijelog dokumenta
• Solr == NoSQL ? (~truthy)• Solr == NoSQL ? (~truthy)
• optimiziran za pretraživanje, commit-ovi “spori”
• document oriented
– indeks je (jedna) denormalizirana tablica
Solr vs. DB
• Dokumenti u indeksu ~ retci u DB tablici
• Polja u dokumentima ~ stupci u DB tablici
uid nazivproizvoda
cijena proizvođač id kategorije1
...
id kategorije2
• Polja u Solr-u mogu biti multivalued
Analiza teksta
• Definirati očekivano ponašanje
– pažljivo konfigurirati i testirati
"wi-fi” => “wi-fi”, “wi fi”, “wifi” ?"wi-fi” => “wi-fi”, “wi fi”, “wifi” ?
• Analiza teksta
– tokenizacija - dijeljenje teksta na dijelove (tokene)
– tu zadaću obavljaju tokenizatori
Analiza teksta
The quick brown fox jumps over the lazy dog.
WhitespaceAnalyzerWhitespaceAnalyzer(whitespace splitting)
[The] [quick] [brown] [fox] [jumps] [over] [the] [lazy] [dog.]
Tokeni
Analiza teksta
The quick brown fox jumps over the lazy dog.
SimpleAnalyzer(lowercase & word boundary splitting)
[the] [quick] [brown] [fox] [jumps] [over] [the] [lazy] [dog]
Analiza teksta
The quick brown fox jumps over the lazy dog.
StopAnalyzer(lowercase & stop words removal)
[quick] [brown] [fox] [jumps] [over] [lazy] [dog]
Analiza teksta
The quick brown fox jumps over the lazy dog.
SnowballAnalyzer("Stemming" - svođenje riječi na njihov korijen)
[the] [quick] [brown] [fox] [jump] [over] [the] [lazy] [dog]
Kako
Kako
• solr.war => webapps/
• javiti container-u Solr lokaciju (JAVA_OPTS)
-Dsolr.solr.home={putanja_do_solr_direktorija}-Dsolr.solr.home={putanja_do_solr_direktorija}
• ${solr.home}/
– conf/
• solrconfig.xml
• schema.xml
određuje strukturu (“DDL”) indeksa
Indeksiranje
• handler-i za “ručni” unos
– Solr-u se da URL do podataka i podaci se POST-aju
• koristiti ćete DIH - DataImportHandler• koristiti ćete DIH - DataImportHandler
– komunicira s mnogobrojnim "izvorima" podataka
• DB, Email, CSV, XML, JSON, RichText...
– deklarativno definiranje načina indeksiranja
• XML konfiguracija
DataImportHandler
• importDB.xml
<dataConfig>
<document>
<entity name=”proizvod” dataSource=”jdbc”
query=”SELECT id_proizvoda AS uid, naziv, cijena....
FROM Proizvodi”
pk=”uid”
transformer="TemplateTransformer">
<field column=”uid” name=”proizvod:{proizvod.id_proizvoda}” />
<field column=”tipDokumenta” template="1" />
<field column=”naziv” />
<field column=”cijena” />
...
</entity>
</document>
</dataconfig>
Pretraživanje
• pretraživanje: URL + parametri
– hrpa parametara, razumni default-i
• http://localhost:8983/solr/select/?q=naziv:lcd• http://localhost:8983/solr/select/?q=naziv:lcd
– &start=40
– &rows=20
– &fq=id_proizvodjaca:5
– &facet=on&facet.field=kategorija
– ...
Prijatelji
• &debugQuery=true
• administracijska konzola
Zašto
• provjeren & pouzdan
• brz, modularan & skalabilan
• jezično neovisan• jezično neovisan
– HTTP komunikacija putem XML/JSON-a
• API
– Java (SolrJ), PHP (solr-php-client), Ruby (Sunspot), Javascript (ajax-solr)
Začkoljice
Začkoljice
• Vrijeme indeksiranja
• DB podaci <> podaci u indeksu• DB podaci <> podaci u indeksu
• Analiza teksta
– Engleski i ostali “korišteniji” jezici u prednosti
Začkoljice
• upiti mogu biti “nešto” duži
– Nabava.net > Monitori – proizvođač Dell:
http://localhost:8939/solr/select/?fq=locale:1&fq={!tag=cijena}cijena12345:[* TO http://localhost:8939/solr/select/?fq=locale:1&fq={!tag=cijena}cijena12345:[* TO *]&fq=td:2&fq={!tag=s1}1_sseid:(2532)&fq={!tag=pk}pk:9&q={!tag=q}naziv:*&facet.query={!ex=cijena}cijena1:[* TO *]&facet.query={!ex=cijena}cijena2:[* TO *]&facet.query={!ex=cijena}cijena3:[* TO *]&facet.query={!ex=cijena}cijena4:[* TO *]&facet.field={!ex=s1}1_sseinf&facet.field={!ex=s20}20_sseinf&facet.field={!ex=s18}18_sseinf&facet.field={!ex=s1530}1530_sseinf&facet.field={!ex=s24}24_sseinf&facet.field={!ex=s17}17_sseinf&facet.field={!ex=s19}19_sseinf&facet.field={!ex=s1298}1298_sseinf&facet.field={!ex=s1625}1625_sseinf&facet.field={!ex=s2073}2073_sseinf&facet.field={!ex=s2074}2074_sseinf&facet.field={!ex=s2318}2318_sseinf&facet.field={!ex=s29}29_sseinf&facet.field={!ex=s2320}2320_sseinf&facet.field={!ex=s2319}2319_sseinf&facet.field=pk&facet=true&f.1_sseinf.facet.mincount=0&f.1_sseinf.facet.prefix=1›5:9:&f.20_sseinf.facet.mincount=0&f.20_sseinf.facet.prefix=1›5:9:&f.18_sseinf.facet.mincount=0&f.18_sseinf.facet.prefix=1›5:9:&f.1530_sseinf.facet.mincount=0&f.1530_sseinf.facet.prefix=1›5:9:&f.24_sseinf.facet.mincount=0&f.24_sseinf.facet.prefix=1›5:9:&f.17_sseinf.facet.mincount=0&f.17_sseinf.facet.prefix=1›5:9:&f.19_sseinf.facet.mincount=0&f.19_sseinf.facet.prefix=1›5:9:&f.1298_sseinf.facet.mincount=0&f.1298_sseinf.facet.prefix=1›5:9:&f.1625_sseinf.facet.mincount=0&f.1625_sseinf.facet.prefix=1›5:9:&f.2073_sseinf.facet.mincount=0&f.2073_sseinf.facet.prefix=1›5:9:&f.2074_sseinf.facet.mincount=0&f.2074_sseinf.facet.prefix=1›5:9:&f.2318_sseinf.facet.mincount=0&f.2318_sseinf.facet.prefix=1›5:9:&f.29_sseinf.facet.mincount=0&f.29_sseinf.facet.prefix=1›5:9:&f.2320_sseinf.facet.mincount=0&f.2320_sseinf.facet.prefix=1›5:9:&f.2319_sseinf.facet.mincount=0&f.2319_sseinf.facet.prefix=1›5:9:&facet.mincount=1&facet.limit=-1&hl=false&sort=popularnost asc,random_2 asc&rows=30
Alternative
• pogonjene Lucene-om:
– Compass
– Hibernate search– Hibernate search
• Sphinx
Resursi
• Solr Wiki: http://wiki.apache.org/solr
• Knjiga: Apache Solr 3 Enterprise Search server
• [ Knjiga: Lucene in Action ]• [ Knjiga: Lucene in Action ]
• josip.maslac@gmail.com
Hvala