blob: ad2afa9d78067e3071bcffc200b7a0d361d6a250 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="SMILA/Documentation/Solr,SMILA/Documentation/Search" />
<link rel="shortcut icon" href="http://wiki.eclipse.org/SMILA/Documentation/favicon.ico" />
<link rel="search" type="application/opensearchdescription+xml" href="http://wiki.eclipse.org/opensearch_desc.php" title="Eclipsepedia (English)" />
<link rel="alternate" type="application/rss+xml" title="Eclipsepedia RSS Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=rss" />
<link rel="alternate" type="application/atom+xml" title="Eclipsepedia Atom Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=atom" />
<title>SMILA/Documentation/Solr - Eclipsepedia</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "/skins/eclipsenova/novaWide.css?116"; /*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="http://wiki.eclipse.org/skins/eclipsenova/eclipsenovaPrint.css?116" />
<link rel="stylesheet" type="text/css" media="handheld" href="http://wiki.eclipse.org/skins/eclipsenova/handheld.css?116" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/header.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/tabs.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/visual.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/layout.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/footer.css" media="screen" />
<!--[if IE]><link rel="stylesheet" type="text/css" href="/skins/eclipsenova/IEpngfix.css" media="screen" /><![endif]-->
<!--[if lt IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE50Fixes.css?116";</style> <![endif]-->
<!--[if IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE55Fixes.css?116";</style><![endif]-->
<!--[if IE 6]><style type="text/css">@import "/skins/eclipsenova/IE60Fixes.css?116";</style><![endif]-->
<!--[if IE 7]><style type="text/css">@import "/skins/eclipsenova/IE70Fixes.css?116";</style><![endif]-->
<!--[if lt IE 7]><script type="text/javascript" src="/skins/common/IEFixes.js?116"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "eclipsenova";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgScript = "/index.php";
var wgServer = "http://wiki.eclipse.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "SMILA/Documentation/Solr";
var wgTitle = "SMILA/Documentation/Solr";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "32450";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "261200";
var wgVersion = "1.12.0";
var wgEnableAPI = true;
var wgEnableWriteAPI = false;
/*]]>*/</script>
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/wikibits.js?116"><!-- wikibits js --></script>
<!-- Performance mods similar to those for bug 166401 -->
<script type="text/javascript" src="http://wiki.eclipse.org/index.php?title=-&amp;action=raw&amp;gen=js&amp;useskin=eclipsenova"><!-- site js --></script>
<!-- Head Scripts -->
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/ajax.js?116"></script>
<style type="text/css">/*<![CDATA[*/
.source-text {line-height: normal; font-size: medium;}
.source-text li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for text
* CSS class: source-text, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-text .de1, .source-text .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-text {}
.source-text .head {}
.source-text .foot {}
.source-text .imp {font-weight: bold; color: red;}
.source-text .ln-xtra {color: #cc0; background-color: #ffc;}
.source-text li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-text li.li2 {font-weight: bold;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><style type="text/css">/*<![CDATA[*/
.source-xml {line-height: normal; font-size: medium;}
.source-xml li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for xml
* CSS class: source-xml, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-xml .de1, .source-xml .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-xml {}
.source-xml .head {}
.source-xml .foot {}
.source-xml .imp {font-weight: bold; color: red;}
.source-xml .ln-xtra {color: #cc0; background-color: #ffc;}
.source-xml li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-xml li.li2 {font-weight: bold;}
.source-xml .coMULTI {color: #808080; font-style: italic;}
.source-xml .es0 {color: #000099; font-weight: bold;}
.source-xml .br0 {color: #66cc66;}
.source-xml .st0 {color: #ff0000;}
.source-xml .nu0 {color: #cc66cc;}
.source-xml .sc0 {color: #00bbdd;}
.source-xml .sc1 {color: #ddbb00;}
.source-xml .sc2 {color: #339933;}
.source-xml .sc3 {color: #009900;}
.source-xml .re0 {color: #000066;}
.source-xml .re1 {font-weight: bold; color: black;}
.source-xml .re2 {font-weight: bold; color: black;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><style type="text/css">/*<![CDATA[*/
.source-java {line-height: normal; font-size: medium;}
.source-java li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for java
* CSS class: source-java, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-java .de1, .source-java .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-java {}
.source-java .head {}
.source-java .foot {}
.source-java .imp {font-weight: bold; color: red;}
.source-java .ln-xtra {color: #cc0; background-color: #ffc;}
.source-java li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-java li.li2 {font-weight: bold;}
.source-java .kw1 {color: #7F0055; font-weight: bold;}
.source-java .kw2 {color: #7F0055; font-weight: bold;}
.source-java .kw3 {color: #000000; font-weight: normal}
.source-java .kw4 {color: #7F0055; font-weight: bold;}
.source-java .co1 {color: #3F7F5F; font-style: italic;}
.source-java .co2 {color: #3F7F5F;}
.source-java .co3 {color: #3F7F5F; font-style: italic; font-weight: bold;}
.source-java .coMULTI {color: #3F5FBF; font-style: italic;}
.source-java .es0 {color: #000000;}
.source-java .br0 {color: #000000;}
.source-java .st0 {color: #2A00ff;}
.source-java .nu0 {color: #000000;}
.source-java .me1 {color: #000000;}
.source-java .me2 {color: #000000;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><link rel="stylesheet" type="text/css" href="Solr.html" /> </head>
<body class="mediawiki ns-0 ltr page-SMILA_Documentation_Solr">
<div id="globalWrapper">
<div id="column-one">
<!-- Eclipse Additions for the Top Nav start here M. Ward-->
<div id="header">
<div id="header-graphic">
<img src="http://wiki.eclipse.org/skins/eclipsenova/eclipse.png" alt="Eclipse Wiki">
</div>
<!-- Pulled 101409 Mward -->
<div class="portlet" id="p-personal">
<div class="pBody">
<ul>
<li id="pt-login"><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Solr">Log in</a></li>
</ul>
</div>
</div>
<div id="header-icons">
<div id="sites">
<ul id="sitesUL">
<li><a href="http://www.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/eclipseIcon.png" width="28" height="28" alt="Eclipse Foundation" title="Eclipse Foundation" /><div>Eclipse Foundation</div></a></li>
<li><a href="http://marketplace.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/marketplace.png" width="28" height="28" alt="Eclipse Marketplace" title="Eclipse Marketplace" /><div>Eclipse Marketplace</div></a></li>
<li><a href="https://bugs.eclipse.org/bugs"><img src="http://dev.eclipse.org/custom_icons/system-search-bw.png" width="28" height="28" alt="Bugzilla" title="Bugzilla" /><div>Bugzilla</div></a></li>
<li><a href="http://live.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/audio-input-microphone-bw.png" width="28" height="28" alt="Live" title="Live" /><div>Eclipse Live</div></a></li>
<li><a href="http://planeteclipse.org"><img src="http://dev.eclipse.org/large_icons/devices/audio-card.png" width="28" height="28" alt="PlanetEclipse" title="Planet" /><div>Planet Eclipse</div></a></li>
<li><a href="http://portal.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/preferences-system-network-proxy-bw.png" width="28" height="28" alt="Portal" title="Portal" /><div>My Foundation Portal</div></a></li>
</ul>
</div>
</div>
</div>
<!-- NEW HEADER STUFF HERE -->
<div id="header-menu">
<div id="header-nav">
<ul> <li><a class="first_one" href="http://wiki.eclipse.org/" target="_self">Home</a></li> <li><a href="http://www.eclipse.org/downloads/" target="_self">Downloads</a></li>
<li><a href="http://www.eclipse.org/users/" target="_self">Users</a></li>
<li><a href="http://www.eclipse.org/membership/" target="_self">Members</a></li>
<li><a href="http://wiki.eclipse.org/index.php/Development_Resources" target="_self">Committers</a></li>
<li><a href="http://www.eclipse.org/resources/" target="_self">Resources</a></li>
<li><a href="http://www.eclipse.org/projects/" target="_self">Projects</a></li>
<li><a href="http://www.eclipse.org/org/" target="_self">About Us</a></li>
</ul>
</div>
<div id="header-utils">
<!-- moved the search window here -->
<form action="http://wiki.eclipse.org/Special:Search" >
<input class="input" name="search" type="text" accesskey="f" value="" />
<input type='submit' onclick="this.submit();" name="go" id="searchGoButton" class="button" title="Go to a page with this exact name if one exists" value="Go" />&nbsp;
<input type='submit' onclick="this.submit();" name="fulltext" class="button" id="mw-searchButton" title="Search Eclipsepedia for this text" value="Search" />
</form>
</div>
</div>
<!-- Eclipse Additions for the Header stop here -->
<!-- Additions and mods for leftside nav Start here -->
<!--Started nav rip here-->
<!-- these are the nav controls main page, changes etc -->
<div id="novaContent" class="faux">
<div id="leftcol">
<ul id="leftnav">
<!-- these are the page controls, edit history etc -->
<li class="separator"><a class="separator">Navigation &#160;&#160;</li>
<li id="n-mainpage"><a href="http://wiki.eclipse.org/Main_Page">Main Page</a></li>
<li id="n-portal"><a href="http://wiki.eclipse.org/Eclipsepedia:Community_Portal">Community portal</a></li>
<li id="n-currentevents"><a href="http://wiki.eclipse.org/Eclipsepedia:Current_events">Current events</a></li>
<li id="n-recentchanges"><a href="http://wiki.eclipse.org/Special:Recentchanges">Recent changes</a></li>
<li id="n-randompage"><a href="http://wiki.eclipse.org/Special:Random">Random page</a></li>
<li id="n-help"><a href="http://wiki.eclipse.org/Help:Contents">Help</a></li>
<li class="separator"><a class="separator">Toolbox &#160;&#160;</a></li>
<li id="t-whatlinkshere"><a href="http://wiki.eclipse.org/Special:Whatlinkshere/SMILA/Documentation/Solr">What links here</a></li>
<li id="t-recentchangeslinked"><a href="http://wiki.eclipse.org/Special:Recentchangeslinked/SMILA/Documentation/Solr">Related changes</a></li>
<!-- This is the toolbox section -->
<li id="t-upload"><a href="http://wiki.eclipse.org/Special:Upload">Upload file</a></li>
<li id="t-specialpages"><a href="http://wiki.eclipse.org/Special:Specialpages">Special pages</a></li>
<li id="t-print"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Solr&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Solr&amp;oldid=261200">Permanent link</a></li> </ul>
</div>
<!-- Additions and mods for leftside nav End here -->
<div id="column-content">
<div id="content">
<a name="top" id="top"></a>
<div id="tabs">
<ul class="primary">
<li class="active"><a href="Solr.html"><span class="tab">Page</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Talk:SMILA/Documentation/Solr&amp;action=edit"><span class="tab">Discussion</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Solr&amp;action=edit"><span class="tab">View source</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Solr&amp;action=history"><span class="tab">History</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Solr"><span class="tab">Edit</span></a></li>
</ul>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<h1 class="firstHeading">SMILA/Documentation/Solr</h1>
<div id="bodyContent">
<h3 id="siteSub">From Eclipsepedia</h3>
<div id="contentSub"><span class="subpages">&lt; <a href="../../SMILA.html" title="SMILA">SMILA</a> | <a href="../Documentation.html" title="SMILA/Documentation">Documentation</a></span></div>
<div id="jump-to-nav">Jump to: <a href="Solr.html#column-one">navigation</a>, <a href="Solr.html#searchInput">search</a></div> <!-- start content -->
<p>Solr is an open source search server based on the Lucene search engine. In addition to a powerful full-text-search, sorting and filtering, Solr comes with a lot of built-in features like highlighting, facets, auto-suggest and spell checking.
</p>
<div class="messagebox" style="background-color: #def3fe; border: 1px solid #c5d7e0; color: black; padding: 5px; margin: 1ex 0; min-height: 35px; padding-left: 45px;">
<div style="float: left; margin-left: -40px;"><a href="http://wiki.eclipse.org/Image:Note.png" class="image" title="Note.png"><img alt="" src="http://wiki.eclipse.org/images/c/cc/Note.png" width="35" height="35" border="0" /></a></div>
<div><b>The current implementation is a Work In Progress. The goal is to use this implementation as the default search implementation for SMILA replacing the current embedded Lucene integration. As a consequence things are likely to change in future versions. So stay tuned.</b><br /></div>
</div>
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="Solr.html#SolrServerManager_.26_SolrProperties"><span class="tocnumber">1</span> <span class="toctext">SolrServerManager &amp; SolrProperties</span></a></li>
<li class="toclevel-1"><a href="Solr.html#Default_configuration"><span class="tocnumber">2</span> <span class="toctext">Default configuration</span></a>
<ul>
<li class="toclevel-2"><a href="Solr.html#schema.xml"><span class="tocnumber">2.1</span> <span class="toctext">schema.xml</span></a></li>
<li class="toclevel-2"><a href="Solr.html#solrconfig.xml"><span class="tocnumber">2.2</span> <span class="toctext">solrconfig.xml</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="Solr.html#How_to_use_Solr_with_SMILA"><span class="tocnumber">3</span> <span class="toctext">How to use Solr with SMILA</span></a>
<ul>
<li class="toclevel-2"><a href="Solr.html#Indexing_data"><span class="tocnumber">3.1</span> <span class="toctext">Indexing data</span></a></li>
<li class="toclevel-2"><a href="Solr.html#Search"><span class="tocnumber">3.2</span> <span class="toctext">Search</span></a></li>
<li class="toclevel-2"><a href="Solr.html#Search_Pipelet_Config"><span class="tocnumber">3.3</span> <span class="toctext">Search Pipelet Config</span></a></li>
<li class="toclevel-2"><a href="Solr.html#Solr_Specific_Search_Record"><span class="tocnumber">3.4</span> <span class="toctext">Solr Specific Search Record</span></a>
<ul>
<li class="toclevel-3"><a href="Solr.html#Standard_Parameters"><span class="tocnumber">3.4.1</span> <span class="toctext">Standard Parameters</span></a></li>
<li class="toclevel-3"><a href="Solr.html#Highlighting"><span class="tocnumber">3.4.2</span> <span class="toctext">Highlighting</span></a></li>
<li class="toclevel-3"><a href="Solr.html#Facets"><span class="tocnumber">3.4.3</span> <span class="toctext">Facets</span></a></li>
<li class="toclevel-3"><a href="Solr.html#Solr_Specific_Parameters_.28_solr.query.29"><span class="tocnumber">3.4.4</span> <span class="toctext">Solr Specific Parameters (_solr.query)</span></a>
<ul>
<li class="toclevel-4"><a href="Solr.html#Filters"><span class="tocnumber">3.4.4.1</span> <span class="toctext">Filters</span></a></li>
<li class="toclevel-4"><a href="Solr.html#Shards"><span class="tocnumber">3.4.4.2</span> <span class="toctext">Shards</span></a></li>
<li class="toclevel-4"><a href="Solr.html#Solr_Request_Handler"><span class="tocnumber">3.4.4.3</span> <span class="toctext">Solr Request Handler</span></a></li>
<li class="toclevel-4"><a href="Solr.html#SolrQueryBuilder"><span class="tocnumber">3.4.4.4</span> <span class="toctext">SolrQueryBuilder</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="Solr.html#Auxillary_Search_Functions"><span class="tocnumber">3.4.5</span> <span class="toctext">Auxillary Search Functions</span></a>
<ul>
<li class="toclevel-4"><a href="Solr.html#Auto-suggest.2FTerms"><span class="tocnumber">3.4.5.1</span> <span class="toctext">Auto-suggest/Terms</span></a></li>
<li class="toclevel-4"><a href="Solr.html#Spellcheck_.28Did_you_mean.29"><span class="tocnumber">3.4.5.2</span> <span class="toctext">Spellcheck (Did you mean)</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="SolrServerManager_.26_SolrProperties"></a><h1> <span class="mw-headline"> SolrServerManager &amp; SolrProperties </span></h1>
<p>Solr can run as stand alone remote server as well as embedded server within SMILA. There exist a properties file to control the running mode: <tt>configuration/org.eclipse.smila.solr/solr.properties</tt>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-text">##### If true SMILA load default configuration for an embedded Solr instance (see below) #####
solr.embedded=true
&nbsp;
##### Alternative workspace folder equals solr.home (embedded only) #####
solr.workspaceFolder=./workspace/.metadata/.plugins/org.eclipse.smila.solr
&nbsp;
##### Server url for http connections to Solr server (remote only) #####
solr.serverUrl=http://localhost:8983/solr</pre></div>
<a name="Default_configuration"></a><h1> <span class="mw-headline"> Default configuration </span></h1>
<p>SMILA supports Solr only in multicore setup (core is the solr word for a search index), regardless whether Solr runs embedded or remote.
</p><p>The default configuration included in SMILA is defined in <tt>configuration/org.eclipse.smila.solr</tt>. The default mode is 'remote' in which case no internal solr server is started. However, the same folder contains a full solr multicore configuration that is used when the mode is set to <span style="font-family:monospace;">embedded</span>. This setup defines the sole DefaultCore holding that is suitable for the HowTo cases in SMILA.
</p><p>More information about solr cores and their configuration can be found at: <a href="http://wiki.apache.org/solr/CoreAdmin" class="external free" title="http://wiki.apache.org/solr/CoreAdmin" rel="nofollow">http://wiki.apache.org/solr/CoreAdmin</a>
</p><p>If SMILA starts up for the first time and Solr is configured embedded, the configuration is copied to Solr workspace (solr.home).
</p>
<a name="schema.xml"></a><h2> <span class="mw-headline"> schema.xml </span></h2>
<p>One of the most import configuration files is <tt>configuration/org.eclipse.smila.solr/DefaultCore/conf/schema.xml</tt>. This file defines index fields and types. SMILA comes with the following set of predefined fields:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Id&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;string_id&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">required</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;LastModifiedDate&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;date&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Filename&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;text_path&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termVectors</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termPositions</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termOffsets</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Path&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;text_path&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termVectors</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termPositions</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termOffsets</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Extension&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;textgen&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Size&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;MimeType&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;textgen&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Content&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;textgen&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termVectors</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termPositions</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termOffsets</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;Title&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;textgen&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termVectors</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termPositions</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">termOffsets</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;spell&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;textSpell&quot;</span> <span class="re0">indexed</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">stored</span>=<span class="st0">&quot;true&quot;</span> <span class="re0">multiValued</span>=<span class="st0">&quot;true&quot;</span> <span class="re2">/&gt;</span></span></pre></div>
<p>The schema.xml also contains the <b>uniqueKey</b> property which Solr needs to know what field is used to id the documents and transparently handles add/updated accordingly. By default it is set to <b>Id</b>.
</p><p>All other configuration possibilities like field types, default search field copy field and many more you can look up here: <a href="http://wiki.apache.org/solr/SchemaXml" class="external free" title="http://wiki.apache.org/solr/SchemaXml" rel="nofollow">http://wiki.apache.org/solr/SchemaXml</a>
</p>
<a name="solrconfig.xml"></a><h2> <span class="mw-headline"> solrconfig.xml </span></h2>
<p>Another major configuration file is <tt>configuration/org.eclipse.smila.solr/DefaultCore/conf/solfconfig.xml</tt>. This is the configuration for all SearchComponents, RequestHandlers and the general indexing and query configuration.
</p><p>Please refer to its documentation here: <a href="http://wiki.apache.org/solr/SolrConfigXml" class="external free" title="http://wiki.apache.org/solr/SolrConfigXml" rel="nofollow">http://wiki.apache.org/solr/SolrConfigXml</a>
</p><p>Important for SMILA is that in the embedded case the <b>dataDir</b> property defaults to the data/ sub folder of the core instance (e.i. <tt>solr.home/DefaultCore/data/</tt>. Hence, in embedded mode the SMILA workspace may grow quite large. Use this property in this file or set it through solr.xml at the core to provide an alternative location.
</p><p>SMILA uses <b>autoCommit</b> via solr.DirectUpdateHandler2. It tells Solr to commit automatically every 60 seconds or after 1000 documents were added. If this property is not set, no commit will occur and the indexed data is not persistent or search-able unless you send appropriate solr commands yourself. The values are a compromise where these factors play a role:
- how soon shall/must a user that searches see the updates?
- how many update request are sent to solr&nbsp;? Note, that during commit the solr server server stalls updates which might lead to index pipelet timeouts.
</p>
<a name="How_to_use_Solr_with_SMILA"></a><h1> <span class="mw-headline"> How to use Solr with SMILA </span></h1>
<a name="Indexing_data"></a><h2> <span class="mw-headline"> Indexing data </span></h2>
<p>The SolrIndexPipelet can add, update or delete records (equates to Solr documents) in an index.
</p><p>Configuration in addpipeline:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;extensionActivity<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;proc:invokePipelet</span> <span class="re0">name</span>=<span class="st0">&quot;SolrIndexPipelet&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:pipelet</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.solr.index.SolrIndexPipelet&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:variables</span> <span class="re0">input</span>=<span class="st0">&quot;request&quot;</span> <span class="re0">output</span>=<span class="st0">&quot;request&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- either ADD or DELETE. --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;ExecutionMode&quot;</span><span class="re2">&gt;</span></span>ADD<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- defines the default core into which the record will be written. optional, but if missing then the target core
must be set in the record via SolrConstants.DYNAMIC_TARGET_CORE --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;CoreName&quot;</span><span class="re2">&gt;</span></span>DefaultCore<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- seq of fields that are to be filled. each tuple is a map that defines the target core field, the source field
(optional) and the source type (optional ) --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Seq</span> <span class="re0">key</span>=<span class="st0">&quot;CoreFields&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- target field name in the solr core --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;FieldName&quot;</span><span class="re2">&gt;</span></span>Folder<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- name of the source attribute or attachment in the record. optional, defaults to the target field name --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;RecSourceName&quot;</span><span class="re2">&gt;</span></span>Path<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- either ATTRIBUTE or ATTACHMENT. optional, defaults to ATTIRBUTE. --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;RecSourceType&quot;</span><span class="re2">&gt;</span></span>ATTRIBUTE<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/rec:Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;rec:Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;FieldName&quot;</span><span class="re2">&gt;</span></span>Filename<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/rec:Map<span class="re2">&gt;</span></span></span>
...
<span class="sc3"><span class="re1">&lt;/rec:Seq<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:invokePipelet<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/extensionActivity<span class="re2">&gt;</span></span></span></pre></div>
<p>Configuration in deletepipeline:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;extensionActivity<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;proc:invokePipelet</span> <span class="re0">name</span>=<span class="st0">&quot;SolrIndexPipelet&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:pipelet</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.solr.index.SolrIndexPipelet&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:variables</span> <span class="re0">input</span>=<span class="st0">&quot;request&quot;</span> <span class="re0">output</span>=<span class="st0">&quot;request&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;ExecutionMode&quot;</span><span class="re2">&gt;</span></span>DELETE<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;rec:Val</span> <span class="re0">key</span>=<span class="st0">&quot;CoreName&quot;</span><span class="re2">&gt;</span></span>DefaultCore<span class="sc3"><span class="re1">&lt;/rec:Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:invokePipelet<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/extensionActivity<span class="re2">&gt;</span></span></span></pre></div>
<a name="Search"></a><h2> <span class="mw-headline"> Search </span></h2>
<p>At the time of writing the SMILA standard search servlet does not work yet with the solr search. Hence, you either need to write an own servlet and integrate it in SMILA or you use the generic <a href="Search.html#Record_Search_Servlet" title="SMILA/Documentation/Search">Record Search Servlet</a>.
The search pipeline used needs to be configured manually to use the SolrSearchPipelet because it is not the default at the moment.
</p>
<a name="Search_Pipelet_Config"></a><h2> <span class="mw-headline"> Search Pipelet Config </span></h2>
<p>The SolrSearchPipelet offers the possibility to search a Solr index. The pipelet needs only a small configuration without any special parameters.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;extensionActivity<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;proc:invokePipelet</span> <span class="re0">name</span>=<span class="st0">&quot;invokeSolrSearchPipelet&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:pipelet</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.SMILA.solr.search.SolrSearchPipelet&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:variables</span> <span class="re0">input</span>=<span class="st0">&quot;request&quot;</span> <span class="re0">output</span>=<span class="st0">&quot;request&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:configuration<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/proc:invokePipelet<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/extensionActivity<span class="re2">&gt;</span></span></span></pre></div>
<a name="Solr_Specific_Search_Record"></a><h2> <span class="mw-headline"> Solr Specific Search Record </span></h2>
<p>For full feature support an enhanced search record is required.
This sections will provide both, XML samples on how the features are configured in the search record as well as description on helper classes that are available from within SMILA. Path notations for the elements in the record just have their key names of the respective elements as the path element and always start from the root; e.g. <tt>_solr.params/highlighting</tt>.
</p><p>To understand the following section you must know the standard <a href="Search.html#Query_Parameters" title="SMILA/Documentation/Search">SMILA search record</a>
</p>
<a name="Standard_Parameters"></a><h3> <span class="mw-headline"> Standard Parameters </span></h3>
<p>The following SMILA standard query parameters are supported:
</p>
<ul><li> maxcount
</li><li> offset
</li><li> indexname, this must correspond to an existing solr core name
</li><li> resultAttributes
</li><li> query
</li></ul>
<p>The solr pipelet suports only a sole <tt>query</tt> element as a string value, which it passes unaltered to solr. The solr default handler assumes this to be a valid Lucene query string, but ultimately this depends on the configured handler. All escaping needs to be done by the one constructing the search record (Note: There is no need to URL encode it, as this is done internally).
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Record</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.eclipse.org/SMILA/record&quot;</span> <span class="re0">version</span>=<span class="st0">&quot;2.0&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- query (q) --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;query&quot;</span><span class="re2">&gt;</span></span>Content:solr Content:eclipse<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;maxcount&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>3<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;offset&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>3<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;indexname&quot;</span><span class="re2">&gt;</span></span>wikipedia<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;resultAttributes&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>Content<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>Id<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
...
<span class="sc3"><span class="re1">&lt;Record<span class="re2">&gt;</span></span></span></pre></div>
<p>The above sample shows a query on the index field <tt>Content</tt> for the string "solr eclipse".
</p>
<a name="Highlighting"></a><h3> <span class="mw-headline"> Highlighting </span></h3>
<p>Highlighting for Solr deviates from the standard SMILA way to support solr features. The configuration is contained in <tt>_solr.query/highlighting</tt>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.query&quot;</span><span class="re2">&gt;</span></span>
...
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;highlighting&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;attribute&quot;</span><span class="re2">&gt;</span></span>global.solr.params<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;hl&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- list of fields to be highlighted, space delimited --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;hl.fl&quot;</span><span class="re2">&gt;</span></span>Content Title<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;hl.simple.pre&quot;</span><span class="re2">&gt;</span></span><span class="sc1">&amp;lt;</span>b<span class="sc1">&amp;gt;</span><span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;hl.simple.post&quot;</span><span class="re2">&gt;</span></span><span class="sc1">&amp;lt;</span>/b<span class="sc1">&amp;gt;</span><span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- other maps with attribute = field name for per-field configuration --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
...
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span></pre></div>
<p>The configuration can be done globally (applies to all HL fields) as well as per field and are contained in maps that must have an entry <tt>attribute</tt> that either contains the value <tt>golabl.solr.params</tt> which then signifies the the global highlight settings or the name of the attribute/filed that is to be highlight-configured.
The other entries in this map correspond in name and values to the ones solr supports.
See <a href="http://wiki.apache.org/solr/HighlightingParameters" class="external free" title="http://wiki.apache.org/solr/HighlightingParameters" rel="nofollow">http://wiki.apache.org/solr/HighlightingParameters</a>.
</p><p>In order to turn on highlighting, at least the global config must be present with the entry <tt>hl=true</tt>.
</p><p>Programmatic highlighting configuration is done though <tt>HihglightingQueryConfigAdapter</tt>. The default constructor creates a configuration object with global highlighting parameters which is required to enable highlighting. The other constructor provides an optional per-field configuration.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="co1">// create global highlighting configuration (required, enables highlighting)</span>
<span class="kw1">final</span> HighlightingQueryConfigAdapter highlighting = <span class="kw1">new</span> HighlightingQueryConfigAdapter<span class="br0">&#40;</span><span class="br0">&#41;</span>;
highlighting.<span class="me1">setHighlightingFields</span><span class="br0">&#40;</span><span class="st0">&quot;Content Title&quot;</span><span class="br0">&#41;</span>;
highlighting.<span class="me1">setHighlightingSimplePre</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;b&gt;&quot;</span><span class="br0">&#41;</span>;
highlighting.<span class="me1">setHighlightingSimplePost</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;/b&gt;&quot;</span><span class="br0">&#41;</span>;
builder.<span class="me1">addHighlightingConfiguration</span><span class="br0">&#40;</span>highlighting<span class="br0">&#41;</span>;</pre></div>
<p>Other than in SMILA, the <tt>_highlight</tt> annotation is not created per result item but replaces the normally returned field value, i.e. when you have the <tt>Content</tt> field to be returned in your search and you also configured highlighting on it, then the search returns only the highlighted value for the <tt>Content</tt> field.
</p>
<a name="Facets"></a><h3> <span class="mw-headline"> Facets </span></h3>
<p>Facets are specified for solr through the <tt>/groupby</tt> seq as defined in the standard. However, the contained elements have been expanded/changed to
</p>
<ul><li> leverage solr's features, i.e. enable also range facet on date and numeric fields
</li><li> simplify programming, i.e. no mapping between solr and SMILA constants
</li></ul>
<p>The latter allows you to just specify any valid solr parameter/value pair on both global and field level without any interaction on our part, i.e. all entries with the exception of <tt>attribute</tt> and those starting with <tt>_</tt> are passed to solr as is.
</p><p>The global facet parameters are defined in a map that contains <tt>attribute=global.solr.params</tt>. In order to turn faceting on it also must contain <tt>facet=true</tt>.
Faceting configs on field level are done by adding maps that contain <tt>attribute=&lt;field name&gt;</tt>.
</p><p>To tell which kind of faceting is to be performed you need to provide the <tt>_facet</tt> annotation which may take these values:
</p>
<ul><li> facet.field
</li><li> facet.date
</li><li> facet.query
</li></ul>
<p><br />
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;groupby&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- a global map to enable facets --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;facet&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;attribute&quot;</span><span class="re2">&gt;</span></span>global.solr.params<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- per-field configuration for facet.field --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;_facet&quot;</span><span class="re2">&gt;</span></span>facet.field<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;facet.limit&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>10<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;attribute&quot;</span><span class="re2">&gt;</span></span>Extension<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- per-field configuration for facet.date --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;_facet&quot;</span><span class="re2">&gt;</span></span>facet.date<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;facet.date.start&quot;</span><span class="re2">&gt;</span></span>NOW/DAY-5DAYS<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;facet.date.gap&quot;</span><span class="re2">&gt;</span></span>+1DAY<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;facet.date.end&quot;</span><span class="re2">&gt;</span></span>NOW/DAY+1DAY<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;attribute&quot;</span><span class="re2">&gt;</span></span>LastModifiedDate<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- per-field configuration for facet.query --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;_facet&quot;</span><span class="re2">&gt;</span></span>facet.query<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;_fc&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>* TO 1000<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>1000 TO 5000<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>5000 * TO<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;attribute&quot;</span><span class="re2">&gt;</span></span>Size<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span></pre></div>
<p>Facets are returned the SMILA the standard way in the <tt>groups</tt> map.
</p><p>The <tt>FacetQueryConfigAdapter</tt> provides only one constructor but takes a FacetType parameter instead. At least there is one configuration of <tt>FacetType.GLOBAL</tt> required (global configuration) to enabled facets. The other types are <tt>FacetType.DATE</tt>, <tt>FacetType.FIELD</tt> and <tt>FacetType.QUERY</tt> which takes an Array of Strings.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="co1">// create global facet configuration (required, enables facets)</span>
<span class="kw1">final</span> FacetQueryConfigAdapter facet_global = <span class="kw1">new</span> FacetQueryConfigAdapter<span class="br0">&#40;</span>FacetType.<span class="me1">GLOBAL</span><span class="br0">&#41;</span>;
builder.<span class="me1">addFacetConfiguration</span><span class="br0">&#40;</span>SolrConstants.<span class="me1">GLOBAL</span>, facet_global<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// create field facet configuration</span>
<span class="kw1">final</span> FacetQueryConfigAdapter facet_field = <span class="kw1">new</span> FacetQueryConfigAdapter<span class="br0">&#40;</span>FacetType.<span class="me1">FIELD</span><span class="br0">&#41;</span>;
facet_field.<span class="me1">setFacetLimit</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>;
builder.<span class="me1">addFacetConfiguration</span><span class="br0">&#40;</span><span class="st0">&quot;Extension&quot;</span>, facet_field<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// create facet date configuration</span>
<span class="kw1">final</span> FacetQueryConfigAdapter facet_date = <span class="kw1">new</span> FacetQueryConfigAdapter<span class="br0">&#40;</span>FacetType.<span class="me1">DATE</span><span class="br0">&#41;</span>;
facet_date.<span class="me1">setFacetDateStart</span><span class="br0">&#40;</span><span class="st0">&quot;NOW/DAY-5DAYS&quot;</span><span class="br0">&#41;</span>;
facet_date.<span class="me1">setFacetDateGap</span><span class="br0">&#40;</span><span class="st0">&quot;+1DAY&quot;</span><span class="br0">&#41;</span>;
facet_date.<span class="me1">setFacetDateEnd</span><span class="br0">&#40;</span><span class="st0">&quot;NOW/DAY+1DAY&quot;</span><span class="br0">&#41;</span>;
builder.<span class="me1">addFacetConfiguration</span><span class="br0">&#40;</span><span class="st0">&quot;LastModifiedDate&quot;</span>, facet_date<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// create facet query configuration (range example)</span>
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> fq = <span class="br0">&#123;</span> <span class="st0">&quot;* TO 1000&quot;</span>, <span class="st0">&quot;1000 TO 5000&quot;</span>, <span class="st0">&quot;5000 * TO&quot;</span> <span class="br0">&#125;</span>;
<span class="kw1">final</span> FacetQueryConfigAdapter facet_query = <span class="kw1">new</span> FacetQueryConfigAdapter<span class="br0">&#40;</span>FacetType.<span class="me1">QUERY</span>, fq<span class="br0">&#41;</span>;
builder.<span class="me1">addFacetConfiguration</span><span class="br0">&#40;</span><span class="st0">&quot;Size&quot;</span>, facet_query<span class="br0">&#41;</span>;</pre></div>
<p>More on how different facet types and their parameter work see: <a href="http://wiki.apache.org/solr/SimpleFacetParameters" class="external free" title="http://wiki.apache.org/solr/SimpleFacetParameters" rel="nofollow">http://wiki.apache.org/solr/SimpleFacetParameters</a>
</p>
<a name="Solr_Specific_Parameters_.28_solr.query.29"></a><h3> <span class="mw-headline"> Solr Specific Parameters (_solr.query) </span></h3>
<p>Some configuration deviations from the SMILA standard and other solr specialties are put into a Solr specific <tt>_solr.query</tt> Map element at top level of the search record.
</p><p>The following are supported:
</p>
<ul><li> filters
</li><li> shards
</li><li> request handler
</li></ul>
<a name="Filters"></a><h4> <span class="mw-headline"> Filters </span></h4>
<p>Solr filters may only be specified directly, i.e. as native query strings via the <tt>fq</tt> element. Multiple ones will be automatically ANDed.
Note, that the QueryBuilder's methods to add filters and the <tt>/filter</tt> Seq are not supported (yet).
</p>
<a name="Shards"></a><h4> <span class="mw-headline"> Shards </span></h4>
<p>Shards are only supported in remote mode and may be defined through the <tt>_solr.query/shards</tt> Seq.
</p>
<a name="Solr_Request_Handler"></a><h4> <span class="mw-headline"> Solr Request Handler </span></h4>
<p>To select another solr request handler add the <tt>_solr.query/qt</tt> entry.
</p><p>The following XML snippet shall illustrate these cases:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Record</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.eclipse.org/SMILA/record&quot;</span> <span class="re0">version</span>=<span class="st0">&quot;2.0&quot;</span><span class="re2">&gt;</span></span>
...
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.query&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- filter query (fq) --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;fq&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>Size:[500 TO 1000]<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>Author:&quot;H. Simpson&quot;<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
&nbsp;
<span class="sc3"><span class="coMULTI">&lt;!-- shards --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;shards&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>http://localhost:8983/solr<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val<span class="re2">&gt;</span></span></span>http://remote-server:8983/solr<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
&nbsp;
<span class="sc3"><span class="coMULTI">&lt;!-- request handler (qt) --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;qt&quot;</span><span class="re2">&gt;</span></span>/custom<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
&nbsp;
<span class="sc3"><span class="re1">&lt;/Record<span class="re2">&gt;</span></span></span></pre></div>
<a name="SolrQueryBuilder"></a><h4> <span class="mw-headline"> SolrQueryBuilder </span></h4>
<p>Instead of assembling the XML/Record yourself you can use the <tt>SolrQueryBuilder</tt> from within SMILA. This class extends native <tt>QueryBuilder</tt> with methods to configure a Solr request and special Solr features like highlighting or facets. To configure additional Solr features there exist adapter classes which give an overview of possible parameters.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="co1">// create Solr specific query builder</span>
<span class="kw1">final</span> SolrQueryBuilder builder = <span class="kw1">new</span> SolrQueryBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set query</span>
builder.<span class="me1">setQuery</span><span class="br0">&#40;</span><span class="st0">&quot;query&quot;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set start (equals offset, default: 0)</span>
builder.<span class="me1">setStart</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set rows (equals max count, default: 10)</span>
builder.<span class="me1">setRows</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set fields (equals result attributes, default: Id, score)</span>
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> fl = <span class="br0">&#123;</span> <span class="st0">&quot;Path&quot;</span>, <span class="st0">&quot;Size&quot;</span>, <span class="st0">&quot;Content&quot;</span> <span class="br0">&#125;</span>;
builder.<span class="me1">addFields</span><span class="br0">&#40;</span>fl<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// add a filter query (example: size between 500 and 1000)</span>
builder.<span class="me1">addFilterQuery</span><span class="br0">&#40;</span><span class="st0">&quot;Size:[500 TO 1000]&quot;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set shards</span>
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> shards = <span class="br0">&#123;</span> <span class="st0">&quot;http://localhost:8983/solr&quot;</span>, <span class="st0">&quot;http://remote-server:8983/solr&quot;</span> <span class="br0">&#125;</span>;
builder.<span class="me1">setShards</span><span class="br0">&#40;</span>shards<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// set request handler</span>
builder.<span class="me1">setRequestHandler</span><span class="br0">&#40;</span><span class="st0">&quot;/terms&quot;</span><span class="br0">&#41;</span>;</pre></div>
<a name="Auxillary_Search_Functions"></a><h3> <span class="mw-headline"> Auxillary Search Functions </span></h3>
<a name="Auto-suggest.2FTerms"></a><h4> <span class="mw-headline"> Auto-suggest/Terms </span></h4>
<p>Auto suggest/completion is also done via a search request, albeit a very special, stripped down version, which looks like so in the default setup:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Record</span> <span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.query&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;terms&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;terms&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;terms.fl&quot;</span><span class="re2">&gt;</span></span>attr_test_Simple<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;terms.prefix&quot;</span><span class="re2">&gt;</span></span>con<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;qt&quot;</span><span class="re2">&gt;</span></span>/terms<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Record<span class="re2">&gt;</span></span></span></pre></div>
<p>The only items present have to be the <tt>terms</tt> map and <tt>qt</tt> entry that needs to be set to an appropriate handler (by default this is /terms). The entries in the <tt>terms</tt> map are passed as is to solr.
For more information about terms configuration and parameters see <a href="http://wiki.apache.org/solr/TermsComponent" class="external free" title="http://wiki.apache.org/solr/TermsComponent" rel="nofollow">http://wiki.apache.org/solr/TermsComponent</a>.
</p><p>The results are returned in the <tt>_solr.result/terms</tt> map with the key as the actual completed word and its value tells you how many documents in the index contain this word.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Record</span> <span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Seq</span> <span class="re0">key</span>=<span class="st0">&quot;records&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/Seq<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;runtime&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>3<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.result&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;terms&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;congratulations&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>1<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;conjugate&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>1<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;containing&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>1<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Record<span class="re2">&gt;</span></span></span></pre></div>
<p>In SMILA code this can be done like so:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">final</span> TermsQueryConfigAdapter terms = <span class="kw1">new</span> TermsQueryConfigAdapter<span class="br0">&#40;</span>_solrField<span class="br0">&#41;</span>;
terms.<span class="me1">setTermsPrefix</span><span class="br0">&#40;</span><span class="st0">&quot;con&quot;</span><span class="br0">&#41;</span>;
_queryBuilder.<span class="me1">setTermsConfiguration</span><span class="br0">&#40;</span>terms<span class="br0">&#41;</span>;
_queryBuilder.<span class="me1">setRequestHandler</span><span class="br0">&#40;</span><span class="st0">&quot;/terms&quot;</span><span class="br0">&#41;</span>;</pre></div>
<a name="Spellcheck_.28Did_you_mean.29"></a><h4> <span class="mw-headline"> Spellcheck (Did you mean) </span></h4>
<p>SIMLA's default setup has spell checking (Did you mean) for the <tt>Content</tt> field enabled. In most cases it's useful to configure the default request handler to use SpellCheckComponent (solrconfig.xml) and this has been done. Otherwise the correct request handler must be set (solrconfig.xml example: /spell). By default SpellCheckComponent uses a separate index which is created on the fly and updated on every commit. Therefore, to retrieve alternative suggestions for possibly misspelled input words, you just need to add the <tt>spellcheck</tt> map to <tt>_solr.query</tt>:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.query&quot;</span><span class="re2">&gt;</span></span>
....
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck.count&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>5<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck.extendedResults&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck.collate&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;boolean&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span></pre></div>
<p>The map contains solr parameters (see <a href="http://wiki.apache.org/solr/SpellCheckComponent" class="external free" title="http://wiki.apache.org/solr/SpellCheckComponent" rel="nofollow">http://wiki.apache.org/solr/SpellCheckComponent</a>) that are passed "as is" to solr.
</p><p>This will add the <tt>spellcheck</tt> map to <tt>_solr.result</tt>:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;_solr.result&quot;</span><span class="re2">&gt;</span></span>
...
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;spellcheck&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Map</span> <span class="re0">key</span>=<span class="st0">&quot;rust&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;just&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>1<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;bust&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;long&quot;</span><span class="re2">&gt;</span></span>1<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;Val</span> <span class="re0">key</span>=<span class="st0">&quot;collation&quot;</span><span class="re2">&gt;</span></span>Content:just<span class="sc3"><span class="re1">&lt;/Val<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span>
...
<span class="sc3"><span class="re1">&lt;/Map<span class="re2">&gt;</span></span></span></pre></div>
<p>For each misspelled word there is a nested map containing the corrections, where the key is the corrected term and the value is the frequency of the term in the index. The value for the frequency must be turned on via spellcheck.extendedResults and defaults to -1 otherwise.
</p><p>When <tt>collate</tt> is on then you can also find a full alternative query under the key <tt>collation</tt>.
</p><p>The code for the above XML snippets has been generated with the following code:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java">addSolrDoc<span class="br0">&#40;</span><span class="st0">&quot;1&quot;</span>,
<span class="st0">&quot;This is a simple text without real meaning as i dont want to bust my behind for smth. with more sense.&quot;</span><span class="br0">&#41;</span>;
addSolrDoc<span class="br0">&#40;</span><span class="st0">&quot;2&quot;</span>, <span class="st0">&quot;It is just used for testing.&quot;</span><span class="br0">&#41;</span>;
indexAndCommit<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// setup search</span>
<span class="kw1">final</span> SpellCheckQueryConfigAdapter spellcheck = <span class="kw1">new</span> SpellCheckQueryConfigAdapter<span class="br0">&#40;</span><span class="br0">&#41;</span>;
spellcheck.<span class="me1">setSpellCheckCount</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;
spellcheck.<span class="me1">setSpellCheckExtendedResults</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;
spellcheck.<span class="me1">setSpellCheckCollate</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;
_queryBuilder.<span class="me1">setSpellCheckConfiguration</span><span class="br0">&#40;</span>spellcheck<span class="br0">&#41;</span>;
_queryBuilder.<span class="me1">setQuery</span><span class="br0">&#40;</span><span class="st0">&quot;Content:rust&quot;</span><span class="br0">&#41;</span>;</pre></div>
<!--
NewPP limit report
Preprocessor node count: 163/1000000
Post-expand include size: 1412/2097152 bytes
Template argument size: 838/2097152 bytes
#ifexist count: 0/100
-->
<!-- Saved in parser cache with key wikidb:pcache:idhash:32450-0!1!0!!en!2!edit=0 and timestamp 20111027144346 -->
<div class="printfooter">
Retrieved from "<a href="Solr.html">http://wiki.eclipse.org/SMILA/Documentation/Solr</a>"</div>
<!-- end content -->
<div class="visualClear"></div>
</div>
</div>
</div>
<!-- Yoink of toolbox for phoenix moved up -->
</div>
</div>
<div id="clearFooter"/>
<div id="footer" >
<ul id="footernav">
<li class="first"><a href="http://www.eclipse.org/">Home</a></li>
<li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
<li><a href="http://www.eclipse.org/org/foundation/contact.php">Contact</a></li>
<li><a href="http://wiki.eclipse.org/Eclipsepedia:About" title="Eclipsepedia:About">About Eclipsepedia</a></li>
</ul>
<span id="copyright">Copyright &copy; 2011 The Eclipse Foundation. All Rights Reserved</span>
<p id="footercredit">This page was last modified 14:33, 14 July 2011 by <a href="http://wiki.eclipse.org/User:Tmenzel.brox.de" title="User:Tmenzel.brox.de">thomas menzel</a>. Based on work by <a href="http://wiki.eclipse.org/index.php?title=User:Pwissel.brox.de&amp;action=edit" class="new" title="User:Pwissel.brox.de">Peter Wissel</a>.</p>
<p id="footerviews">This page has been accessed 474 times.</p>
</div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-910670-4");
pageTracker._trackPageview();
</script>
<!-- <div class="visualClear"></div> -->
<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
</div>
<!-- Served in 0.481 secs. --></body></html>