{"id":65025,"date":"2017-04-12T13:00:31","date_gmt":"2017-04-12T10:00:31","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=65025"},"modified":"2023-12-11T10:18:28","modified_gmt":"2023-12-11T08:18:28","slug":"elasticsearch-java-developers-elasticsearch-ecosystem","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html","title":{"rendered":"Elasticsearch for Java Developers: Elasticsearch Ecosystem"},"content":{"rendered":"<p><em>This article is part of our Academy Course titled <a href=\"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-tutorial-java-developers.html\">Elasticsearch Tutorial for Java Developers<\/a>.<\/p>\n<p>In this course, we provide a series of tutorials so that you can develop your own Elasticsearch based applications. We cover a wide range of topics, from installation and operations, to Java API Integration and reporting. With our straightforward tutorials, you will be able to get your own projects up and running in minimum time. Check it out <a href=\"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-tutorial-java-developers.html\">here<\/a>!<\/em><\/p>\n<h2><a name=\"introduction\"><\/a>1. Introduction<\/h2>\n<p>In this last part of the tutorial we are going to look around and learn how perfectly <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> fits into Java ecosystem and inspires many interesting projects. One of the best ways to illustrate that is to take a look at the marriage of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> and <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> framework, an exceptionally beloved choice among Java developers for managing the persistence layer.<\/p>\n<div class=\"toc\">\n<h3>Table Of Contents<\/h3>\n<dl>\n<dt><a href=\"#introduction\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#hibernate\">2. Elasticsearch for Hibernate Users<\/a><\/dt>\n<dt><a href=\"#stack\">3. Elastic Stack: Get It All<\/a><\/dt>\n<dt><a href=\"#plugins\">4. Supercharge Elasticsearch with Plugins<\/a><\/dt>\n<dt><a href=\"#conclusions\">5. Conclusions<\/a><\/dt>\n<\/dl>\n<\/div>\n<p>Additionally, at the very end we are going to glance through a tremendously popular suite of the applications, known as <a href=\"https:\/\/www.elastic.co\/products\">Elastic Stack<\/a>, and what you could do with it. Although it goes well beyond Java applications only, it is hard to overestimate the value it offers to modern, highly distributed software systems.<\/p>\n<h2><a name=\"hibernate\"><\/a>2. Elasticsearch for Hibernate Users<\/h2>\n<p>It is practically impossible to find any Java developer out there who has not heard about the <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> framework. On the other hand, not so many developers know that there are quite a few projects hidden under the <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> umbrella and one of them is a real gem called <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a>.<\/p>\n<blockquote>\n<p><em>Hibernate Search transparently indexes your objects and offers fast regular, full-text and geolocation search. Ease of use and easy clustering are core. &#8211; <\/em><a href=\"http:\/\/hibernate.org\/search\/\"><em>http:\/\/hibernate.org\/search\/<\/em><\/a><\/p>\n<\/blockquote>\n<p><a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> has started as a simple glue layer between <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> and <a href=\"https:\/\/lucene.apache.org\/core\/\">Apache Lucene<\/a> and used to offer a very limited set of supported backends to manage search indices. But the situation is changing for the better with a <a href=\"http:\/\/in.relation.to\/2017\/02\/22\/hibernate-search-5-7-0-Final\/\">just recently<\/a> released final version of the <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> <code>5.7.0<\/code> along with full-fledged <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> support (while still bearing an <code>experimental<\/code> label). What it practically means is that if your persistence layer is managed by <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a>, then by plugging in <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> you could enrich your data model with full-text search capabilities, all that backed by <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>. Sounds exciting, right?<\/p>\n<p>To get a feeling of how things work under the hood, let us take a look at our <code>catalog<\/code> data model expressed in terms of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_Persistence_API\">JPA<\/a> entities decorated with <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> annotations, starting with the <code>Book<\/code> class.<\/p>\n<pre class=\"brush:java\">@Entity\n@Table(name = \"BOOKS\")\n@Indexed(index = \"catalog\")\npublic class Book {\n    @Id\n    @Field(name = \"isbn\", analyze = Analyze.NO)\n    private String id;\n\n    @Field\n    @Column(name = \"TITLE\", nullable = false)\n    private String title;\n\n    @IndexedEmbedded(depth = 1)\n    @ElementCollection\n    private Set categories = new HashSet&lt;&gt;(); \n\n    @Field(analyze = Analyze.NO)\n    @Column(name = \"PUBLISHER\", nullable = false)\n    private String publisher;\n    \n    @Field\n    @Column(name = \"DESCRIPTION\", nullable = false, length = 4096)\n    private String description;\n    \n    @Field(name = \"published_date\", analyze = Analyze.NO)\n    @Column(name = \"PUBLISHED_DATE\", nullable = false)\n    @DateBridge(resolution = Resolution.DAY)\n    private LocalDate publishedDate;\n\n    @NumericField @Field(name = \"rating\")\n    @Column(name = \"RATING\", nullable = false)\n    private int rating;\n    \n    @IndexedEmbedded\n    @ManyToMany\n    private Set authors = new HashSet();    \n}\n<\/pre>\n<p>For seasoned Java developers it is a familiar piece of code to describe persistent entities, with only a couple of <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> annotations (like <code>@Field<\/code>, <code>@DateBridge<\/code>, <code>@IndexedEmbedded<\/code>) added on top. \u00a0We are not going to discuss them here unfortunately, this topic itself is worth of <a href=\"http:\/\/www.javacodegeeks.com\/2015\/03\/hibernate-tutorial.html\">a complete tutorial<\/a> but please do not hesitate to refer to the <a href=\"https:\/\/docs.jboss.org\/hibernate\/stable\/search\/reference\/en-US\/html_single\/\">official documentation<\/a> for more details. With that being said, we just move on to the <code>Category<\/code> class.<\/p>\n<pre class=\"brush:java\">@Embeddable\npublic class Category {\n\t@Field(analyze = Analyze.NO)\n\t@Column(name = \"NAME\", nullable = false)\n\tprivate String name;\t\n}\n<\/pre>\n<p>Followed by the <code>Author<\/code> class right after.<\/p>\n<pre class=\"brush:java\">@Entity\n@Indexed(index = \"catalog\")\n@Table(name = \"AUTHORS\")\npublic class Author {\n    @Id\n    private String id;\n\n    @Field(name = \"first_name\", analyze = Analyze.NO)\n    @Column(name = \"FIRST_NAME\", nullable = false)\n    private String firstName;\n\n    @Field(name = \"last_name\", analyze = Analyze.NO)\n    @Column(name = \"LAST_NAME\", nullable = false)\n    private String lastName;\n}\n<\/pre>\n<p>Thanks to <a href=\"https:\/\/projects.spring.io\/spring-framework\/\">Spring Framework<\/a>, and particularly to <a href=\"https:\/\/projects.spring.io\/spring-boot\/\">Spring Boot<\/a> magic, the configuration of the <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> and <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> pointing to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> as the search backend is as easy as adding a couple of lines to <code>application.yml<\/code> file.<\/p>\n<pre class=\"brush:bash\">spring:\n  jpa:\n    properties:\n      hibernate:\n        search:\n          default:\n            indexmanager: elasticsearch\n            elasticsearch:\n                host: http:\/\/localhost:9200\n<\/pre>\n<p>Frankly speaking, you may need to tailor this configuration quite a bit to fit the needs of your applications, to our luck the <a href=\"https:\/\/docs.jboss.org\/hibernate\/search\/5.7\/reference\/en-US\/html_single\/#elasticsearch-integration\">official documentation<\/a> covers this part pretty well. Every time the instances of the <code>Book<\/code> or <code>Author<\/code> classes are created, modified or deleted, the <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> takes care of keeping <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> index in sync, it is completely transparent.<\/p>\n<p>How the search looks like? Well, <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> does provide its own <a href=\"https:\/\/docs.jboss.org\/hibernate\/stable\/search\/reference\/en-US\/html_single\/#_searching\">Query DSL<\/a> abstraction layer, based on <a href=\"https:\/\/lucene.apache.org\/core\/\">Apache Lucene<\/a> queries (at the same time <a href=\"https:\/\/docs.jboss.org\/hibernate\/stable\/search\/reference\/en-US\/html_single\/#_queries\">leaving a route<\/a> to use some native <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> features), for example:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">@Autowired private EntityManager entityManager;\n\t\nfinal FullTextEntityManager fullTextEntityManager = Search\n    .getFullTextEntityManager(entityManager);\n\t\t\nfinal QueryBuilder qb = fullTextEntityManager\n    .getSearchFactory()\n    .buildQueryBuilder()\n    .forEntity(Book.class)\n    .get();\n\t\t\nfinal FullTextQuery query = fullTextEntityManager\n    .createFullTextQuery(\n        qb.bool()\n            .must(\n                qb.keyword()\n                    .onField(\"categories.name\")\n                    .matching(\"analytics\")\n                    .createQuery()\n            )\n            .must(\n                qb.keyword()\n                    .onField(\"authors.last_name\")\n                    .matching(\"Tong\")\n                    .createQuery()\n            ).createQuery(), Book.class);\n\t\t\nfinal List books = query.getResultList();\n...\n<\/pre>\n<p>There are definitely a lot of similarities to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch&#8217;s<\/a> own <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/query-dsl.html\">Query DSL<\/a> so this code snippet should look already familiar to you. But before you get too excited, there are several limitations related to <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> and <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> integration. First of all, the latest version of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> which is supported by <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> at the moment is <code>2.4.4<\/code>. Not bad but quite far from the current <code>5.x<\/code> release branch, hopefully this is going to be addressed soon. Secondly, indeed, the subset of the <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> features exposed over the <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> APIs, in particular <a href=\"https:\/\/docs.jboss.org\/hibernate\/stable\/search\/reference\/en-US\/html_single\/#_searching\">Query DSL<\/a>, is quite limited but frankly speaking, might be enough for many applications.<\/p>\n<p>Anyway, why we are mentioning <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> in the first place? Simple, if your applications are built on top of <a href=\"http:\/\/hibernate.org\/\">Hibernate<\/a> persistence, using <a href=\"http:\/\/hibernate.org\/search\/\">Hibernate Search<\/a> is probably the fastest and cheapest way to benefit from full-text search capabilities for your data models, leveraging <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> behind the curtain.<\/p>\n<h2><a name=\"stack\"><\/a>3. Elastic Stack: Get It All<\/h2>\n<p>If you already run into mysterious <a href=\"https:\/\/www.elastic.co\/blog\/getting-started-with-elk\">ELK<\/a> abbreviation and were curious what it means than this section would help you to find the answers. <a href=\"https:\/\/www.elastic.co\/blog\/getting-started-with-elk\">ELK<\/a> is essentially a bundle of products, consisting of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">(E)lasticsearch<\/a>, <a href=\"https:\/\/www.elastic.co\/products\/logstash\">(L)ogstash<\/a> and <a href=\"https:\/\/www.elastic.co\/products\/kibana\">(K)ibana<\/a>, therefore just <a href=\"https:\/\/www.elastic.co\/blog\/getting-started-with-elk\">ELK<\/a> in short. Recently, with the addition of the <a href=\"https:\/\/www.elastic.co\/products\/beats\">Beats<\/a>, a new member of this awesome family, the <a href=\"https:\/\/www.elastic.co\/blog\/getting-started-with-elk\">ELK<\/a> is often referred as <a href=\"https:\/\/www.elastic.co\/products\/beats\">Elastic Stack<\/a> now.<\/p>\n<p>Undoubtedly, <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> is the heart and soul of <a href=\"https:\/\/www.elastic.co\/blog\/getting-started-with-elk\">ELK<\/a> so let us talk about what those other products are and why they are useful.<\/p>\n<blockquote>\n<p><a href=\"https:\/\/www.elastic.co\/products\/kibana\"><em>Kibana<\/em><\/a><em> lets you visualize your <\/em><a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\"><em>Elasticsearch<\/em><\/a><em> data and navigate the <\/em><a href=\"https:\/\/www.elastic.co\/products\/beats\"><em>Elastic Stack<\/em><\/a><em>, so you can do anything from learning why you&#8217;re getting paged at 2:00 a.m. to understanding the impact rain might have on your quarterly numbers. &#8211; <\/em><a href=\"https:\/\/www.elastic.co\/products\/kibana\"><em>https:\/\/www.elastic.co\/products\/kibana<\/em><\/a><\/p>\n<\/blockquote>\n<p>Basically, <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a> is just a web application which is capable of creating powerful charts and dashboards based on the data you are having indexed in <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>.<\/p>\n<blockquote>\n<p><a href=\"https:\/\/www.elastic.co\/products\/logstash\"><em>Logstash<\/em><\/a><em> is an open source, server-side data processing pipeline that ingests data from a multitude of sources simultaneously, transforms it, and then sends it to your favorite \u201cstash\u201d, f.e. <\/em><a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\"><em>Elasticsearch<\/em><\/a><em> &#8211; <\/em><a href=\"https:\/\/www.elastic.co\/products\/logstash\"><em>https:\/\/www.elastic.co\/products\/logstash<\/em><\/a><\/p>\n<\/blockquote>\n<p>Consequently, <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> is a terrific tool, capable of extracting, massaging and feeding the data to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> (and a myriad of other sources) which could be visualized using <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a> later on. The <a href=\"https:\/\/www.elastic.co\/products\/beats\">Beats<\/a> are quite close to <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> but are not yet so powerful.<\/p>\n<p><figure id=\"attachment_65033\" aria-describedby=\"caption-attachment-65033\" style=\"width: 758px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-stack-1-jcg-1.png\"><img decoding=\"async\" class=\"wp-image-65033 size-full\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-stack-1-jcg-1.png\" alt=\"Elastic Stack Illustrated\" width=\"758\" height=\"581\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-stack-1-jcg-1.png 758w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-stack-1-jcg-1-300x230.png 300w\" sizes=\"(max-width: 758px) 100vw, 758px\" \/><\/a><figcaption id=\"caption-attachment-65033\" class=\"wp-caption-text\">Elastic Stack Illustrated<\/figcaption><\/figure><\/p>\n<p>One of the areas where <a href=\"https:\/\/www.elastic.co\/products\/beats\">Elastic Stack<\/a> is exceptionally useful and leads the race is collecting and analyzing the massive amounts of application logs. It may sound not very convincing, why would you need such a complex system in order to tail\/grep over a log file? But at scale, when you deal with hundreds or even thousands of the applications (think <a href=\"https:\/\/martinfowler.com\/articles\/microservices.html\">microservices<\/a>), the benefits become very obvious: you suddenly have a centralized places where the logs from all the applications are streamed into and could be searched against, analyzed, correlated and visualized.<\/p>\n<p>Without any further talks, let us demonstrate how a typical <a href=\"https:\/\/projects.spring.io\/spring-boot\/\">Spring Boot<\/a> application could be configured to send its logs to <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a>, which is going to forward them to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> as-is, without \u00a0transformations applied. First, we need <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> to be installed, either as <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/docker.html\">Docker container<\/a> or just <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/installing-logstash.html\">running on local machine<\/a>, the <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/getting-started-with-logstash.html\">official documentation<\/a> presents the installation steps exceptionally well.<\/p>\n<p>The only thing we need to tell to <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> is where to get logs from (using <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/input-plugins.html\">input plugins<\/a>) and where to send the massaged logs to (using <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/output-plugins.html\">output plugins<\/a>), all that through <code>logstash.conf<\/code> configuration file.<\/p>\n<pre class=\"brush:bash\">input {\n    tcp {\n        port =&gt; 7760\n    }\n}\n\noutput {\n    elasticsearch {\n        hosts =&gt; [ \"localhost:9200\" ]\n    }\n}\n<\/pre>\n<p>The number of input and output plugins supported by <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> is astonishing. To keep the example very simple, we are going to deliver the logs over the <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/plugins-inputs-tcp.html\">TCP socket input plugin<\/a> and forward straight to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> using <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/plugins-outputs-elasticsearch.html\">Elasticsearch output plugin<\/a>.<\/p>\n<p>It looks great, but how we could send the logs from our Java applications to <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a>? There are many ways to do that and the easiest one is probably by leveraging the capabilities of your logging framework. Most of the Java applications these days rely on the awesome <a href=\"https:\/\/logback.qos.ch\/\">Logback<\/a> framework and the community has implemented dedicated <a href=\"https:\/\/github.com\/logstash\/logstash-logback-encoder\">Logback encoder<\/a> to be used along with <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a>.<\/p>\n<p>You just have to include an additional dependency into your project, like we do here, for example, using <a href=\"https:\/\/maven.apache.org\/\">Apache Maven<\/a>:<\/p>\n<pre class=\"brush:xml\">&lt;dependency&gt;\n    &lt;groupId&gt;net.logstash.logback&lt;\/groupId&gt;\n    &lt;artifactId&gt;logstash-logback-encoder&lt;\/artifactId&gt;\n    &lt;version&gt;4.9&lt;\/version&gt;\n&lt;\/dependency&gt;\n<\/pre>\n<p>And then add the <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> appender into your <code>logback.xml<\/code> configuration file. To be noted, there are several appenders available, the one we are interested in is <code>LogstashTcpSocketAppender<\/code> which talks to <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> over TCP socket. Please notice that the port under <code>destination<\/code> tag should match to your <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> input plugin configuration, in our case it is <code>7760<\/code>.<\/p>\n<pre class=\"brush:xml\">&lt;appender name=\"logstash\" class=\"net.logstash.logback.appender.LogstashTcpSocketAppender\"&gt;\n    &lt;destination&gt;localhost:7760&lt;\/destination&gt;\n    &lt;encoder class=\"net.logstash.logback.encoder.LogstashEncoder\" \/&gt;\n&lt;\/appender&gt;\n<\/pre>\n<p>By and large, this is all we have to do! The logs will be shipped from our application to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> and we could explore them using <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a> dashboards. When you <a href=\"https:\/\/www.elastic.co\/downloads\/kibana\">download<\/a> and run <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a> on your local machine, the web UI by default is available at <a href=\"http:\/\/localhost:5601\">http:\/\/localhost:5601<\/a>:<\/p>\n<p><figure id=\"attachment_65038\" aria-describedby=\"caption-attachment-65038\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard.png\"><img decoding=\"async\" class=\"wp-image-65038 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard-1024x495.png\" alt=\"Quick Kibana Dashboard\" width=\"620\" height=\"300\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard-1024x495.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard-300x145.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard-768x371.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/kibana-dashboard.png 1920w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><figcaption id=\"caption-attachment-65038\" class=\"wp-caption-text\">Quick Kibana Dashboard<\/figcaption><\/figure><\/p>\n<p>Easy, simple, powerful \u2026 the <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> way. The only thing to remember is that you should better use the same versions of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> , <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> and <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a>. As we have been using <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> <code>5.2.0<\/code> along this tutorial, <a href=\"https:\/\/www.elastic.co\/products\/logstash\">Logstash<\/a> and <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a> should also be of <code>5.2.0<\/code> release.<\/p>\n<p>If you already using <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> or are planning to do so, <a href=\"https:\/\/www.elastic.co\/products\/beats\">Elastic Stack<\/a> just opens a whole universe of interesting opportunities for you to discover and benefit from. Moreover, it is being constantly improved and enhanced with new features added every single release.<br \/>\n[ulp id=&#8217;lFK4fMZhpULqeQUl&#8217;]<br \/>\n&nbsp;<\/p>\n<h2><a name=\"plugins\"><\/a>4. Supercharge Elasticsearch with Plugins<\/h2>\n<p><a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> is wonderful but often command line tools or even Java APIs are not the best way to communicate with your clusters. Luckily, <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> has extensibility built-in from the early days in a form of plugins.<\/p>\n<p>There are <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/plugins\/current\/index.html\">many plugins<\/a> and accompanying tools available at the moment, but it is worth to talk about three of them:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/mobz\/elasticsearch-head\">elasticsearch-head<\/a>: a web front end for an <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> cluster<\/li>\n<li><a href=\"https:\/\/github.com\/royrusso\/elasticsearch-HQ\">elasticsearch-HQ<\/a>: monitoring, management, and querying web interface for <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/floragunncom\/search-guard\">search-guard<\/a>: security for <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a><\/li>\n<\/ul>\n<p>The <a href=\"https:\/\/github.com\/mobz\/elasticsearch-head\">elasticsearch-head<\/a> is, essentially, a full-fledged web interface to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>. Not only you have nice visual representations of indices and shards, you can also browse the documents, play with search queries and navigate through the results easily.<\/p>\n<p><figure id=\"attachment_65040\" aria-describedby=\"caption-attachment-65040\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg.png\"><img decoding=\"async\" class=\"wp-image-65040 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg-1024x342.png\" alt=\"An example of elasticsearch-head showing catalog index and cluster status\" width=\"620\" height=\"207\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg-1024x342.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg-300x100.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg-768x257.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/head-jcg.png 1314w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><figcaption id=\"caption-attachment-65040\" class=\"wp-caption-text\">An example of elasticsearch-head showing catalog index and cluster status<\/figcaption><\/figure><\/p>\n<p>The ability to run structured or arbitrary queries is very helpful, specifically if your query returns a lot of results and you need a convenient way to go through all of them.<\/p>\n<p>Another very interesting one is <a href=\"https:\/\/github.com\/royrusso\/elasticsearch-HQ\">elasticsearch-HQ<\/a> which basically put the focus on exposing operational information about <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> clusters and nodes. Unfortunately, as of moment of this writing, the <a href=\"https:\/\/github.com\/royrusso\/elasticsearch-HQ\">elasticsearch-HQ<\/a> does not support <code>5.x<\/code> release branch of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> but the work to make it happen has already begun.<\/p>\n<p><figure id=\"attachment_65042\" aria-describedby=\"caption-attachment-65042\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg.png\"><img decoding=\"async\" class=\"wp-image-65042 size-large\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg-1024x580.png\" alt=\"An example of elasticsearch-HQ showing catalog index and cluster status\" width=\"620\" height=\"351\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg-1024x580.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg-300x170.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg-768x435.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/hq-jcg.png 1300w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><figcaption id=\"caption-attachment-65042\" class=\"wp-caption-text\">An example of elasticsearch-HQ showing catalog index and cluster status<\/figcaption><\/figure><\/p>\n<p>Before we touch upon last plugin, the <a href=\"https:\/\/github.com\/floragunncom\/search-guard\">search-guard<\/a>, it would be good to talk about the state of security in <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>. In fact, we have better to say that out of the box <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> has nothing to offer in terms of security or alike (although this feature, along with many others, is available as part of commercial distribution of <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>). The <a href=\"https:\/\/github.com\/floragunncom\/search-guard\">search-guard<\/a> is the oldest community supported plugin which adds quite a lot of security capabilities to <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>. Please make sure to take a look at this one, if you are serious about running <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> in production, luckily it supports all recent <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> versions.<\/p>\n<h2><a name=\"conclusions\"><\/a>5. Conclusions<\/h2>\n<p>With this part, the \u201cElasticsearch for Java Developers\u201d series is coming to its logical end. Along this tutorial we have learned about <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a>, what it does and how to communicate with it using command line tools and its rich set of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Representational_state_transfer\">RESTful APIs<\/a>. We have also discussed different flavors of Java APIs available at the moment and briefly debated when to use one or another. And lastly, we have covered a flourishing ecosystem of projects (and products) which has emerged around <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> and heavily relies on it features.<\/p>\n<p>Hopefully, you have learned something along the way, and if you have hesitated before about giving <a href=\"https:\/\/www.elastic.co\/products\/elasticsearch\">Elasticsearch<\/a> a try or not, all your doubts should be cleared out now. It is a great product with terrific potential to solve wide range of hard problems and power your ideas to success.<\/p>\n<p>With that, best of luck on this journey! The complete source code for this article is <a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elasticsearch-hibernate-search.zip\">available here<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you can develop your own Elasticsearch based applications. We cover a wide range of topics, from installation and operations, to Java API Integration and reporting. With our straightforward tutorials, you &hellip;<\/p>\n","protected":false},"author":141,"featured_media":65382,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[732],"class_list":["post-65025","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-core-java","tag-elasticsearch"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-12T10:00:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-11T08:18:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andrey Redko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrey Redko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html\"},\"author\":{\"name\":\"Andrey Redko\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\"},\"headline\":\"Elasticsearch for Java Developers: Elasticsearch Ecosystem\",\"datePublished\":\"2017-04-12T10:00:31+00:00\",\"dateModified\":\"2023-12-11T08:18:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html\"},\"wordCount\":2045,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2017\\\/04\\\/elastic-logo.png\",\"keywords\":[\"Elasticsearch\"],\"articleSection\":[\"Core Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html\",\"name\":\"Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2017\\\/04\\\/elastic-logo.png\",\"datePublished\":\"2017-04-12T10:00:31+00:00\",\"dateModified\":\"2023-12-11T08:18:28+00:00\",\"description\":\"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2017\\\/04\\\/elastic-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2017\\\/04\\\/elastic-logo.png\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/04\\\/elasticsearch-java-developers-elasticsearch-ecosystem.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Core Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/core-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Elasticsearch for Java Developers: Elasticsearch Ecosystem\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\",\"name\":\"Andrey Redko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"caption\":\"Andrey Redko\"},\"description\":\"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\\\/EE, C#\\\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).\",\"sameAs\":[\"http:\\\/\\\/aredko.blogspot.com\\\/\",\"http:\\\/\\\/ca.linkedin.com\\\/in\\\/aredko\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/andrey-redko\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks","description":"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html","og_locale":"en_US","og_type":"article","og_title":"Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks","og_description":"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you","og_url":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2017-04-12T10:00:31+00:00","article_modified_time":"2023-12-11T08:18:28+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png","type":"image\/png"}],"author":"Andrey Redko","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Andrey Redko","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html"},"author":{"name":"Andrey Redko","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413"},"headline":"Elasticsearch for Java Developers: Elasticsearch Ecosystem","datePublished":"2017-04-12T10:00:31+00:00","dateModified":"2023-12-11T08:18:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html"},"wordCount":2045,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png","keywords":["Elasticsearch"],"articleSection":["Core Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html","url":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html","name":"Elasticsearch for Java Developers: Elasticsearch Ecosystem - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png","datePublished":"2017-04-12T10:00:31+00:00","dateModified":"2023-12-11T08:18:28+00:00","description":"This article is part of our Academy Course titled Elasticsearch Tutorial for Java Developers. In this course, we provide a series of tutorials so that you","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/04\/elastic-logo.png","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2017\/04\/elasticsearch-java-developers-elasticsearch-ecosystem.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Core Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/core-java"},{"@type":"ListItem","position":4,"name":"Elasticsearch for Java Developers: Elasticsearch Ecosystem"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413","name":"Andrey Redko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","caption":"Andrey Redko"},"description":"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\/EE, C#\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).","sameAs":["http:\/\/aredko.blogspot.com\/","http:\/\/ca.linkedin.com\/in\/aredko"],"url":"https:\/\/www.javacodegeeks.com\/author\/andrey-redko"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/65025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/141"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=65025"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/65025\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/65382"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=65025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=65025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=65025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}