Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare ist ein Scribd-Unternehmen logo
Search Evolution – von Lucene
zu Solr und ElasticSearch
Florian Hopf
@fhopf
http://www.florian-hopf.de
20.06.2013
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Index
Indizieren
Suchen
Index
Term Document Id
Index
http://www.flickr.com/photos/quinnanya/5196951914/
Analyzing
Such
Evolution -
Von Lucene
zu Solr und
ElasticSearch
Verteiltes
Suchen mit
Elasticsearch
Analyzing
Term Document Id
Such 1
Evolution 1
Von 1
Lucene 1
zu 1
Solr 1
und 1
ElasticSearch 1
Verteiltes 2
Suchen 2
mit 2
Elasticsearch 2
1. Tokenization
Such
Evolution -
Von Lucene
zu Solr und
ElasticSearch
Verteiltes
Suchen mit
Elasticsearch
Analyzing
Term Document Id
such 1
evolution 1
von 1
lucene 1
zu 1
solr 1
und 1
elasticsearch 1,2
verteiltes 2
suchen 2
mit 2
1. Tokenization
2. Lowercasing
Such
Evolution -
Von Lucene
zu Solr und
ElasticSearch
Verteiltes
Suchen mit
Elasticsearch
Analyzing
Term Document Id
such 1,2
evolution 1
von 1
luc 1
zu 1
solr 1
und 1
elasticsearch 1,2
verteilt 2
mit 2
1. Tokenization
2. Lowercasing
3. Stemming
Such
Evolution -
Von Lucene
zu Solr und
ElasticSearch
Verteiltes
Suchen mit
Elasticsearch
Analyzing
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Inverted Index
Analyzer
datenbank OR DB
title:elasticsearch
"apache lucene"
speaker:hopp~
elastic* AND date:[20130101 TO 20130501]
Query Syntax
Relevance
http://www.ibm.com/developerworks/java/library/os-apache-lucenesearch/
Document
Field Name 1 Value 1title Value
Documents
Document
Field Name 1 Value 1title Integration ganz einfach mit Apache CamelField Name 1 Value 1title ValueField Name 1 Value 1speaker Florian Hopf
Field Name 1 Value 1title ValueField Name 1 Value 1date 20130620
Field Name 1 Value 1title ValueField Name 1 Value 1title Integration ganz einfach mit Apache CamelField Name 1 Value 1title ValueField Name 1 Value 1title Such-Evolution
Attributes
Store
YES NO
Attributes
Index
ANALYZED YES NO
TextField StoredFieldStringField
Document doc = new Document();
doc.add(new TextField(
"title",
"Suchen und Finden mit Lucene und Solr",
Field.Store.YES));
doc.add(new StoredField(
"speaker",
"Florian Hopf"));
doc.add(new StringField(
"date",
"20120704",
Field.Store.YES));
Indexing
Directory dir = FSDirectory.open(
new File("/tmp/testindex"));
IndexWriterConfig config = new IndexWriterConfig(
Version.LUCENE_43,
new GermanAnalyzer(Version.LUCENE_43));
IndexWriter writer = new IndexWriter(dir, config);
writer.addDocument(doc);
writer.commit();
Indexing
IndexReader reader = IndexReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(
Version.LUCENE_43,
"title",
new GermanAnalyzer(Version.LUCENE_43));
Query query = parser.parse("suche");
TopDocs result = searcher.search(query, 10);
assertEquals(1, result.totalHits);
int id = result.scoreDocs[0].doc;
Document doc = searcher.doc(id);
String title = doc.get("title");
assertEquals(
"Suchen und Finden mit Lucene und Solr",
title);
Searching
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
WebappWebapp
Client Solr Lucene
http
XML, JSON, JavaBin, Ruby, ...
schema.xml
Field Types
Fields
Schema
<fieldType name="text_de" class="solr.TextField">
<analyzer>
<tokenizer
class="solr.StandardTokenizerFactory"/>
<filter
class="solr.LowerCaseFilterFactory"/>
<filter
class="solr.GermanLightStemFilterFactory"/>
</analyzer>
</fieldType>
Schema
<fields>
<field name="title" type="text_de"
indexed="true" stored="true"/>
<field name="speaker" type="string"
indexed="true" stored="true"
multiValued="true"/>
<field name="speaker_search" type="text_ws"
indexed="true" stored="false"
multiValued="true"/>
[...]
</fields>
<copyField source="speaker" dest="speaker_search"/>
Schema
SolrInputDocument document =
new SolrInputDocument();
document.addField("path", "/tmp/foo");
document.addField("title",
"Suchen und Finden mit Lucene und Solr");
document.addField("speaker", "Florian Hopf");
SolrServer server =
new HttpSolrServer("http://localhost:8080");
server.add(document);
server.commit();
Indexing
solrconfig.xml
Lucene Config
Caches
Request Handler
Search Components
Solrconfig
<requestHandler name="/jug"
class="solr.SearchHandler">
<lst name="defaults">
<int name="rows">10</int>
<str name="q.op">AND</str>
<str name="q.alt">*:*</str>
<str name="defType">edismax</str>
<str name="qf">
content
title^1.5
speaker_search
</str>
</lst>
</requestHandler>
Solrconfig
SolrQuery solrQuery = new SolrQuery("suche");
solrQuery.setQueryType("/jug");
QueryResponse response = server.query(solrQuery);
assertEquals(1, response.getResults().size());
SolrDocument result = response.getResults().get(0);
assertEquals(
"Suchen und Finden mit Lucene und Solr",
result.get("title"));
assertEquals(
"Florian Hopf",
result.getFirstValue("speaker"));
Searching
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
...
solrQuery.setFacet(true);
solrQuery.addFacetField("speaker");
QueryResponse response = server.query(solrQuery);
List<FacetField.Count> speakerFacet =
response.getFacetField("speaker").getValues();
assertEquals(1, speakerFacet.get(0).getCount());
assertEquals("Florian Hopf",
speakerFacet.get(0).getName());
Faceting
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
curl -XPOST 
'http://localhost:9200/jug/talk/' -d '{
"speaker" :
"Florian Hopf",
"date" :
"2012-07-04T19:15:00",
"title" :
"Suchen und Finden mit Lucene und Solr"
}'
{"ok":true,"_index":"jug","_type":"talk",
"_id":"CeltdivQRGSvLY_dBZv1jw","_version":1}
Indexing
curl -XPUT 
'http://host/jug/talk/_mapping' -d '{
"talk" : {
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "german"
}
}
}
}'
Mapping
curl -XGET 
'http://host/jug/talk/_search?q=title:suche'
{...},
"hits":{"total":1,"max_score":0.054244425,
"hits":[{
...,
"_score":0.054244425,
"_source" : {
"speaker" :
"Florian Hopf",
"date" :
"2012-07-04T19:15:00",
"title":
"Suchen und Finden mit Lucene und Solr"
}
}
}
Searching
curl -XGET
'http://localhost:9200/jug/talk/_search' -d '{
"query" : {
"query_string" : {"query" : "suche"}
},
"facets" : {
"tags" : {
"terms" : {"field" : "speaker"}
}
}
}'
Searching
QueryBuilder query = queryString("suche");
TermsFacetBuilder facet =
termsFacet("speaker").field("speaker");
SearchResponse response =
esClient.prepareSearch("jug")
.addFacet(facet)
.setQuery(query)
.execute().actionGet();
assertEquals(1, response.getHits().getTotalHits());
Searching
Verteilung
Verteilung
Suggestions
Geo-Suche
http://lucene.apache.org
http://lucene.apache.org/solr/
http://elasticsearch.org
https://github.com/fhopf/lucene-solr-talk
@fhopf
mail@florian-hopf.de
http://blog.florian-hopf.de
26.06. Heiko W. Rupp
„RHQ - aktuelle und kommende Entwicklungen“
„Testen von Hypermedia-APIs mit RestAssured“
10.07. Gerrit Grunwald
„Wie Phoenix aus der Asche…JavaFX 2.0“
25.09. Bernd Rücker
„Open Source BPM mit BPMN 2.0 und Java“
http://jug-ka.de
● http://www.morguefile.com/archive/display/3470
● http://www.flickr.com/photos/quinnanya/5196951914/
Quinn Dombrowski
● http://www.morguefile.com/archive/display/695239
● http://www.morguefile.com/archive/display/93433
● http://www.morguefile.com/archive/display/811746
● http://www.morguefile.com/archive/display/12965
● http://www.morguefile.com/archive/display/181488
● http://www.morguefile.com/archive/display/826258
Images

Weitere ähnliche Inhalte

Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)