<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mats Lindh &#187; Search Results  &#187;  solrj</title>
	<atom:link href="http://e-mats.org/search/solrj/feed/rss2/" rel="self" type="application/rss+xml" />
	<link>http://e-mats.org</link>
	<description>Where desperate is just another word for a regular day.</description>
	<lastBuildDate>Wed, 01 Feb 2012 14:42:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>2009 In Retrospect</title>
		<link>http://e-mats.org/2010/01/2009-in-retrospect/</link>
		<comments>http://e-mats.org/2010/01/2009-in-retrospect/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 10:00:44 +0000</pubDate>
		<dc:creator>Mats</dc:creator>
				<category><![CDATA[The Blog Itself]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[new year]]></category>
		<category><![CDATA[popular posts]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://e-mats.org/?p=664</guid>
		<description><![CDATA[As we&#8217;re now getting a bit more touchy and feely about 2010, I&#8217;ll give a short update on the blog itself like I did at the last day of 2008 (and even the title has been recycled! again! The big trend of 2009!). Key statistics (last year&#8217;s number in paranthesis) (2008 was the first year [...]]]></description>
			<content:encoded><![CDATA[<p>As we&#8217;re now getting a bit more touchy and feely about 2010, I&#8217;ll give a short update on the blog itself like <a href="http://e-mats.org/2008/12/2008-in-retrospect/">I did at the last day of 2008</a> (and even the title has been recycled! again! The big trend of 2009!).</p>
<p>Key statistics (last year&#8217;s number in paranthesis) (2008 was the first year I blogged, so 2009 is the first complete year of data):</p>
<ul>
<li>Posts: <strong>54</strong> (161)</li>
<li>Comments: <strong>81</strong> (89)</li>
<li>Hits: <strong>399084</strong> (242781)</li>
<li>Unique: <strong>30561</strong> (18882) (since the start)</li>
<li>Spam caught by akismet: <strong>11828</strong> (2596)</li>
<li>Most spammed month: <strong>May, 4123</strong> (November)</li>
<li>Technorati Authority: 99 (13)</li>
<li>Technorati Rank: 78.215 (454.532)</li>
<li>Reactions registered on Technorati: no idea how to find this now! (51)</li>
<li>Incoming links (to e-mats.org) on Google: 187 (29)</li>
<li>Incoming links (to e-mats.org) on Google Blogsearch: 30 (23)</li>
</ul>
<p>Most popular referers:</p>
<ol>
<li>google.com</li>
<li>search.live.com</li>
<li>google.co.uk</li>
<li>google.de</li>
<li>google.co.in</li>
<li>google.ca</li>
<li>google.fr</li>
<li>en.blog.wordpress.com</li>
<li>google.nl</li>
<li>google.com.au</li>
<li>google.pl</li>
<li>google.se</li>
</ol>
<p>At least two weren&#8217;t Google!</p>
<p>Stats I didn&#8217;t include last year, but decided to include this year (the numbers for last year in paranthesis as above) from Google Analytics:</p>
<ul>
<li>Page Views: 49.403 (21.997) (+125%)</li>
<li>Visits: 38.537 (16.082) (+139%)</li>
<li>Search Engine Referers: 85.4% (70.8%) (+20%)</li>
</ul>
<p>Most popular search terms (and some of the most popular posts):</p>
<ol>
<li><a href="http://e-mats.org/?s=solrj">solrj</a></li>
<li><a href="http://e-mats.org/2008/05/adding-an-external-svn-resource-with-tortoise/">svn external</a></li>
<li><a href="http://e-mats.org/2008/07/ssh_exchange_identification-connection-closed-by-remote-host/">ssh_exchange_identification: connection timed out</a></li>
<li><a href="http://e-mats.org/2008/04/using-solrj-a-short-guide-to-getting-started-with-solrj/">solrj example</a></li>
<li><a href="http://e-mats.org/2008/05/adding-an-external-svn-resource-with-tortoise/">tortoise svn externals</a></li>
</ol>
<p>And then we look ahead for the same post in 2011. Keep your pants on!</p>
]]></content:encoded>
			<wfw:commentRss>http://e-mats.org/2010/01/2009-in-retrospect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solr: Using the dismax Query Handler and Still Limit a Specific Field</title>
		<link>http://e-mats.org/2008/04/solr-using-the-dismax-query-handler-and-still-limit-a-specific-field/</link>
		<comments>http://e-mats.org/2008/04/solr-using-the-dismax-query-handler-and-still-limit-a-specific-field/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 19:06:26 +0000</pubDate>
		<dc:creator>Mats</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://push.lindh.no/~mats/wordpress/wordpress/?p=18</guid>
		<description><![CDATA[While working with the facets for our search result earlier today, I came across the need to limit the search against solr on one specific field in addition to our regular search string (which we run against several fields with different weights). The situation was something like this: Lastname AggregateSearchField AggregatePhoneticSearchField We do the searches [...]]]></description>
			<content:encoded><![CDATA[<p>While working with the facets for our search result earlier today, I came across the need to limit the search against solr on one specific field in addition to our regular search string (which we run against several fields with different weights). The situation was something like this:</p>
<ul>
<li>Lastname</li>
<li>AggregateSearchField</li>
<li>AggregatePhoneticSearchField</li>
</ul>
<p>We do the searches against the AggregateSearchField and the AggregatePhoneticSearchField, where we weight the exact match higher than the phonetic matches. This ensure that the more specific matches are ranked higher than those that are merely similiar. We do this for several different field groupings, but that&#8217;s not revelant for this post, so let&#8217;s just assume that these are the three fields relevant. We search against two of them, and uses Lastname as a facet / navigator field to allow users to get more specific with their search.</p>
<p>However, while users should be allowed to get more specific with their search when selecting one of the facets, it should not change their regular search. And since the dismax handler will search through all the allowed field for a given value, you cannot just append Lastname:facetValue to the search string and be done with it (dismax does not support fielded searches through the regular query). After a bit of searching through our friends over at Google, I finally stumbled across the solution (which I of course should have seen on the Solr wiki): use the fq-parameter. This allows you to submit a &#8220;<a href='http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758577506d6002'>Filter Query</a>&#8221; in your request, which will be used to further filter your existing query through another set of queries. This fits very neatly in with keeping your original query and then appending filter queries for each facet limitation that gets set.</p>
<p>A small code example for Solrj: (filterQueries is a HashMap&lt;String, String&gt; which contains the facets; filterQueries.put(&#8220;Lastname&#8221;, &#8220;Smith&#8221;) will add a limitation on the field &#8220;Lastname&#8221; being &#8220;Smith&#8221; (you might want to escape &#8220;-s in the facet values)):</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>filterQueries <span class="sy0">!</span>= <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">String</span> q : filterQueries.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> value = filterQueries.<span class="me1">get</span><span class="br0">&#40;</span>q<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">addFilterQuery</span><span class="br0">&#40;</span>q + <span class="st0">&quot;:<span class="es0">\&quot;</span>&quot;</span> + value + <span class="st0">&quot;<span class="es0">\&quot;</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// this adds Lastname:&quot;Smith&quot; as a filter query</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So now we can just parse the query string for valid facet limitations, and set the fields in the filterQueries HashMap accordingly. As we already have a list of facet fields to include, this is a simple as iterating that list and checking for the parameters in the request variables.</p>
<p>A great thank you to Mike Klaas in the <a href='http://www.nabble.com/DisMaxHandler-and-plone-advanced-searches-td15459191.html'>dismax and Plone</a> thread indexed by nabble.com that sent me in the right direction.</p>
]]></content:encoded>
			<wfw:commentRss>http://e-mats.org/2008/04/solr-using-the-dismax-query-handler-and-still-limit-a-specific-field/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Using Solrj &#8211; A short guide to getting started with Solrj</title>
		<link>http://e-mats.org/2008/04/using-solrj-a-short-guide-to-getting-started-with-solrj/</link>
		<comments>http://e-mats.org/2008/04/using-solrj-a-short-guide-to-getting-started-with-solrj/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 20:33:00 +0000</pubDate>
		<dc:creator>Mats</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[solrj]]></category>

		<guid isPermaLink="false">http://push.lindh.no/~mats/wordpress/wordpress/?p=4</guid>
		<description><![CDATA[As Solrj – The Java Interface for Solr – is slated for being released together with Solr 1.3, it&#8217;s time to take a closer look! Solrj is the preferred, easiest way of talking to a Solr server from Java (unless you&#8217;re using Embedded Solr). This way you get everything in a neat little package, and [...]]]></description>
			<content:encoded><![CDATA[<p>As Solrj – The Java Interface for Solr – is slated for being released together with Solr 1.3, it&#8217;s time to take a closer look! Solrj is the preferred, easiest way of talking to a Solr server from Java (unless you&#8217;re using Embedded Solr). This way you get everything in a neat little package, and can avoid parsing and working with XML etc directly. Everything is tucked neatly away under a few classes, and since the web generally lacks a good example of how to use SolrJ, I&#8217;m going to share a small class I wrote for testing the data we were indexing at work. As Solr 1.2 is the currently most recent version available at apache.org, you&#8217;ll have to take a look at <a href="http://people.apache.org/builds/lucene/solr/nightly/">the Apache Solr Nightly Builds</a> website and download the latest version. The documentation is also contained in the archive, so if you&#8217;re going to do any serious solrj development, this is the place to do it.</p>
<p>Oh well, enough of that, let&#8217;s cut to the chase. We start by creating a <strong>CommonsHttpSolrServer</strong> instance, which we provide with the URL of our Solr server as the only argument in the constructor. You may also provide your own parsers, but I&#8217;ll leave that for those who need it. I don&#8217;t. By default your Solr-installation is running on port 8080 and under the solr directory, but you&#8217;ll have to accomodate your own setup here. I&#8217;ve included <a title="SolrjTest.java" href="/uploads/Solrj/SolrjTest.java">the complete source file</a> for download.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> SolrjTest</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> query<span class="br0">&#40;</span><span class="kw3">String</span> q<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CommonsHttpSolrServer server = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; server = <span class="kw2">new</span> CommonsHttpSolrServer<span class="br0">&#40;</span><span class="st0">&quot;http://localhost:8080/solr/&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The next thing we&#8217;re going to do is to actually create the query we&#8217;re about to ask the Solr server about, and this means building a SolrQuery object. We simply instanciate the object and then start to set the query values to what we&#8217;re looking for. The setQueryType call can be dropped to use the default QueryType-handler, but as we currently use dismax, this is what I&#8217;ve used here. You can then also turn on Facet-ing (to create navigators/facets) and add the fields you want for those.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; SolrQuery query = <span class="kw2">new</span> SolrQuery<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">setQuery</span><span class="br0">&#40;</span>q<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">setQueryType</span><span class="br0">&#40;</span><span class="st0">&quot;dismax&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">setFacet</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">addFacetField</span><span class="br0">&#40;</span><span class="st0">&quot;firstname&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">addFacetField</span><span class="br0">&#40;</span><span class="st0">&quot;lastname&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">setFacetMinCount</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">setIncludeScore</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Then we simply query the server by calling server.query, which takes our parameters, build the query URL, sends it to the server and parses the response for us.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QueryResponse qr = server.<span class="me1">query</span><span class="br0">&#40;</span>query<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>This result can then be fetched by calling .getResults(); on the QueryResponse object; qr.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SolrDocumentList sdl = qr.<span class="me1">getResults</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>We then output the information fetched in the query. You can change this to print all fields or other stuff, but as this is a simple application for searching a database of names, we just collect the first and last name of each entry and print them out. Before we do that, we print a small header containing information about the query, such as the number of elements found and which element we started on.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Found: &quot;</span> + sdl.<span class="me1">getNumFound</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Start: &quot;</span> + sdl.<span class="me1">getStart</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Max Score: &quot;</span> + sdl.<span class="me1">getMaxScore</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrayList<span class="sy0">&lt;</span>HashMap<span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;&gt;</span> hitsOnPage = <span class="kw2">new</span> ArrayList<span class="sy0">&lt;</span>HashMap<span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>SolrDocument d : sdl<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HashMap<span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;</span> values = <span class="kw2">new</span> HashMap<span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>Iterator<span class="sy0">&lt;</span>Map.<span class="me1">Entry</span><span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;&gt;</span> i = d.<span class="me1">iterator</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> i.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Map</span>.<span class="me1">Entry</span><span class="sy0">&lt;</span>String, Object<span class="sy0">&gt;</span> e2 = i.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.<span class="me1">put</span><span class="br0">&#40;</span>e2.<span class="me1">getKey</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, e2.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hitsOnPage.<span class="me1">add</span><span class="br0">&#40;</span>values<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>values.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;displayname&quot;</span><span class="br0">&#41;</span> + <span class="st0">&quot; (&quot;</span> + values.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;displayphone&quot;</span><span class="br0">&#41;</span> + <span class="st0">&quot;)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>After this we output the facets and their information, just so you can see how you&#8217;d go about fetching this information from Solr too:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span>FacetField<span class="sy0">&gt;</span> facets = qr.<span class="me1">getFacetFields</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>FacetField facet : facets<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span>FacetField.<span class="me1">Count</span><span class="sy0">&gt;</span> facetEntries = facet.<span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>FacetField.<span class="me1">Count</span> fcount : facetEntries<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>fcount.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot;: &quot;</span> + fcount.<span class="me1">getCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">catch</span> <span class="br0">&#40;</span>SolrServerException e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; SolrjTest solrj = <span class="kw2">new</span> SolrjTest<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; solrj.<span class="me1">query</span><span class="br0">&#40;</span>args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And there you have it, a very simple application to just test the interface against Solr. You&#8217;ll need to add the jar-files from the <strong>lib/</strong>-directory in the solrj archive (and from the solr library itself) to compile and run the example.</p>
<p>Download: <a href="/uploads/SolrjTest.java">SolrTest.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://e-mats.org/2008/04/using-solrj-a-short-guide-to-getting-started-with-solrj/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>Solrj and JSTL EL: java.lang.NumberFormatException</title>
		<link>http://e-mats.org/2008/04/solrj-and-jstl-el-javalangnumberformatexception/</link>
		<comments>http://e-mats.org/2008/04/solrj-and-jstl-el-javalangnumberformatexception/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 15:03:11 +0000</pubDate>
		<dc:creator>Mats</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://push.lindh.no/~mats/wordpress/wordpress/?p=7</guid>
		<description><![CDATA[While working with a view of a collection of documents returned from Solr using Solrj earlier today, I was attempting to write out the number of documents found in the search. In pure Java code you&#8217;d just request this by just calling .getNumFound() on the SolrDocumentList containing your documents, which whould also mean that they [...]]]></description>
			<content:encoded><![CDATA[<p>While working with a view of a collection of documents returned from Solr using Solrj earlier today, I was attempting to write out the number of documents found in the search. In pure Java code you&#8217;d just request this by just calling .getNumFound() on the SolrDocumentList containing your documents, which whould also mean that they should be available through EL in JSTL by calling ${solrDocumentList.numFound} (which in turn calls getNumFound() in the SolrDocumentList object).  The code in question was as simple as:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;c:out</span> <span class="re0">value</span>=<span class="st0">&quot;${solrDocumentList.numFound}&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
</ol>
</div>
<p>Which resulted in this error message, which kind of came as a surprise:</p>
<pre>
java.lang.NumberFormatException: For input string: "numFound"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:447)
        at java.lang.Integer.parseInt(Integer.java:497)
</pre>
<p>After digging around a bit and reading the error message yet again, it suddenly hit me: $solrDocumentList was being interpreted and casted to a List, and as such, EL expected an index into the List instead of my call to a function. I&#8217;ve not been working with JSTL for too long, so I thought a bit about how to solve this. One solution would be to do the calls in the Action and then just map them to separate variables in the template, but this wasn&#8217;t really as pretty as it could be. Instead I wrote a simple wrapper around the SolrDocumentList, which is not a list in itself, but exposes all the elements through it&#8217;s getDocumentList-method. That way we can access it in the template by calling ${solrDocumentList.documentList&#8230;}.</p>
<p>I&#8217;ve included the simple, simple wrapper here. It should be expanded with access to Facet fields etc, but this should be a simple indicator of my suggested solution.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SolrSearchResult</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SolrDocumentList resultDocuments = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> SolrSearchResult<span class="br0">&#40;</span>SolrDocumentList results<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">resultDocuments</span> = results<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">long</span> getNumFound<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>.<span class="me1">resultDocuments</span>.<span class="me1">getNumFound</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">long</span> getStart<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>.<span class="me1">resultDocuments</span>.<span class="me1">getStart</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">float</span> getMaxScore<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>.<span class="me1">resultDocuments</span>.<span class="me1">getMaxScore</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> SolrDocumentList getDocumentList<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>.<span class="me1">resultDocuments</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setDocumentList<span class="br0">&#40;</span>SolrDocumentList results<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">resultDocuments</span> = results<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Any comments and updates are of course as always welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://e-mats.org/2008/04/solrj-and-jstl-el-javalangnumberformatexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

