elasticsearch und die java-welt
TRANSCRIPT
![Page 1: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/1.jpg)
und die Java-Welt
Florian Hopf@fhopf
![Page 2: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/2.jpg)
Elasticsearch?
„Elasticsearch is a distributed, open source search and analytics engine, designed for horizontal scalability, reliability, and easy management.“
![Page 3: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/3.jpg)
Elasticsearch?
„Elasticsearch is a distributed, open source search and analytics engine, designed for horizontal scalability, reliability, and easy management.“
![Page 4: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/4.jpg)
Elasticsearch?
![Page 5: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/5.jpg)
Installation
# download archivewget https://download.elastic.co/elasticsearch
/elasticsearch/elasticsearch-1.7.2.zip
# zip is for windows and linuxunzip elasticsearch-1.7.2.zip
# on windows: elasticsearch.batelasticsearch-1.7.2/bin/elasticsearch
![Page 6: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/6.jpg)
Zugriff per HTTP
curl -XGET "http://localhost:9200"
{ "status": 200, "name": "Ultron", "cluster_name": "elasticsearch", "version": { "number" : "1.7.2", "build_hash" : "e43676b1385b8125...", "build_timestamp" : "2015-09-14T09:49:53Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline": "You Know, for Search"}
![Page 7: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/7.jpg)
Indizierung
curl -XPOST "http://localhost:9200/library/book" -d'{ "title": "Elasticsearch in Action", "author": [ "Radu Gheorghe",
"Matthew Lee Hinman", "Roy Russo" ],
"published": "2015-06-30T00:00:00.000Z", "publisher": { "name": "Manning", "country": "USA" }}'
![Page 8: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/8.jpg)
Suche
curl -XPOST "http://localhost:9200/library/book/_search?q=elasticsearch"
{[...]
"hits": { "hits": [ { "_index": "library", "_type": "book", "_source": { "title": "Elasticsearch in Action",
[...]
![Page 9: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/9.jpg)
Suche per Query DSL
curl -XPOST "http://localhost:9200/library/book/_search" -d'{ "query": { "filtered": { "query": { "match": { "title": "elasticsearch" } }, "filter": { "term": { "publisher.name": "manning" } } } }}'
![Page 10: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/10.jpg)
Recap
● Auf Java basierender Suchserver● HTTP und JSON● Suche und Filterung über Query-DSL● Facettierung über Aggregations● Highlighting, Suggestions, ...
![Page 11: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/11.jpg)
Elasticsearch?
„Elasticsearch is a distributed, open source search and analytics engine, designed for horizontal scalability, reliability, and easy management.“
![Page 12: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/12.jpg)
Verteilung
![Page 13: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/13.jpg)
Verteilung
![Page 14: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/14.jpg)
Verteilung
![Page 15: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/15.jpg)
Suche im Cluster
![Page 16: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/16.jpg)
Suche im Cluster
![Page 17: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/17.jpg)
Recap
● Knoten können Cluster bilden● Datenverteilung durch Sharding● Replicas zur Lastverteilung und
Ausfallsicherheit● Verteilte Suche● Cluster-Zustand auf jedem Knoten
![Page 18: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/18.jpg)
Standard-Client
![Page 19: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/19.jpg)
Java!
dependencies { compile group: 'org.elasticsearch', name: 'elasticsearch', version: '1.7.2'}
![Page 20: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/20.jpg)
Java!
TransportAddress address = new InetSocketTransportAddress("localhost", 9300);
Client client = new TransportClient(). addTransportAddress(address);
![Page 21: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/21.jpg)
Suche per Query DSL
curl -XPOST "http://localhost:9200/library/book/_search" -d'{ "query": { "filtered": { "query": { "match": { "title": "elasticsearch" } }, "filter": { "term": { "publisher.name": "manning" } } } }}'
![Page 22: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/22.jpg)
Suche über Java-Client
SearchResponse searchResponse = client .prepareSearch("library") .setQuery(filteredQuery( matchQuery("title", "elasticsearch"), termFilter("publisher.name", "manning"))) .execute().actionGet();
assertEquals(1, searchResponse.getHits().getTotalHits());
SearchHit hit = searchResponse.getHits().getAt(0);assertEquals("Elasticsearch in Action", hit.getSource().get("title"));
![Page 23: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/23.jpg)
Indizierung über Java-Client
XContentBuilder jsonBuilder = jsonBuilder() .startObject() .field("title", "Elasticsearch") .field("author", "Florian Hopf") .startObject("publisher") .field("name", "dpunkt") .endObject() .endObject();
client.prepareIndex("library", "book") .setSource(jsonBuilder) .execute().actionGet();
![Page 24: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/24.jpg)
Indizierung über Java-Client
![Page 25: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/25.jpg)
Transport-Client
● Verbindet sich mit bestehendem Cluster
TransportAddress address = new InetSocketTransportAddress("localhost", 9300);
Client client = new TransportClient(). addTransportAddress(address);
![Page 26: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/26.jpg)
Transport-Client
![Page 27: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/27.jpg)
Node-Client
Node node = nodeBuilder().client(true).node();
Client client = node.client();
![Page 28: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/28.jpg)
Node-Client
● Startet eigenen Knoten● Anwendung wird Teil des Clusters
Node node = nodeBuilder().client(true).node();
Client client = node.client();
![Page 29: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/29.jpg)
Node-Client
![Page 30: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/30.jpg)
Standard-Client
● Volle API-Unterstützung● Effiziente Kommunikation● Node-Client
● Cluster-State spart unnötige Hops
![Page 31: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/31.jpg)
Standard-Client Gotchas
● Elasticsearch-Version Client == Server● Node-Client
● Bei Start und Stop wird Cluster-State übertragen● Speicherverbrauch● Elasticsearch-Dependency
![Page 32: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/32.jpg)
Jest – Http Client
![Page 33: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/33.jpg)
Jest
![Page 34: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/34.jpg)
Jest
dependencies { compile group: 'io.searchbox', name: 'jest', Version: '0.1.6'}
![Page 35: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/35.jpg)
Client
JestClientFactory factory = new JestClientFactory();factory.setHttpClientConfig(new HttpClientConfig .Builder("http://localhost:9200") .multiThreaded(true) .build());
JestClient client = factory.getObject();
![Page 36: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/36.jpg)
Suche mit Jest
String query = jsonStringThatMagicallyAppears;
Search search = new Search.Builder(query) .addIndex("library") .build();
SearchResult result = client.execute(search);assertEquals(Integer.valueOf(1), result.getTotal());
![Page 37: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/37.jpg)
Suche mit Jest
JsonObject jsonObject = result.getJsonObject();JsonObject hitsObj = jsonObject.getAsJsonObject("hits");JsonArray hits = hitsObj.getAsJsonArray("hits");JsonObject hit = hits.get(0).getAsJsonObject();
// ... more boring code
![Page 38: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/38.jpg)
Suche mit Jest
public class Book {
private String title; private List<String> author; private Publisher publisher;
public Publisher getPublisher() { return publisher; }
public void setPublisher(Publisher publisher) { this.publisher = publisher; }
// more code}
![Page 39: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/39.jpg)
Suche mit Jest
Book book = result.getFirstHit(Book.class).source;
assertEquals("Elasticsearch in Action", book.getTitle());
![Page 40: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/40.jpg)
Jest
● Alternative HTTP-Implementierung● Queries als String oder per Elasticsearch-
Builder● Indizieren und Suchen per Java-Beans
![Page 41: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/41.jpg)
Spring Data Elasticsearch
![Page 42: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/42.jpg)
Spring Data
● Abstraktionen für Data-Stores● Spezialitäten bleiben erhalten● Dynamische Repository-Implementierung● Populäre Implementierungen
● Spring Data JPA● Spring Data MongoDB
![Page 43: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/43.jpg)
Dependency
dependencies {compile group: 'org.springframework.data',
name: 'spring-data-elasticsearch', version: '1.2.0.RELEASE'}
![Page 44: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/44.jpg)
Entity
@Document( indexName = "library", type = "book")public class Book {
private String id; private String title; private List<String> author; private Publisher publisher;
// more code
}
![Page 45: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/45.jpg)
Repository
public interface BookRepository extends ElasticsearchCrudRepository<Book, String> {
public Iterable<Book> findByTitle(String title);
}
![Page 46: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/46.jpg)
Configuration
<elasticsearch:node-client id="client" />
<bean name="elasticsearchTemplate" class="o.s.d.elasticsearch.core.ElasticsearchTemplate"> <constructor-arg name="client" ref="client"/></bean>
<elasticsearch:repositories base-package="de.fhopf.elasticsearch.springdata" />
![Page 47: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/47.jpg)
Indexing
Book book = new Book();book.setTitle("Elasticsearch");book.setAuthor(Arrays.asList("Florian Hopf"));book.setPublisher(new Publisher("dpunkt"));
repository.save(book);
![Page 48: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/48.jpg)
Searching
Iterable<Book> books = repository.findAll();
books = repository.findByTitle("Elasticsearch");
![Page 49: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/49.jpg)
Recap
● Abstraktion über Elasticsearch● Entity-Beans● Dynamische Repository-Implementierung
● Junges Projekt
![Page 50: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/50.jpg)
Recap
● Standard-Client● Node- oder Transport-Client
● Jest● Http-Client mit Java-Bean-Unterstützung
● Spring-Data-Elasticsearch● Annotationzentrierte Konfiguration, dynamische
Repository-Implementierungen
![Page 51: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/51.jpg)
JVM?
● Clojure: Elastisch● Standard-Client oder HTTP
● Groovy: elasticsearch-groovy● Standard-Client, Closure-Unterstützung
● Scala: große Auswahl, z.B. elastic4s● Standard-Client, Type-Safety
![Page 52: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/52.jpg)
Links
● https://www.found.no/foundation/java-clients-for-elasticsearch/
● http://elastic.co● https://github.com/searchbox-io/Jest● https://github.com/spring-projects/spring-
data-elasticsearch● http://blog.florian-hopf.de
![Page 53: Elasticsearch und die Java-Welt](https://reader034.vdokument.com/reader034/viewer/2022042515/58eccc311a28ab8e588b45c9/html5/thumbnails/53.jpg)
Weitere Infos