lucene/solr/site/tutorial.html

880 lines
35 KiB
HTML
Executable File

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="Apache Forrest" name="Generator">
<meta name="Forrest-version" content="0.9">
<meta name="Forrest-skin-name" content="lucene">
<title>Solr tutorial</title>
<link type="text/css" href="skin/basic.css" rel="stylesheet">
<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
<link type="text/css" href="skin/profile.css" rel="stylesheet">
<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
<link rel="shortcut icon" href="images/favicon.ico">
</head>
<body onload="init()">
<script type="text/javascript">ndeSetTextSize();</script>
<div id="top">
<!--+
|breadtrail
+-->
<div class="breadtrail">
<a href="http://www.apache.org/">apache</a> &gt; <a href="http://lucene.apache.org/">lucene</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
</div>
<!--+
|header
+-->
<div class="header">
<!--+
|start group logo
+-->
<div class="grouplogo">
<a href="http://lucene.apache.org/"><img class="logoImage" alt="Lucene" src="images/lucene_green_150.gif" title="Apache Lucene"></a>
</div>
<!--+
|end group logo
+-->
<!--+
|start Project Logo
+-->
<div class="projectlogo">
<a href="http://lucene.apache.org/solr/"><img class="logoImage" alt="Solr" src="images/solr.jpg" title="Solr Description"></a>
</div>
<!--+
|end Project Logo
+-->
<!--+
|start Search
+-->
<div class="searchbox">
<form id="searchform" action="http://search.lucidimagination.com/p:solr" method="get" class="roundtopsmall">
<input onFocus="getBlank (this, 'Search the site with Solr');" size="25" name="q" id="query" type="text" value="Search the site with Solr">&nbsp;
<input onclick="selectProvider(this.form)" name="Search" value="Search" type="submit">
@
<select id="searchProvider" name="searchProvider"><option value="any">select provider</option><option value="lucid">Lucid Find</option><option value="sl">Search-Lucene</option></select>
</form>
</div>
<!--+
|end search
+-->
<!--+
|start Tabs
+-->
<ul id="tabs">
<li class="current">
<a class="selected" href="index.html">Main</a>
</li>
<li>
<a class="unselected" href="http://wiki.apache.org/solr/FrontPage">Wiki</a>
</li>
</ul>
<!--+
|end Tabs
+-->
</div>
</div>
<div id="main">
<div id="publishedStrip">
<!--+
|start Subtabs
+-->
<div id="level2tabs"></div>
<!--+
|end Endtabs
+-->
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<!--+
|breadtrail
+-->
<div class="breadtrail">
&nbsp;
</div>
<!--+
|start Menu, mainarea
+-->
<!--+
|start Menu
+-->
<div id="menu">
<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">About</div>
<div id="menu_1.1" class="menuitemgroup">
<div class="menuitem">
<a href="index.html" title="Welcome to Solr">Welcome</a>
</div>
<div class="menuitem">
<a href="http://lucene.apache.org/java/docs/whoweare.html" title="Lucene/Solr Committers">Who We Are</a>
</div>
<div class="menuitem">
<a href="http://lucene.apache.org/privacy.html">Privacy Policy</a>
</div>
</div>
<div onclick="SwitchMenu('menu_selected_1.2', 'skin/')" id="menu_selected_1.2Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Documentation</div>
<div id="menu_selected_1.2" class="selectedmenuitemgroup" style="display: block;">
<div class="menuitem">
<a href="features.html">Features</a>
</div>
<div class="menupage">
<div class="menupagetitle">Tutorial</div>
</div>
<div class="menuitem">
<a href="http://wiki.apache.org/solr/FrontPage">Docs (Wiki)</a>
</div>
<div class="menuitem">
<a href="http://wiki.apache.org/solr/FAQ">FAQ</a>
</div>
<div class="menuitem">
<a href="api/index.html">All Javadoc</a>
</div>
<div class="menuitem">
<a href="api/solrj/index.html">SolrJ Javadoc</a>
</div>
<div class="menuitem">
<a href="api/test-framework/index.html">Test Framework Javadoc</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Resources</div>
<div id="menu_1.3" class="menuitemgroup">
<div class="menuitem">
<a href="http://www.apache.org/dyn/closer.cgi/lucene/solr/">Download</a>
</div>
<div class="menuitem">
<a href="mailing_lists.html">Mailing Lists</a>
</div>
<div class="menuitem">
<a href="issue_tracking.html">Issue Tracking</a>
</div>
<div class="menuitem">
<a href="version_control.html">Version Control</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Related Projects</div>
<div id="menu_1.4" class="menuitemgroup">
<div class="menuitem">
<a href="http://lucene.apache.org/java/">Lucene Java</a>
</div>
<div class="menuitem">
<a href="http://lucene.apache.org/nutch/">Nutch</a>
</div>
<div class="menuitem">
<a href="http://incubator.apache.org/connectors/">ManifoldCF</a>
</div>
</div>
<script type="text/javascript">
function selectProvider(form) {
provider = form.elements['searchProvider'].value;
if (provider == "any") {
if (Math.random() > 0.5) {
provider = "lucid";
} else {
provider = "sl";
}
}
if (provider == "lucid") {
form.action = "http://search.lucidimagination.com/p:solr";
} else if (provider == "sl") {
form.action = "http://search-lucene.com/solr";
}
days = 365; // cookie will be valid for a year
date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
document.cookie = "searchProvider=" + provider + expires + "; path=/";
}
if (document.cookie.length>0) {
cStart=document.cookie.indexOf("searchProvider=");
if (cStart!=-1) {
cStart=cStart + "searchProvider=".length;
cEnd=document.cookie.indexOf(";", cStart);
if (cEnd==-1) {
cEnd=document.cookie.length;
}
provider = unescape(document.cookie.substring(cStart,cEnd));
document.forms['searchform'].elements['searchProvider'].value = provider;
}
}
</script>
<div id="credit"></div>
<div id="roundbottom">
<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
<!--+
|alternative credits
+-->
<div id="credit2">
<a href="http://link.packtpub.com/2LjDxE"><img border="0" title="Book: Apache Solr 3 Enterprise Search Server" alt="Book: Apache Solr 3 Enterprise Search Server - logo" src="images/as3ess_book.jpg" style="width: 150px;height: 185px;"></a><a href="http://www.packtpub.com/solr-3-1-enterprise-search-server-cookbook/book"><img border="0" title="Book: Apache Solr 3.1 Cookbook" alt="Book: Apache Solr 3.1 Cookbook - logo" src="images/solr_31_cookbook.jpg" style="width: 150px;height: 180px;"></a><a href="http://www.lucidimagination.com/Downloads/LucidWorks-for-Solr/Reference-Guide?sc=AP"><img border="0" title="LucidWorks for Solr Certified Distribution Reference Guide" alt="LucidWorks for Solr Certified Distribution Reference Guide - logo" src="images/lucidworks_reference_guide.png" style="width: 150px;height: 185px;"></a>
</div>
</div>
<!--+
|end Menu
+-->
<!--+
|start content
+-->
<div id="content">
<div title="Portable Document Format" class="pdflink">
<a class="dida" href="tutorial.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
PDF</a>
</div>
<h1>Solr tutorial</h1>
<div id="minitoc-area">
<ul class="minitoc">
<li>
<a href="#Overview">Overview</a>
</li>
<li>
<a href="#Requirements">Requirements</a>
</li>
<li>
<a href="#Getting+Started">Getting Started</a>
</li>
<li>
<a href="#Indexing+Data">Indexing Data</a>
</li>
<li>
<a href="#Updating+Data">Updating Data</a>
<ul class="minitoc">
<li>
<a href="#Deleting+Data">Deleting Data</a>
</li>
</ul>
</li>
<li>
<a href="#Querying+Data">Querying Data</a>
<ul class="minitoc">
<li>
<a href="#Sorting">Sorting</a>
</li>
</ul>
</li>
<li>
<a href="#Highlighting">Highlighting</a>
</li>
<li>
<a href="#Faceted+Search">Faceted Search</a>
</li>
<li>
<a href="#Search+UI">Search UI</a>
</li>
<li>
<a href="#Text+Analysis">Text Analysis</a>
<ul class="minitoc">
<li>
<a href="#Analysis+Debugging">Analysis Debugging</a>
</li>
</ul>
</li>
<li>
<a href="#Conclusion">Conclusion</a>
</li>
</ul>
</div>
<a name="N1000E"></a><a name="Overview"></a>
<h2 class="boxed">Overview</h2>
<div class="section">
<p>
This document covers the basics of running Solr using an example
schema, and some sample data.
</p>
</div>
<a name="N10018"></a><a name="Requirements"></a>
<h2 class="boxed">Requirements</h2>
<div class="section">
<p>
To follow along with this tutorial, you will need...
</p>
<ol>
<li>Java 1.6 or greater. Some places you can get it are from
<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Oracle</a>,
<a href="http://openjdk.java.net/">Open JDK</a>,
<a href="http://www.ibm.com/developerworks/java/jdk/">IBM</a>, or
<br>
Running <span class="codefrag">java -version</span> at the command line should indicate a version
number starting with 1.6. Gnu's GCJ is not supported and does not work with Solr.
</li>
<li>A <a href="http://www.apache.org/dyn/closer.cgi/lucene/solr/">Solr release</a>.
</li>
</ol>
</div>
<a name="N10040"></a><a name="Getting+Started"></a>
<h2 class="boxed">Getting Started</h2>
<div class="section">
<p>
<strong>
Please run the browser showing this tutorial and the Solr server on the same machine so tutorial links will correctly point to your Solr server.
</strong>
</p>
<p>
Begin by unziping the Solr release and changing your working directory
to be the "<span class="codefrag">example</span>" directory. (Note that the base directory name may vary with the version of Solr downloaded.) For example, with a shell in UNIX, Cygwin, or MacOS:
</p>
<pre class="code">
user:~solr$ <strong>ls</strong>
solr-nightly.zip
user:~solr$ <strong>unzip -q solr-nightly.zip</strong>
user:~solr$ <strong>cd solr-nightly/example/</strong>
</pre>
<p>
Solr can run in any Java Servlet Container of your choice, but to simplify
this tutorial, the example index includes a small installation of Jetty.
</p>
<p>
To launch Jetty with the Solr WAR, and the example configs, just run the <span class="codefrag">start.jar</span> ...
</p>
<pre class="code">
user:~/solr/example$ <strong>java -jar start.jar</strong>
2009-10-23 16:42:53.816::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2009-10-23 16:42:53.907::INFO: jetty-6.1.26
...
Oct 23, 2009 4:41:56 PM org.apache.solr.core.SolrCore registerSearcher
INFO: [] Registered new searcher Searcher@7c3885 main
</pre>
<p>
This will start up the Jetty application server on port 8983, and use your terminal to display the logging information from Solr.
</p>
<p>
You can see that the Solr is running by loading <a href="http://localhost:8983/solr/admin/">http://localhost:8983/solr/admin/</a> in your web browser. This is the main starting point for Administering Solr.
</p>
</div>
<a name="N10078"></a><a name="Indexing+Data"></a>
<h2 class="boxed">Indexing Data</h2>
<div class="section">
<p>
Your Solr server is up and running, but it doesn't contain any data. You can
modify a Solr index by POSTing XML Documents containing instructions to add (or
update) documents, delete documents, commit pending adds and deletes, and
optimize your index.
</p>
<p>
The <span class="codefrag">exampledocs</span> directory contains samples of the types of
instructions Solr expects, as well as a java utility for posting them from the
command line (a <span class="codefrag">post.sh</span> shell script is also available, but for
this tutorial we'll use the cross-platform Java client). </p>
<p> To try this,
open a new terminal window, enter the exampledocs directory, and run
"<span class="codefrag">java -jar post.jar</span>" on some of the XML files in that directory,
indicating the URL of the Solr server:
</p>
<pre class="code">
user:~/solr/example/exampledocs$ <strong>java -jar post.jar solr.xml monitor.xml</strong>
SimplePostTool: version 1.2
SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8, other encodings are not currently supported
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: COMMITting Solr index changes..
</pre>
<p>
You have now indexed two documents in Solr, and committed these changes.
You can now search for "solr" using the "Make a Query" interface on the Admin screen, and you should get one result.
Clicking the "Search" button should take you to the following URL...
</p>
<p>
<a href="http://localhost:8983/solr/select/?q=solr&amp;start=0&amp;rows=10&amp;indent=on">http://localhost:8983/solr/select/?q=solr&amp;start=0&amp;rows=10&amp;indent=on</a>
</p>
<p>
You can index all of the sample data, using the following command (assuming your command line shell supports the *.xml notation):
</p>
<pre class="code">
user:~/solr/example/exampledocs$ <strong>java -jar post.jar *.xml</strong>
SimplePostTool: version 1.2
SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8, other encodings are not currently supported
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file spellchecker.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..
</pre>
<p>
...and now you can search for all sorts of things using the default <a href="http://wiki.apache.org/solr/SolrQuerySyntax">Solr Query Syntax</a> (a superset of the Lucene query syntax)...
</p>
<ul>
<li>
<a href="http://localhost:8983/solr/select/?q=video">video</a>
</li>
<li>
<a href="http://localhost:8983/solr/select/?q=name:video">name:video</a>
</li>
<li>
<a href="http://localhost:8983/solr/select/?q=%2Bvideo+%2Bprice%3A[*+TO+400]">+video +price:[* TO 400]</a>
</li>
</ul>
<p></p>
<p>
There are many other different ways to import your data into Solr... one can
</p>
<ul>
<li>Import records from a database using the
<a href="http://wiki.apache.org/solr/DataImportHandler">Data Import Handler (DIH)</a>.
</li>
<li>
<a href="http://wiki.apache.org/solr/UpdateCSV">Load a CSV file</a> (comma separated values),
including those exported by Excel or MySQL.
</li>
<li>
<a href="http://wiki.apache.org/solr/UpdateJSON">POST JSON documents</a>
</li>
<li>Index binary documents such as Word and PDF with
<a href="http://wiki.apache.org/solr/ExtractingRequestHandler">Solr Cell</a> (ExtractingRequestHandler).
</li>
<li>
Use <a href="http://wiki.apache.org/solr/Solrj">SolrJ</a> for Java or other Solr clients to
programatically create documents to send to Solr.
</li>
</ul>
</div>
<a name="N100EE"></a><a name="Updating+Data"></a>
<h2 class="boxed">Updating Data</h2>
<div class="section">
<p>
You may have noticed that even though the file <span class="codefrag">solr.xml</span> has now
been POSTed to the server twice, you still only get 1 result when searching for
"solr". This is because the example <span class="codefrag">schema.xml</span> specifies a "<span class="codefrag">uniqueKey</span>" field
called "<span class="codefrag">id</span>". Whenever you POST instructions to Solr to add a
document with the same value for the <span class="codefrag">uniqueKey</span> as an existing document, it
automatically replaces it for you. You can see that that has happened by
looking at the values for <span class="codefrag">numDocs</span> and <span class="codefrag">maxDoc</span> in the
"CORE"/searcher section of the statistics page... </p>
<p>
<a href="http://localhost:8983/solr/admin/stats.jsp">http://localhost:8983/solr/admin/stats.jsp</a>
</p>
<p>
<strong><span class="codefrag">numDocs</span></strong> represents the number of searchable documents in the
index (and will be larger than the number of XML files since some files
contained more than one <span class="codefrag">&lt;doc&gt;</span>). <strong><span class="codefrag">maxDoc</span></strong>
may be larger as the <span class="codefrag">maxDoc</span> count includes logically deleted documents that
have not yet been removed from the index. You can re-post the sample XML
files over and over again as much as you want and <span class="codefrag">numDocs</span> will never
increase, because the new documents will constantly be replacing the old.
</p>
<p>
Go ahead and edit the existing XML files to change some of the data, and re-run
the <span class="codefrag">java -jar post.jar</span> command, you'll see your changes reflected
in subsequent searches.
</p>
<a name="N1012D"></a><a name="Deleting+Data"></a>
<h3 class="boxed">Deleting Data</h3>
<p>You can delete data by POSTing a delete command to the update URL and specifying the value
of the document's unique key field, or a query that matches multiple documents (be careful with that one!). Since these commands
are smaller, we will specify them right on the command line rather than reference an XML file.
</p>
<p>Execute the following command to delete a document</p>
<pre class="code">java -Ddata=args -Dcommit=no -jar post.jar "&lt;delete&gt;&lt;id&gt;SP2514N&lt;/id&gt;&lt;/delete&gt;"</pre>
<p>Now if you go to the <a href="http://localhost:8983/solr/admin/stats.jsp">statistics</a> page and scroll down
to the UPDATE_HANDLERS section and verify that "<span class="codefrag">deletesById : 1</span>"</p>
<p>If you search for <a href="http://localhost:8983/solr/select?q=id:SP2514N">id:SP2514N</a> it will still be found,
because index changes are not visible until changes are committed and a new searcher is opened. To cause
this to happen, send a commit command to Solr (post.jar does this for you by default):</p>
<pre class="code">java -jar post.jar</pre>
<p>Now re-execute the previous search and verify that no matching documents are found. Also revisit the
statistics page and observe the changes in both the UPDATE_HANDLERS section and the CORE section.</p>
<p>Here is an example of using delete-by-query to delete anything with
<a href="http://localhost:8983/solr/select?q=name:DDR&amp;fl=name">DDR</a> in the name:</p>
<pre class="code">java -Ddata=args -jar post.jar "&lt;delete&gt;&lt;query&gt;name:DDR&lt;/query&gt;&lt;/delete&gt;"</pre>
<p>Commit can be an expensive operation so it's best to make many changes to an index in a batch and
then send the <span class="codefrag">commit</span> command at the end. There is also an <span class="codefrag">optimize</span> command that does the same thing as <span class="codefrag">commit</span>,
in addition to merging all index segments into a single segment, making it faster to search and causing any
deleted documents to be removed. All of the update commands are documented <a href="http://wiki.apache.org/solr/UpdateXmlMessages">here</a>.
</p>
<p>To continue with the tutorial, re-add any documents you may have deleted by going to the <span class="codefrag">exampledocs</span> directory and executing</p>
<pre class="code">java -jar post.jar *.xml</pre>
</div>
<a name="N1017C"></a><a name="Querying+Data"></a>
<h2 class="boxed">Querying Data</h2>
<div class="section">
<p>
Searches are done via HTTP GET on the <span class="codefrag">select</span> URL with the query string in the <span class="codefrag">q</span> parameter.
You can pass a number of optional <a href="http://wiki.apache.org/solr/StandardRequestHandler">request parameters</a>
to the request handler to control what information is returned. For example, you can use the "<span class="codefrag">fl</span>" parameter
to control what stored fields are returned, and if the relevancy score is returned:
</p>
<ul>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;fl=name,id">q=video&amp;fl=name,id</a> (return only name and id fields) </li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;fl=name,id,score">q=video&amp;fl=name,id,score</a> (return relevancy score as well) </li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;fl=*,score">q=video&amp;fl=*,score</a> (return all stored fields, as well as relevancy score) </li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=price desc&amp;fl=name,id,price">q=video&amp;sort=price desc&amp;fl=name,id,price</a> (add sort specification: sort by price descending) </li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;wt=json">q=video&amp;wt=json</a> (return response in JSON format) </li>
</ul>
<p>
Solr provides a <a href="http://localhost:8983/solr/admin/form.jsp">query form</a> within the web admin interface
that allows setting the various request parameters and is useful when testing or debugging queries.
</p>
<a name="N101BA"></a><a name="Sorting"></a>
<h3 class="boxed">Sorting</h3>
<p>
Solr provides a simple method to sort on one or more indexed fields.
Use the "<span class="codefrag">sort</span>' parameter to specify "field direction" pairs, separated by commas if there's more than one sort field:
</p>
<ul>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=price+desc">q=video&amp;sort=price desc</a>
</li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=price+asc">q=video&amp;sort=price asc</a>
</li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=inStock+asc,price+desc">q=video&amp;sort=inStock asc, price desc</a>
</li>
</ul>
<p>
"<span class="codefrag">score</span>" can also be used as a field name when specifying a sort:
</p>
<ul>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=score+desc">q=video&amp;sort=score desc</a>
</li>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=video&amp;sort=inStock+asc,score+desc">q=video&amp;sort=inStock asc, score desc</a>
</li>
</ul>
<p>
Complex functions may also be used to sort results:
</p>
<ul>
<li>
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=*:*&amp;sort=div(popularity,add(price,1))+desc">q=video&amp;sort=div(popularity,add(price,1)) desc</a>
</li>
</ul>
<p>
If no sort is specified, the default is <span class="codefrag">score desc</span> to return the matches having the highest relevancy.
</p>
</div>
<a name="N101FE"></a><a name="Highlighting"></a>
<h2 class="boxed">Highlighting</h2>
<div class="section">
<p>
Hit highlighting returns relevent snippets of each returned document, and highlights
terms from the query within those context snippets.
</p>
<p>
The following example searches for <span class="codefrag">video card</span> and requests
highlighting on the fields <span class="codefrag">name,features</span>. This causes a
<span class="codefrag">highlighting</span> section to be added to the response with the
words to highlight surrounded with <span class="codefrag">&lt;em&gt;</span> (for emphasis)
tags.
</p>
<p>
<a href="http://localhost:8983/solr/select/?wt=json&amp;indent=on&amp;q=video+card&amp;fl=name,id&amp;hl=true&amp;hl.fl=name,features">...&amp;q=video card&amp;fl=name,id&amp;hl=true&amp;hl.fl=name,features</a>
</p>
<p>
More request parameters related to controlling highlighting may be found
<a href="http://wiki.apache.org/solr/HighlightingParameters">here</a>.
</p>
</div> <!-- highlighting -->
<a name="N10227"></a><a name="Faceted+Search"></a>
<h2 class="boxed">Faceted Search</h2>
<div class="section">
<p>
Faceted search takes the documents matched by a query and generates counts for various
properties or categories. Links are usually provided that allows users to "drill down" or
refine their search results based on the returned categories.
</p>
<p>
The following example searches for all documents (<span class="codefrag">*:*</span>) and
requests counts by the category field <span class="codefrag">cat</span>.
</p>
<p>
<a href="http://localhost:8983/solr/select/?wt=json&amp;indent=on&amp;q=*:*&amp;fl=name&amp;facet=true&amp;facet.field=cat">...&amp;q=*:*&amp;facet=true&amp;facet.field=cat</a>
</p>
<p>
Notice that although only the first 10 documents are returned in the results list,
the facet counts generated are for the complete set of documents that match the query.
</p>
<p>
We can facet multiple ways at the same time. The following example adds a facet on the
boolean <span class="codefrag">inStock</span> field:
</p>
<p>
<a href="http://localhost:8983/solr/select/?wt=json&amp;indent=on&amp;q=*:*&amp;fl=name&amp;facet=true&amp;facet.field=cat&amp;facet.field=inStock">...&amp;q=*:*&amp;facet=true&amp;facet.field=cat&amp;facet.field=inStock</a>
</p>
<p>
Solr can also generate counts for arbitrary queries. The following example
queries for <span class="codefrag">ipod</span> and shows prices below and above 100 by using
range queries on the price field.
</p>
<p>
<a href="http://localhost:8983/solr/select/?wt=json&amp;indent=on&amp;q=ipod&amp;fl=name&amp;facet=true&amp;facet.query=price:[0+TO+100]&amp;facet.query=price:[100+TO+*]">...&amp;q=ipod&amp;facet=true&amp;facet.query=price:[0 TO 100]&amp;facet.query=price:[100 TO *]</a>
</p>
<p>
One can even facet by date ranges. This example requests counts for the manufacture date (<span class="codefrag">manufacturedate_dt</span> field) for each year between 2004 and 2010.
</p>
<p>
<a href="http://localhost:8983/solr/select/?wt=json&amp;indent=on&amp;q=*:*&amp;fl=name,manufacturedate_dt&amp;facet=true&amp;facet.date=manufacturedate_dt&amp;facet.date.start=2004-01-01T00:00:00Z&amp;facet.date.end=2010-01-01T00:00:00Z&amp;facet.date.gap=%2b1YEAR">...&amp;q=*:*&amp;facet=true&amp;facet.date=manufacturedate_dt&amp;facet.date.start=2004-01-01T00:00:00Z&amp;facet.date.end=2010-01-01T00:00:00Z&amp;facet.date.gap=+1YEAR</a>
</p>
<p>
More information on faceted search may be found on the
<a href="http://wiki.apache.org/solr/SolrFacetingOverview">faceting overview</a>
and
<a href="http://wiki.apache.org/solr/SimpleFacetParameters">faceting parameters</a>
pages.
</p>
</div> <!-- faceted search -->
<a name="N10278"></a><a name="Search+UI"></a>
<h2 class="boxed">Search UI</h2>
<div class="section">
<p>
Solr includes an example search interface built with velocity templating
that demonstrates many features, including searching, faceting, highlighting,
autocomplete, and geospatial searching.
</p>
<p>
Try it out at
<a href="http://localhost:8983/solr/browse">http://localhost:8983/solr/browse</a>
</p>
</div> <!-- Search UI -->
<a name="N1028B"></a><a name="Text+Analysis"></a>
<h2 class="boxed">Text Analysis</h2>
<div class="section">
<p>
Text fields are typically indexed by breaking the text into words and applying various transformations such as
lowercasing, removing plurals, or stemming to increase relevancy. The same text transformations are normally
applied to any queries in order to match what is indexed.
</p>
<p>
The <a href="http://wiki.apache.org/solr/SchemaXml">schema</a> defines
the fields in the index and what type of analysis is applied to them. The current schema your server is using
may be accessed via the <span class="codefrag">[SCHEMA]</span> link on the <a href="http://localhost:8983/solr/admin/">admin</a> page.
</p>
<p>
The best analysis components (tokenization and filtering) for your textual content depends heavily on language.
As you can see in the above <span class="codefrag">[SCHEMA]</span> link, the fields in the example schema are using a <span class="codefrag">fieldType</span>
named <span class="codefrag">text_general</span>, which has defaults appropriate for all languages.
</p>
<p>
If you know your textual content is English, as is the case for the example documents in this tutorial,
and you'd like to apply English-specific stemming and stop word removal, as well as split compound words, you can use the <span class="codefrag">text_en_splitting</span> fieldType instead.
Go ahead and edit the <span class="codefrag">schema.xml</span> under the <span class="codefrag">solr/example/solr/conf</span> directory,
and change the <span class="codefrag">type</span> for fields <span class="codefrag">text</span> and <span class="codefrag">features</span> from <span class="codefrag">text_general</span> to <span class="codefrag">text_en_splitting</span>.
Restart the server and then re-post all of the documents, and then these queries will show the English-specific transformations:
</p>
<ul>
<li>A search for
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=power-shot&amp;fl=name">power-shot</a>
matches <span class="codefrag">PowerShot</span>, and
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=adata&amp;fl=name">adata</a>
matches <span class="codefrag">A-DATA</span> due to the use of <span class="codefrag">WordDelimiterFilter</span> and <span class="codefrag">LowerCaseFilter</span>.
</li>
<li>A search for
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=features:recharging&amp;fl=name,features">features:recharging</a>
matches <span class="codefrag">Rechargeable</span> due to stemming with the <span class="codefrag">EnglishPorterFilter</span>.
</li>
<li>A search for
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=%221 gigabyte%22&amp;fl=name">"1 gigabyte"</a>
matches things with <span class="codefrag">GB</span>, and the misspelled
<a href="http://localhost:8983/solr/select/?indent=on&amp;q=pixima&amp;fl=name">pixima</a>
matches <span class="codefrag">Pixma</span> due to use of a <span class="codefrag">SynonymFilter</span>.
</li>
</ul>
<p>A full description of the analysis components, Analyzers, Tokenizers, and TokenFilters
available for use is <a href="http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters">here</a>.
</p>
<a name="N1030B"></a><a name="Analysis+Debugging"></a>
<h3 class="boxed">Analysis Debugging</h3>
<p>There is a handy <a href="http://localhost:8983/solr/admin/analysis.jsp">analysis</a>
debugging page where you can see how a text value is broken down into words,
and shows the resulting tokens after they pass through each filter in the chain.
</p>
<p>
<a href="http://localhost:8983/solr/admin/analysis.jsp?name=name&amp;val=Canon+Power-Shot+SD500">This</a>
shows how "<span class="codefrag">Canon Power-Shot SD500</span>" would be indexed as a value in the name field. Each row of
the table shows the resulting tokens after having passed through the next <span class="codefrag">TokenFilter</span> in the analyzer for the <span class="codefrag">name</span> field.
Notice how both <span class="codefrag">powershot</span> and <span class="codefrag">power</span>, <span class="codefrag">shot</span> are indexed. Tokens generated at the same position
are shown in the same column, in this case <span class="codefrag">shot</span> and <span class="codefrag">powershot</span>.
</p>
<p>Selecting <a href="http://localhost:8983/solr/admin/analysis.jsp?name=name&amp;verbose=on&amp;val=Canon+Power-Shot+SD500">verbose output</a>
will show more details, such as the name of each analyzer component in the chain, token positions, and the start and end positions
of the token in the original text.
</p>
<p>Selecting <a href="http://localhost:8983/solr/admin/analysis.jsp?name=name&amp;highlight=on&amp;val=Canon+Power-Shot+SD500&amp;qval=Powershot sd-500">highlight matches</a>
when both index and query values are provided will take the resulting terms from the query value and highlight
all matches in the index value analysis.
</p>
<p>
<a href="http://localhost:8983/solr/admin/analysis.jsp?name=text&amp;highlight=on&amp;val=Four+score+and+seven+years+ago+our+fathers+brought+forth+on+this+continent+a+new+nation%2C+conceived+in+liberty+and+dedicated+to+the+proposition+that+all+men+are+created+equal.+&amp;qval=liberties+and+equality">Here</a>
is an example of stemming and stop-words at work.
</p>
</div>
<a name="N1034D"></a><a name="Conclusion"></a>
<h2 class="boxed">Conclusion</h2>
<div class="section">
<p>
Congratulations! You successfully ran a small Solr instance, added some
documents, and made changes to the index and schema. You learned about queries, text
analysis, and the Solr admin interface. You're ready to start using Solr on
your own project! Continue on with the following steps:
</p>
<ul>
<li>Subscribe to the Solr <a href="mailing_lists.html">mailing lists</a>!</li>
<li>Make a copy of the Solr <span class="codefrag">example</span> directory as a template for your project.</li>
<li>Customize the schema and other config in <span class="codefrag">solr/conf/</span> to meet your needs.</li>
</ul>
<p>
Solr has a ton of other features that we haven't touched on here, including
<a href="http://wiki.apache.org/solr/DistributedSearch">distributed search</a>
to handle huge document collections,
<a href="http://wiki.apache.org/solr/FunctionQuery">function queries</a>,
<a href="http://wiki.apache.org/solr/StatsComponent">numeric field statistics</a>,
and
<a href="http://wiki.apache.org/solr/ClusteringComponent">search results clustering</a>.
Explore the <a href="http://wiki.apache.org/solr/FrontPage">Solr Wiki</a> to find
more details about Solr's many <a href="features.html">features</a>.
</p>
<p>
Have Fun, and we'll see you on the Solr mailing lists!
</p>
</div>
</div>
<!--+
|end content
+-->
<div class="clearboth">&nbsp;</div>
</div>
<div id="footer">
<!--+
|start bottomstrip
+-->
<div class="lastmodified">
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<div class="copyright">
Copyright &copy;
2007 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
</div>
<!--+
|end bottomstrip
+-->
</div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-94576-12']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body>
</html>