{"id":476,"date":"2009-07-22T20:47:39","date_gmt":"2009-07-22T19:47:39","guid":{"rendered":"http:\/\/blog.jteam.nl\/?p=476"},"modified":"2009-07-22T20:47:39","modified_gmt":"2009-07-22T19:47:39","slug":"enterprise-search-introduction-to-solr","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/","title":{"rendered":"Enterprise Search: Introduction to Solr"},"content":{"rendered":"<p>From day one, we at JTeam were very much occupied with pushing new revolutionary open source technologies that can bring real value to us and to our customers. We were there when Spring just started and we helped making it what it is today. We were one of the first companies to use Hibernate in real world projects (I reckon the first version we used was 0.4), and contributed to (back then) innovative new front end technologies like Ajax and DWR. With time, these technologies became mainstream and for a while it seemed that they just fulfilled every bit of our needs where JEE development is\u00a0 concerned. Yet something was still missing. About 3 years ago, we started noticing a new and growing trend in the market \u2013 a new demand \u2013 demand for search. Customers started paying more attention to the \u201cfindability\u201d aspect in their offerings, be it an e-commerce website offering faceted navigation to its users, or proprietary search solutions on top large service management systems. The trend was obvious, the demand was there, and we had to deliver. We started by implementing our own custom solutions based on the brilliant Lucene library, but then came Solr and once again revolutionized our JEE development.<\/p>\n<p>My goal in this post is to introduce you to Solr. Not too fancy, but to give you just a taste and enough information to at least get started with it. In future posts, I hope to expand on this and show you how you can leverage some of Solr&#8217;s features to implement some really cool stuff.<br \/>\n<!--more--><\/p>\n<h2>So what is Solr?<\/h2>\n<p>Solr is an apache project which can be described in many ways. Some like to see it as an open source enterprise search platform rivaling well established commercial offerings like Autonomy, Fast, and Dieselpoint. But it&#8217;s very hard to get a really good grasp of what Solr is and what it does with this definition, especially as the phrase \u201cEnterprise Search Platform\u201d has different meanings for different people. I like to view Solr as an attempt to gather all the experience people have had over the years developing search solutions with Lucene and build a search platform based on these experiences and all the known (and unknown) best practices.<em> <\/em><\/p>\n<p><em>NOTE: For those who are not familiar with Lucene, it is a low level IR (Information Retrieval) library implemented in Java. With Lucene you can index textual data and execute free text search on it in a highly performant manner.<\/em><em><\/em><\/p>\n<p>So what&#8217;s the purpose of it all? Well, I guess it depends on who you&#8217;re asking and on the context in which search is applied. For example, if you&#8217;re a web developer looking to integrate search in a web site, Solr can be a perfect fit for you. It can be installed as a standalone server and exposes its search functionality via a REST-like API (which also makes it language independent so it doesn&#8217;t matter whether you develop in Java, PHP, .NET or any other preferred language\/platform). Also note that the core search functionality that is supported out of the box by Solr is probably more than enough to what most websites require.<\/p>\n<p>That&#8217;s all well, but Solr is by far not limited to website search. It is not for nothing that it is often compared with Fast, Dieselpoint or other enterprise search platforms. You can build quite large scale and complex search solutions with it and the list of high profile companies (CNet,\u00a0 AOL, Digg, and more) already using it to power their search requirements is a testimony for that.<\/p>\n<h2>Getting Solr up and running<\/h2>\n<p>You can get Solr up and running in practically no time. You&#8217;ll first need to download it from the following site: http:\/\/www.apache.org\/dyn\/closer.cgi\/lucene\/solr.<\/p>\n<p>Once downloaded, you can extract the compressed archive (zip or gzip \u2013 depending one your platform) anywhere you want on your file system. I would now like you to pay attention to two folders in the extracted directory \u2013 <em>dist<\/em> and <em>example<\/em>.<\/p>\n<p>As I already mentioned, Solr is essentially a search server implemented in Java. It is actually, a standard web application that can be deployed in a normal servlet container such as Tomcat. In the <em>dist<\/em> folder, you can find the war file for this server (along with several other jar files which serve for different purposes&#8230; well&#8230; I&#8217;ll cover them in a later post). But as you probably know, it&#8217;s always a bit of a hustle to work with war files \u2013 you first need to set up a servlet container, then you need to set up a few environment variables, then deploy the war, etc, etc, etc&#8230; Luckily, the developers of Solr acknowledged that and decided to make it even easier for you to get started with it, hence the <em>example<\/em> folder. This folder contains a Solr distribution bundled with a Jetty server. Here is the layout of the example folder:<\/p>\n<p><figure id=\"attachment_477\" aria-describedby=\"caption-attachment-477\" style=\"width: 282px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-477\" title=\"Example Folder\" src=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png\" alt=\"Example Folder Layout\" width=\"282\" height=\"327\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2009\/07\/example-dir.png 282w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2009\/07\/example-dir-259x300.png 259w\" sizes=\"auto, (max-width: 282px) 100vw, 282px\" \/><figcaption id=\"caption-attachment-477\" class=\"wp-caption-text\">Example Folder Layout<\/figcaption><\/figure><\/p>\n<p>Now, all you need to do to start Solr server, is run the following command from this folder:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\njava -jar start.jar\n<\/pre>\n<p>Congrats! You are now running a Solr server.<\/p>\n<h2>Interacting with Solr<\/h2>\n<p>Now that you have Solr up and running, it&#8217;s time to do something with it. As a search service, the two main operations that Solr supports are indexing and searching. First, you need to send Solr data to index after which you&#8217;ll be able to perform free text search on this data. But what is this data and how does it look like?<\/p>\n<h3>A world of Documents<\/h3>\n<p>In Java, we&#8217;re used to model the world in terms of objects and properties. In the IR world, the world is modeled as Documents and fields. A Document represents a unit of data and is made up of one or more fields. A field is a simple text based name-value pair which holds the actual data. For example, a web page can be represented as a document with 3 fields &#8211; URL, title, and body:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-485\" title=\"webpage\" src=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/webpage.gif\" alt=\"webpage\" width=\"339\" height=\"219\" \/><\/p>\n<p>And here&#8217;s how you can model a person as a Document:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-486\" title=\"person\" src=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/person.gif\" alt=\"person\" width=\"274\" height=\"197\" \/><\/p>\n<h3>Indexing Documents<\/h3>\n<p>Now that you understand how data is represented in Solr, it is time to send Solr a few documents to be indexed. For that, we&#8217;ll used yet another useful tool that Solr ships with. In the <em>example\/exampledocs<\/em> directory you will find several XML files and a <em>post.jar<\/em> file. The latter, is a tool which can post document files to Solr to be indexed. If you open one of the XML files, you&#8217;ll see that each file actually holds an XML structure that represents an \u201cadd\u201d command. The <em>post.jar<\/em> accepts a list of files as an argument and send these files to Solr using HTTP POST request to a dedicated \u201cupdate\u201d URL. Make sure that Solr is running, and execute the following command:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\njava -jar post.jar *.xml\n<\/pre>\n<p>When executed, this command will send all documents in all XML files to Solr. After they&#8217;ve all been sent, a \u201ccommit\u201d command is sent which makes these documents available for search.<\/p>\n<p><em>NOTE: without committing the documents will still be indexed, but they will not be available for search until either a \u201ccommit\u201d is executed, or the Solr server is restarted. Luckily, the post.jar tool sends a \u201ccommit\u201d request automatically after sending the documents.<\/em><\/p>\n<h3>Searching for documents<\/h3>\n<p>We managed to index some documents in Solr, all that is left now is to search for them. Just like Solr has a dedicated URL for indexing documents, it also has a dedicated URL for searching for documents (actually, there can be more than one such URL but I won&#8217;t get into that right now). By default, the search URL is:<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/select\">http:\/\/localhost:8983\/solr\/select<\/a><\/pre>\n<p>But (as you may already have tried and realized) opening this URL in the browser results in an exception. The reason for this is quite simply due to the fact that no search query was specified. To do that, just add a \u201cq\u201d request parameter which holds the free text you want to search, for example:<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/select?q=*:*\">http:\/\/localhost:8983\/solr\/select?q=*:*<\/a><\/pre>\n<p><em>NOTE: the \u201c*.*\u201d represents a \u201cmatch all\u201d query. When executing this query, it&#8217;s as if you&#8217;re asking Solr to return all the documents it has indexed.<\/em><\/p>\n<p>The result returned from Solr for this query is an XML document containing some meta data over the request and query execution (e.g. how long did the search take), and also a list of the matched documents (also referred to as \u201csearch hits\u201d). Notice, that it&#8217;s only a partial list of the documents \u2013 while the <em>\u201cnumFound\u201d<\/em> attribute of the <em>&lt;result&gt;<\/em> element shows that 26 documents were found, only 10 are actually returned. There&#8217;s a very good reason for that \u2013 as Solr is designed to index millions of documents, it make very little sense to return such large search results at once. Therefore, Solr returns the results one \u201cpage\u201d at a time. By default the page size is 10 and if not specified otherwise the first page is returned (that is, the first 10 documents). You can control this behavior by providing 2 extra parameters \u2013 <em>rows<\/em> (determine the page size) and <em>start<\/em> (determines the zero-based index of the first document in the page):<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/select?q=*:*&amp;rows=5&amp;start=1\">http:\/\/localhost:8983\/solr\/select?q=*:*&amp;rows=5&amp;start=1<\/a><\/pre>\n<h3>Understanding and controlling the returned result<\/h3>\n<p>As you can see in the returned XML, each document in the result is returned with its fields. When configuring Solr, one can specify the schema of the index. I will not go into it right now, but in general, the schema determines what fields (name and type) a document is expected to have and also how should Solr handle them. Fields can be handled in 3 ways:<\/p>\n<ul>\n<li><strong><em>Indexed<\/em><\/strong> &#8211; a field value is being broken into tokens which are filtered and indexed so it will be possible to search on it<\/li>\n<li><strong><em>Stored<\/em><\/strong> &#8211; a field value is stored as a whole so when the document is read from the index the original field value can be restored.<\/li>\n<li><strong><em>Index<\/em> and <em>Stored<\/em><\/strong> &#8211; the two combined<\/li>\n<\/ul>\n<p>The fields that are returned in the result set document are only those fields that are stored. If a field is not stored, Solr has no way of reconstructing its original value from the index. It is also possible to explicitly specify which fields you&#8217;d like to be returned. This feature is quite handy when you have very high performance requirements. Reading the stored field values from the index takes time and narrowing this operation only for those fields which you really need may help you to boost performance a bit. This fine control over returned fields is done using the <em>fl<\/em> parameter. This parameter accepts a comma (or space) separated list of fields that you&#8217;d like to be returned. There is one special field called <em>score<\/em> which is not part of the original document, but instead holds the search score of the document for the performed search. Here&#8217;s an example of the same request we executed above, only this time, we only return the the <em>id<\/em> and the <em>score<\/em> of the document:<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/select?q=*:*&amp;rows=5&amp;start=1&amp;fl=id,score\">http:\/\/localhost:8983\/solr\/select?q=*:*&amp;rows=5&amp;start=1&amp;fl=id,score<\/a><\/pre>\n<p><em>NOTE: For the \u201cmatch all\u201d query, the score for all document is identical and equals to 1.0.<\/em><\/p>\n<h3>Sorting<\/h3>\n<p>By default, the search hits are sorted by their score in a descending manner (highest score first). It is however possible to request to sort based on other field values. To do this, you can add the [sort] parameter to the request. This parameter can hold a comma separated list of sort \u201cspecification\u201d where each specification defines the fields to sort on and the direction of the sort (ascending\/descending). When multiple sort specifications are set, the search result will be sorted on each specification in turn. For example, let&#8217;s say the following request is sent:<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/select?q=montior&amp;sort=score desc,name asc\">http:\/\/localhost:8983\/solr\/select?q=montior&amp;sort=score+desc,name+asc<\/a><\/pre>\n<p>The search hits will first be sorted on their score, then all hits with the same score will be sorted on their name in an ascending manner.<\/p>\n<h3>Query Syntax<\/h3>\n<p>So far, we&#8217;ve seen two types of queries \u2013 free text queries (like the \u201cmonitor\u201d in the example above) and \u201cmatch all\u201d query (*:*). The truth is, that Solr supports a much richer query syntax than this. Here are two examples of more advanced search queries:<\/p>\n<ul>\n<li><em>q=\u201dname:john\u201d<\/em> &#8211; perform free text search on specific fields<\/li>\n<li><em>q=\u201dage:[0 TO 20]\u201d<\/em> &#8211; perform a range query on the [age] field.<\/li>\n<li><em>q=\u201dname:john AND age:[0 TO 20]\u201d<\/em> &#8211; It is possible to compose queries with boolean constructs (AND, OR, NOT)<\/li>\n<\/ul>\n<p>For the full specification of the search syntax, please visit: http:\/\/wiki.apache.org\/solr\/SolrQuerySyntax<\/p>\n<h3>SolrJ<\/h3>\n<p>Up until now, we used the browser to interact with Solr. But it is more likely that you&#8217;ll be using Solr services from another application. To simplify this type of communication, client libraries where developed for the most common development languages. SolrJ is such a library developed in Java (You can find the SolrJ jar in the <em>dist<\/em> directory as described above). Here&#8217;s a small snippet of code that demonstrates how you can use SolrJ to connect to a Solr server, index documents and search on them:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nSolrServer server = new CommonsHttpSolrServer(&quot;http:\/\/localhost:8983&quot;);\n\nSolrInputDocument doc = new SolrInputDocument();\ndoc.addField(&quot;firstName&quot;, &quot;John&quot;);\ndoc.addField(&quot;lastName&quot;, &quot;Doe&quot;);\ndoc.addField(&quot;age&quot;, &quot;25&quot;);\nserver.add(doc);\nserver.commit();\n\nSolrQuery query = new SolrQuery(&quot;name:John&quot;)\n  .addField(&quot;score&quot;)\n  .addField(&quot;id&quot;)\n  .addSortField(&quot;age&quot;, SolrQuery.ORDER.asc);\n\nQueryResponse response = server.query(query);\nfor (SolrDocument hit : response.getResults()) {\n  for (String fieldName : hit.getFieldNames()) {\n    System.out.println(fieldName + &quot;: &quot; + hit.get(fieldName));\n  }\n  System.out.println();\n}\n<\/pre>\n<h3>Admin Site<\/h3>\n<p>Before I end this post and let you have a go at it on your own, there&#8217;s one more thing you might like to play around with. Solr comes with an out of the box administration site from which you can monitor its working at runtime. It also enables you to perform simple searches (without having to build the request URL manually yourself) and provide other cool functionality which we haven&#8217;t covered yet (For example, you can view the different stages of the analysis process for field values that are being index \u2013 this can help you fine tune and debug the schema configuration). Assuming Solr is still running, the following URL will take you to the admin site:<\/p>\n<pre><a href=\"http:\/\/localhost:8983\/solr\/admin\">http:\/\/localhost:8983\/solr\/admin<\/a><\/pre>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-509\" title=\"solr-admin\" src=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/solr-admin1.png\" alt=\"solr-admin\" width=\"817\" height=\"458\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2009\/07\/solr-admin1.png 817w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2009\/07\/solr-admin1-300x168.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2009\/07\/solr-admin1-768x431.png 768w\" sizes=\"auto, (max-width: 817px) 100vw, 817px\" \/><\/h3>\n<h3>Final words<\/h3>\n<p>Well.. this is it for this post. I tried to give you a short introduction to Solr and some of its very basic features. Nowadays, I find it hard to point to a project we&#8217;re implementing in JTeam that doesn&#8217;t have something to do with search. Simply put, Solr is practically integrated in every project that we&#8217;re doing, and the interesting things is, that we always start small (only using it&#8217;s basic functionality) but as the customer realizes the possibilities, Solr ends up one of the main driving forces behind the systems we develop. If you haven&#8217;t tried it until now, I truly recommend you to do so in your next project&#8230; you&#8217;ll be presently surprised.<\/p>\n<p>As for me and this post, this is just the beginning. We&#8217;ve been doing with Solr so much and it has given us so much in return, we&#8217;re very eager to share this with the rest of the world. So if you&#8217;re interested, keep a close watch on <a href=\"http:\/\/blog.jteam.nl\/\">JTeam&#8217;s blog<\/a> and on more specifically our <a href=\"http:\/\/blog.jteam.nl\/category\/enterprise-search\/\">Enterprise Search<\/a> category.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From day one, we at JTeam were very much occupied with pushing new revolutionary open source technologies that can bring real value to us and to our customers. We were there when Spring just started and we helped making it what it is today. We were one of the first companies to use Hibernate in [&hellip;]<\/p>\n","protected":false},"author":119,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[15,10],"tags":[35,33,16,11,9,17],"class_list":["post-476","post","type-post","status-publish","format-standard","hentry","category-enterprise-search","category-development","tag-lucene","tag-solr","tag-enterprise-search","tag-java","tag-open-source","tag-search"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Enterprise Search: Introduction to Solr - Trifork Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Enterprise Search: Introduction to Solr - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"From day one, we at JTeam were very much occupied with pushing new revolutionary open source technologies that can bring real value to us and to our customers. We were there when Spring just started and we helped making it what it is today. We were one of the first companies to use Hibernate in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2009-07-22T19:47:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png\" \/>\n<meta name=\"author\" content=\"Uri Boness\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Uri Boness\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/\",\"url\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/\",\"name\":\"Enterprise Search: Introduction to Solr - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png\",\"datePublished\":\"2009-07-22T19:47:39+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/7f03d47df88743fb65fb3ed95fb58881\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage\",\"url\":\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png\",\"contentUrl\":\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enterprise Search: Introduction to Solr\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/7f03d47df88743fb65fb3ed95fb58881\",\"name\":\"Uri Boness\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/789965d306e51c2ce0f5765f76464e5e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/789965d306e51c2ce0f5765f76464e5e?s=96&d=mm&r=g\",\"caption\":\"Uri Boness\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/uri\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Enterprise Search: Introduction to Solr - Trifork Blog","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:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/","og_locale":"en_US","og_type":"article","og_title":"Enterprise Search: Introduction to Solr - Trifork Blog","og_description":"From day one, we at JTeam were very much occupied with pushing new revolutionary open source technologies that can bring real value to us and to our customers. We were there when Spring just started and we helped making it what it is today. We were one of the first companies to use Hibernate in [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/","og_site_name":"Trifork Blog","article_published_time":"2009-07-22T19:47:39+00:00","og_image":[{"url":"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png","type":"","width":"","height":""}],"author":"Uri Boness","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Uri Boness","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/","url":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/","name":"Enterprise Search: Introduction to Solr - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png","datePublished":"2009-07-22T19:47:39+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/7f03d47df88743fb65fb3ed95fb58881"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#primaryimage","url":"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png","contentUrl":"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2009\/07\/example-dir.png"},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/enterprise-search-introduction-to-solr\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Enterprise Search: Introduction to Solr"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/7f03d47df88743fb65fb3ed95fb58881","name":"Uri Boness","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/789965d306e51c2ce0f5765f76464e5e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/789965d306e51c2ce0f5765f76464e5e?s=96&d=mm&r=g","caption":"Uri Boness"},"url":"https:\/\/trifork.nl\/blog\/author\/uri\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/119"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=476"}],"version-history":[{"count":0,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/476\/revisions"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}