blob: 62b9e3ceebbb0d9baf1df0ac6809261302e44928 [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/Specifications/Search API,SMILA/Specifications/Search Processing,SMILA/Specifications/Service Runtime Parameters,SMILA/Specifications/Smila Security Concept" />
<link rel="shortcut icon" href="http://wiki.eclipse.org/SMILA/Specifications/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/Specifications/Search API - 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/Specifications/Search_API";
var wgTitle = "SMILA/Specifications/Search API";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "17659";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "236197";
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-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="Search_API.html" /> </head>
<body class="mediawiki ns-0 ltr page-SMILA_Specifications_Search_API">
<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/Specifications/Search_API">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/Specifications/Search_API">What links here</a></li>
<li id="t-recentchangeslinked"><a href="http://wiki.eclipse.org/Special:Recentchangeslinked/SMILA/Specifications/Search_API">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/Specifications/Search_API&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Specifications/Search_API&amp;oldid=236197">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="Search_API.html"><span class="tab">Page</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Talk:SMILA/Specifications/Search_API&amp;action=edit"><span class="tab">Discussion</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Specifications/Search_API&amp;action=edit"><span class="tab">View source</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Specifications/Search_API&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/Specifications/Search%20API"><span class="tab">Edit</span></a></li>
</ul>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<h1 class="firstHeading">SMILA/Specifications/Search API</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="../Specifications.html" title="SMILA/Specifications">Specifications</a></span></div>
<div id="jump-to-nav">Jump to: <a href="Search_API.html#column-one">navigation</a>, <a href="Search_API.html#searchInput">search</a></div> <!-- start content -->
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="Search_API.html#Goals"><span class="tocnumber">1</span> <span class="toctext">Goals</span></a></li>
<li class="toclevel-1"><a href="Search_API.html#Design"><span class="tocnumber">2</span> <span class="toctext">Design</span></a>
<ul>
<li class="toclevel-2"><a href="Search_API.html#Elements_of_queries"><span class="tocnumber">2.1</span> <span class="toctext">Elements of queries</span></a></li>
<li class="toclevel-2"><a href="Search_API.html#Elements_of_results"><span class="tocnumber">2.2</span> <span class="toctext">Elements of results</span></a></li>
<li class="toclevel-2"><a href="Search_API.html#Low_level_API_and_representation"><span class="tocnumber">2.3</span> <span class="toctext">Low level API and representation</span></a>
<ul>
<li class="toclevel-3"><a href="Search_API.html#Representation_of_query_elements"><span class="tocnumber">2.3.1</span> <span class="toctext">Representation of query elements</span></a></li>
<li class="toclevel-3"><a href="Search_API.html#Representation_of_result_elements"><span class="tocnumber">2.3.2</span> <span class="toctext">Representation of result elements</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="Search_API.html#High_level_API"><span class="tocnumber">2.4</span> <span class="toctext">High level API</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="Search_API.html#Examples"><span class="tocnumber">3</span> <span class="toctext">Examples</span></a></li>
<li class="toclevel-1"><a href="Search_API.html#Additional_Notes"><span class="tocnumber">4</span> <span class="toctext">Additional Notes</span></a></li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Goals"></a><h2> <span class="mw-headline"> Goals </span></h2>
<p>The goal is to design a (relatively&nbsp;;-) easy-to-use search API for SMILA.
</p><p>Thoughts/Requirements:
</p>
<ul><li> Processing of Search Requests is done with the BPEL engine. This does not mean that they have to use the same very generic Processor interface (Record list in, Record list out). But it should be similar to avoid getting used to writing completely different kinds of BPEL files.
</li><li> It should be designed to be somehow "specific" for search: We do not want to create an interface where literally everything can be returned, making it quite difficult for clients (and newbie users) to recognize what is returned where, and it requires a lot of configuration effort on the client side to describe which part of a search result can be found where in the server result.
</li><li> On the other hand, we can learn from the current usage of the empolis IAS (eIAS) APIs what elements are needed in search queries and results:
<ul><li> The query needs to have things like query values, filters, boost factors (importance) and other parameters to control the evaluation, and control parameters.
</li><li> The result needs to contain the "effective" query (enriched by text mining, rules, ...), the total number of hits, a result list (result objects + similarities), faceted classification (grouping, dialog questions), highlighting/markup of result attributes.
</li></ul>
</li><li> We have found that it does not make sense to invent new result structures for each new service, but that we rather try to express new service results in terms of existing result structures, because then existing clients can use the new results without changes.
</li><li> We want to design an API that is extensible when new requirements for API elements arise. "Ad-hoc" extensibility would be preferable: I.e., the search API should only be a wrapper for some generic objects to ease accessing them, but it should be possible to use new features by using the generic objects immediately so that one does not have to wait for an API extension.
</li><li> The Search API needs to be usable efficiently over different types of transports. While the most common client may be a servlet (portlet, ...) running in a Tomcat service in the same VM than the actual SMILA processing and search services, other clients may use RMI calls or SOAP webservices to talk to the SMILA search.
</li><li> The search API should be easily consumable by Web, Java, and .NET clients.
</li></ul>
<a name="Design"></a><h2> <span class="mw-headline"> Design </span></h2>
<a name="Elements_of_queries"></a><h3> <span class="mw-headline"> Elements of queries </span></h3>
<p>A search request (or "query" for short) consists of
</p>
<ul><li> workflow name: name of pipeline processing the query.
</li><li> A single query record
<ul><li> The ID of the record could denote a user session (source = client ID, key = session ID) so that it is possible to support session handling in the search backend. If no ID is specified, a GUID is generated as the ID key.
</li><li> Attributes contain the values to search for: Only objects in the index that relate to these attribute value (i.e. have the same values in exact search, or "similar" values in fuzzy search) are part of the result set
</li></ul>
</li><li> Filters: conceptionally limit the allowed values for single search attribute in the result (e.g. if u want to limit the search results to a specific source from whence your index entries originate). If they are only usable as pure filters, that do not select any object for the result set like attribute value, but just restrict the result set created by the result values, or can be used without actual query values to produce just an unranked result, depends on the retrieval service used in the called pipeline.
</li><li> Tweaking of relevance ranking/similarity evaluation: Change weights of single attributes (boosting, "Importance" in eIAS), use different calculation methods for complete query or single attributes ("UseMeasure" in eIAS).
</li><li> Textual query string: Alternatively a query may be described as "single string" representation of query attributes, filter and boosting. To enable this we have to define a search syntax like the <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html" class="external text" title="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html" rel="nofollow">Lucene query parser syntax</a>, for example. It is not necessary that everything is expressible in this search string, but it should be possible to merge a string query with an "object query" (the query expressed by the things above) so one can do whatever is possible with the string search and add advanced features with the query object. In this case the string search would be useful as an easy start for the most common search features.
<ul><li> Note that adopters of SMILA do not have to support the "officially chosen SMILA syntax" if they want to integrate other search engines that supports a different (more sophisticated) query syntax natively. The search API will treat this only as a string and will not perform syntax checking.
</li></ul>
</li><li> Control parameters for pipelets and services: These control the operation of the pipelets and services in the search workflow. like:
<ul><li> size of the result set,
</li><li> "cursor position" or page in the result,
</li><li> query language, user ID or token (e.g. if needed for security),
</li><li> sort order,
</li><li> etc.
</li></ul>
</li></ul>
<dl><dd> See <a href="Service_Runtime_Parameters.html" title="SMILA/Specifications/Service Runtime Parameters">SMILA/Specifications/Service Runtime Parameters</a> for details on the representation and the evaluation of these parameters in the services/pipelets.
</dd></dl>
<a name="Elements_of_results"></a><h3> <span class="mw-headline"> Elements of results </span></h3>
<p>A search result consists of:
</p>
<ul><li> a single object representing the "effective query": During the search workflow the query object and parameters may have been changed or enhanced by text mining, rules and other query processing services. The search client may need to access the results of this query analysis and enrichment, e.g. to
<ul><li> highlight concepts recognized in the query,
</li><li> present spellchecker proposals ("Did you mean:").
</li><li> This object may further be used to return information attached that is not even related to a single search result object, such as for instance
<ul><li> to create a follow-up or alternative query (e.g. "similar searches:...").
</li><li> a faceted classification of the search result (aka grouping, dialog questions).
</li></ul>
</li></ul>
</li><li> a result object list representing the hits to display in the client as the result of the search. The result objects consist of information that is returned from the index or an associated record store, e.g. SMILA XML storage, and may be enriched by pipelets and services that create single-result-object related information, e.g. highlighting/marker services or adaptation rules.
</li></ul>
<p>For efficient communication with the client, both parts of the result are optional. This is obvious for the "effective query" object since there may be clients that are only interested in the result objects. But there could also be searches that are only interested in the query analysis, enrichment, classification and do not need the actual search result, e.g. an AJAX client looking for query proposals while the user is typing in the search text field.
</p>
<a name="Low_level_API_and_representation"></a><h3> <span class="mw-headline"> Low level API and representation </span></h3>
<p>"Low-level" means a description of the actual objects that are given to the workflow processor (i.e. BPEL engine, currently) and that are returned as a result. The base of the low level representation os the SMILA record, i.e. everything listed above as a part of a query or search result must be represented as a part of a record. This way each part of the query (and result) is available inside the BPEL pipeline by just accessing record attributes or record annotations.
</p><p>This means that the interface of the Search Service is:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">interface</span> SearchService <span class="br0">&#123;</span>
<span class="kw3">SearchResult</span> search<span class="br0">&#40;</span><span class="kw3">String</span> workflowName, Record query<span class="br0">&#41;</span> <span class="kw1">throws</span> ProcessingException;
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">interface</span> <span class="kw3">SearchResult</span> <span class="br0">&#123;</span>
<span class="kw3">String</span> getWorkflowName<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// to be able to create follow-up queries.</span>
Record getQuery<span class="br0">&#40;</span><span class="br0">&#41;</span>;
List&lt;Record&gt; getResult<span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></div>
<p>Simple, isn't it? This is also the API which is exposed by a remote Search Service, may it be a as an RMI interface or a WebService interface or whatever.
</p><p>Every query part apart form the workflow name is attached to the query record as an annotation. Also, each part of the result is attached to either the "effective query" record or the record in the result list, depending if is related to the complete query as such or to a single result.
</p><p><br />
The following sub-sections describe how query and result elements are represented in this low-level structure.
</p>
<a name="Representation_of_query_elements"></a><h4> <span class="mw-headline"> Representation of query elements </span></h4>
<ul><li> query attribute values: stored as record attributes, of course.
</li></ul>
<ul><li> service/pipelet parameters: This is stored in annotations of the query record, see <a href="Service_Runtime_Parameters.html" title="SMILA/Specifications/Service Runtime Parameters">SMILA/Specifications/Service Runtime Parameters</a> for details on representation and evaluation:
<ul><li> string query: named value "query"
</li><li> result set size: named value "resultSize"
</li><li> offset in result set (for paging): named value "resultOffset"
</li><li> minimal relevance: named value "threshold"
</li><li> language of query: named value "language"
</li><li> order-by specification: list of sub-annotations "orderBy" with named values "attribute" = attribute to order by, "mode" = "ASC"/"DESC", precedence is given by list order
</li><li> more parameters can be added and should be observed by all pipelets if no specific parameter are set (see below)
</li></ul>
</li></ul>
<ul><li> filter: annotation "filter" of attribute to which the filter applies. A list of filter values can be added in the list of anonymous values. The meaning of the filter is determined by named values:
<ul><li> "type": "enumeration", "range"
</li><li> "mode": "all" (all filter values must be in result attribute), "any" (at least one filter value must be in result attrbute), "none" (no filter value is in result attribute), "only" (result attribute contains only filter values)
</li><li> for range filters: no anonymous values, but "min" and "max" named values describing the range of the filter. Only "any", "none", "only" make sense as modes for interval filter.
</li></ul>
</li></ul>
<ul><li> changing relevance ranking: annotation "ranking" on complete record or attribute to manipulate. named values
<ul><li> "name": select another ranking calculation method than the default.
</li><li> "boost": change weight of attribute (irrelevant in top-level annotation)
</li></ul>
</li></ul>
<p><br />
</p>
<a name="Representation_of_result_elements"></a><h4> <span class="mw-headline"> Representation of result elements </span></h4>
<ul><li> Effective query: a single record as part of search result. Contains everything the original query object contained, plus additional information computed by services in the workflow.
</li><li> total number of hits: annotation "result" of effective query object, named value "totalNoOfHits". This is currently the only value of this annotation, but others general result properties could be added later.
</li><li> Result objects: a list of records as part of the search result. Can be created by the index service or loaded from record (XML) storage and may be manipulated by subsequent services in the pipeline.
</li><li> relevance ranking: top-level annotation "result" of each result object, named value "relevance" (Double, usually between 0 and 1)
</li><li> Textmining proposals (spellchecker, wildcards, "meinten sie"): list of annotations named "terms" on analysed attribute with named values "concept" (recognized term), "token" (original string), "target", "startChar", "endChar", "startWord", "endWord", "pos" (part-of-speech), "method" (Typo, Wildcard, ...), "quality"
</li><li> Facet classification: Annotation "facets" on classified attributes of effective query.
<ul><li> named value "name": description of the group (usually the classifying value).
</li><li> named value "count": no of hits in this facet
</li><li> filter: either named value "filter" in query string syntax or sub-annotation "filter" using filter annotation struction (see query elements) - or both?
</li><li> sub-facets: List of sub-annotations with same structure. Name of annotation is name of classified attribute.
</li></ul>
</li><li> Highlighting: annotation "highlight" on top-level or on single attribute. Contents:
<ul><li> named value "text": either plain text to markup (smartfinder like) or already marked up on server side (orenge:Marker like), depending on configuration
</li><li> sub-annotations "positions": if text is not marked up already: info where to put highlights, so that client can do it on its own. Named values: "startPos", "endPos", "quality", "queryGroup", "type" (see smartfinder highlighting for explanation)
</li></ul>
</li></ul>
<a name="High_level_API"></a><h3> <span class="mw-headline"> High level API </span></h3>
<p>"High-level API" means a set of Java classes that can be used in clients to create the low-level objects. Note that a client can always bypass the high level API in order to express and access things that are not yet supported by the high level API, but are representable in elements of the low level API. But usually it should not be necessary for a client to do this, but it should be possible to create queries and read results by using only the high level API.
</p><p>The query builder API is designed as a "fluent API" that makes it simpler to set all the parts in simple statements: Most methods return a QueryBuilder which is just the same object on which the methods was called ("return this;"). See the Examples section below. This means that this API should never be remoted, but used locally on the client side to build a complete request that is sent to a remote search service for evaluation.
</p><p>All the following classes or interfaces are not meant to by a specification claiming to be complete. I'm pretty sure that during implementation and initial usages we will find a lots of need (or at least wishes) for more convenience methods.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">enum</span> FilterMode <span class="br0">&#123;</span> ANY, ALL, NONE, ONLY <span class="br0">&#125;</span>; <span class="co1">// use in filter creation</span>
&nbsp;
<span class="kw1">enum</span> OrderMode <span class="br0">&#123;</span> ASC, DESC <span class="br0">&#125;</span>; <span class="co1">// use in OrderBy spec creation</span>
&nbsp;
<span class="kw1">class</span> QueryBuilder <span class="br0">&#123;</span>
QueryBuilder<span class="br0">&#40;</span><span class="kw3">String</span> workflowName<span class="br0">&#41;</span>; <span class="co1">// init request for given pipeline</span>
QueryBuilder<span class="br0">&#40;</span><span class="kw3">String</span> workflowName, RecordFactory factory<span class="br0">&#41;</span>; <span class="co1">// init request for given pipeline, use non-default RecordFactory.</span>
QueryBuilder setQuery<span class="br0">&#40;</span><span class="kw3">String</span> queryString<span class="br0">&#41;</span>;
QueryBuilder setResultSize<span class="br0">&#40;</span><span class="kw4">int</span> size<span class="br0">&#41;</span>;
QueryBuilder setResultOffset<span class="br0">&#40;</span><span class="kw4">int</span> offset<span class="br0">&#41;</span>;
QueryBuilder setThreshold<span class="br0">&#40;</span><span class="kw4">double</span> threshold<span class="br0">&#41;</span>;
QueryBuilder setLanguage<span class="br0">&#40;</span><span class="kw3">String</span> language<span class="br0">&#41;</span>;
QueryBuilder addLiteral<span class="br0">&#40;</span><span class="kw3">String</span> attribute, <span class="kw3">Object</span> value<span class="br0">&#41;</span> <span class="kw1">throws</span> InvalidTypeException;
QueryBuilder addLiteral<span class="br0">&#40;</span><span class="kw3">String</span> attribute, Literal literal<span class="br0">&#41;</span>;
QueryBuilder addEnumFilter<span class="br0">&#40;</span><span class="kw3">String</span> attribute, FilterMode mode, Iterable&lt;Object&gt; filterValues<span class="br0">&#41;</span> <span class="kw1">throws</span> InvalidTypeException;
QueryBuilder addRangeFilter<span class="br0">&#40;</span><span class="kw3">String</span> attribute, FilterMode mode, <span class="kw3">Object</span> lowerBound, <span class="kw3">Object</span> upperBound<span class="br0">&#41;</span> <span class="kw1">throws</span> InvalidTypeException;
QueryBuilder addFacetFilter<span class="br0">&#40;</span>Facets facetList, <span class="kw4">int</span> index<span class="br0">&#41;</span>; <span class="co1">// copy filter from a facet to the attribute of this facet.</span>
QueryBuilder addOrderBy<span class="br0">&#40;</span><span class="kw3">String</span> attribute, OrderMode mode<span class="br0">&#41;</span>;
QueryBuilder addParameter<span class="br0">&#40;</span><span class="kw3">String</span> valueName, <span class="kw3">String</span> value<span class="br0">&#41;</span> <span class="co1">// sets a named value in a general param annotation</span>
QueryBuilder addParameter<span class="br0">&#40;</span><span class="kw3">String</span> name, <span class="kw3">String</span> valueName, <span class="kw3">String</span> value<span class="br0">&#41;</span> <span class="co1">// sets a named value in a general param sub-annotation</span>
QueryBuilder addParameter<span class="br0">&#40;</span><span class="kw3">String</span> name, <span class="kw3">String</span> value<span class="br0">&#41;</span> <span class="co1">// adds an anonymous value to a general param sub-annotation</span>
ResultAccessor executeRequest<span class="br0">&#40;</span>SearchService searchService<span class="br0">&#41;</span> <span class="kw1">throws</span> ProcessingException;
<span class="co1">// execute query on given search service and wrap result in high level result helper</span>
Record getRecord<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// access underlying query record for advanced manipulation</span>
<span class="kw3">String</span> getWorkflowName<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// for completeness ...</span></pre></div>
<p>Note that the SearchService for the executeRequest does not need to be the WorkflowProcessor itself, but can also be a remote proxy to a real service. This way it's transparent if the client uses a local SearchService or a remote one and which protocols are used to talk to the remote service.
</p><p>And then we need some classes to access the search result:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> SearchResultAccessor <span class="br0">&#123;</span>
ResultAccessor<span class="br0">&#40;</span><span class="kw3">SearchResult</span> result<span class="br0">&#41;</span>;
<span class="kw3">SearchResult</span> getResult<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// access original result</span>
&nbsp;
<span class="kw3">String</span> getWorkflowName<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// for convenience</span>
QueryRecordAccessor getQuery<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> resultLength<span class="br0">&#40;</span><span class="br0">&#41;</span>;
ResultRecordAccessor getResult<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// create new QueryBuilder for same pipeline from effective query object of this result:</span>
QueryBuilder newQueryBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// use complete query object</span>
QueryBuilder newQueryBuilder<span class="br0">&#40;</span><span class="kw3">String</span> recordFilterName<span class="br0">&#41;</span>;
<span class="co1">// keep only parts of query object as described by record filter.</span>
<span class="co1">// parameters are always copied.</span>
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> RecordAccessor <span class="br0">&#123;</span>
RecordAccessor<span class="br0">&#40;</span>Record record<span class="br0">&#41;</span>;
<span class="co1">// methods to read literals and annotations, similar to blackboard.</span>
<span class="co1">// this is just &quot;to get the idea&quot;, it's not meant as a complete description.</span>
<span class="co1">// if more convenience methods are needed, they should be added on demand.</span>
&nbsp;
<span class="co1">// access literals</span>
<span class="kw4">boolean</span> hasLiterals<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
<span class="kw4">int</span> literalSize<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
Literal getLiteral<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
List&lt;Literal&gt; getLiterals<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// access top-level annotations</span>
<span class="kw4">boolean</span> hasAnnotations<span class="br0">&#40;</span><span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
<span class="kw4">int</span> annotationSize<span class="br0">&#40;</span><span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
<span class="kw3">Annotation</span> getAnnotation<span class="br0">&#40;</span><span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
List&lt;Annotation&gt; getAnnotations<span class="br0">&#40;</span><span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// access attribute annotations</span>
<span class="kw4">boolean</span> hasAnnotations<span class="br0">&#40;</span><span class="kw3">String</span> attributeName,<span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
<span class="kw4">int</span> annotationSize<span class="br0">&#40;</span><span class="kw3">String</span> attributeName,<span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
<span class="kw3">Annotation</span> getAnnotation<span class="br0">&#40;</span><span class="kw3">String</span> attributeName, <span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
List&lt;Annotation&gt; getAnnotations<span class="br0">&#40;</span><span class="kw3">String</span> attributeName, <span class="kw3">String</span> annotationName<span class="br0">&#41;</span>;
&nbsp;
Record getRecord<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// get underlying record.</span>
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> QueryRecordAccessor <span class="kw1">extends</span> RecordAccessor<span class="br0">&#123;</span>
QueryRecordAccessor<span class="br0">&#40;</span>Record record<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// methods to read query parameters and annotations</span>
<span class="kw4">int</span> getResultSize<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> getResultOffset<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">double</span> getThreshold<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw3">String</span> getLanguage<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> getTotalNoOfHits<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="kw3">String</span> getParameter<span class="br0">&#40;</span><span class="kw3">String</span> valueName<span class="br0">&#41;</span> <span class="co1">// gets a named value from general param annotation</span>
<span class="kw3">String</span> getParameter<span class="br0">&#40;</span><span class="kw3">String</span> name, <span class="kw3">String</span> valueName<span class="br0">&#41;</span> <span class="co1">// gets a named value from a general param sub-annotation</span>
List&lt;String&gt; getParameter<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="co1">// gets anonymous values from a general param sub-annotation</span>
&nbsp;
Terms getTerms<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
Facets getFacets<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> ResultRecordAccessor <span class="kw1">extends</span> RecordAccessor<span class="br0">&#123;</span>
ResultRecordAccessor<span class="br0">&#40;</span>Record record<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// methods to read result annotations</span>
<span class="kw4">int</span> getRelevance<span class="br0">&#40;</span><span class="br0">&#41;</span>;
HighlightInfo getHighlightInfo<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// get top-level highlight.</span>
HighlightInfo getHighlightInfo<span class="br0">&#40;</span><span class="kw3">String</span> attributeName<span class="br0">&#41;</span>; <span class="co1">// get attribute hightlight</span>
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> Terms <span class="kw1">extends</span> AnnotationListWrapper <span class="br0">&#123;</span>
<span class="kw3">String</span> getAttributeName<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> length<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw3">String</span> getConcept<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">String</span> getToken<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">String</span> getTargetAttributeName<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getStartCharPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getEndCharPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getStartWordPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getEndWordPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">String</span> getPartOfSpeech<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">String</span> getMethod<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">double</span> getQuality<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// for extensibility, if a special service creates more data.</span>
<span class="kw3">String</span> getProperty<span class="br0">&#40;</span><span class="kw4">int</span> index, <span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="co1">// access named value of n'th annotations in list</span>
&nbsp;
List&lt;Annotation&gt; getSource<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> Facets <span class="br0">&#123;</span>
<span class="kw3">String</span> getAttributeName<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> length<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw3">String</span> getName<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">String</span> getStringFilter<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw3">Annotation</span> getObjectFilter<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getCount<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
Facets getSubFacets<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// for extensibility, if a special service creates more data.</span>
<span class="kw3">String</span> getProperty<span class="br0">&#40;</span><span class="kw4">int</span> index, <span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="co1">// access named value of n'th annotations in list</span>
&nbsp;
List&lt;Annotation&gt; getSource<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// access to original objects</span>
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> HighlightInfo <span class="br0">&#123;</span>
<span class="kw3">String</span> getAttributeName<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw3">String</span> getText<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// for extensibility, if a special service creates more data.</span>
<span class="kw3">String</span> getProperty<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="co1">// access named value of highlight annotation</span>
&nbsp;
<span class="kw4">boolean</span> isHighlighted<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// iff (noOfPositions() == 0)</span>
<span class="kw4">int</span> length<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw4">int</span> getStartPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getEndPos<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">double</span> getQuality<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getQueryGroup<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
<span class="kw4">int</span> getType<span class="br0">&#40;</span><span class="kw4">int</span> index<span class="br0">&#41;</span>;
&nbsp;
<span class="co1">// for extensibility, if a special service creates more data.</span>
<span class="kw3">String</span> getProperty<span class="br0">&#40;</span><span class="kw4">int</span> index, <span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="co1">// access named value of n'th sub-annotation</span>
&nbsp;
<span class="kw3">Annotation</span> getSource<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// access to original object</span>
<span class="br0">&#125;</span></pre></div>
<p><br />
</p>
<a name="Examples"></a><h2> <span class="mw-headline"> Examples </span></h2>
<p>A sample query session:
</p><p>Start with only a fulltext query:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw3">SearchResult</span> result = <span class="kw1">new</span> QueryBuilder<span class="br0">&#40;</span><span class="st0">&quot;SearchPipeline&quot;</span><span class="br0">&#41;</span>
.<span class="me1">setQuery</span><span class="br0">&#40;</span>queryString<span class="br0">&#41;</span>
.<span class="me1">setResultSize</span><span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span>
.<span class="me1">setResultOffset</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="co1">// optional, of course</span>
.<span class="me1">setThreshold</span><span class="br0">&#40;</span><span class="nu0">0.2</span><span class="br0">&#41;</span>
.<span class="me1">setLanguage</span><span class="br0">&#40;</span>userLanguage<span class="br0">&#41;</span>
.<span class="me1">executeSearch</span><span class="br0">&#40;</span>searchService<span class="br0">&#41;</span>;
<span class="co1">// display result.</span></pre></div>
<p>Create a follow-up query with filtering by a user-selected facet:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java">result = result.<span class="me1">newQueryBuilder</span><span class="br0">&#40;</span><span class="st0">&quot;queryTextFilter&quot;</span><span class="br0">&#41;</span>
.<span class="me1">addFacetFilter</span><span class="br0">&#40;</span>selectFacet, selectedIndex<span class="br0">&#41;</span>
.<span class="me1">executeSearch</span><span class="br0">&#40;</span>searchService<span class="br0">&#41;</span>;
<span class="co1">// display result.</span></pre></div>
<p>Or do some paging in the result list:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java">result = result.<span class="me1">newQueryBuilder</span><span class="br0">&#40;</span><span class="st0">&quot;queryTextFilter&quot;</span><span class="br0">&#41;</span>
.<span class="me1">setResultOffset</span><span class="br0">&#40;</span>page * <span class="nu0">6</span><span class="br0">&#41;</span>.
.<span class="me1">executeSearch</span><span class="br0">&#40;</span>searchService<span class="br0">&#41;</span>;
<span class="co1">// display result.</span></pre></div>
<p>Or re-order the result list:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java">result = result.<span class="me1">newQueryBuilder</span><span class="br0">&#40;</span><span class="st0">&quot;queryTextFilter&quot;</span><span class="br0">&#41;</span>
.<span class="me1">addOrderBy</span><span class="br0">&#40;</span><span class="st0">&quot;PRICE&quot;</span>, OrderMode.<span class="me1">ASC</span><span class="br0">&#41;</span>
.<span class="me1">executeSearch</span><span class="br0">&#40;</span>searchService<span class="br0">&#41;</span>;
<span class="co1">// display result.</span></pre></div>
<a name="Additional_Notes"></a><h2> <span class="mw-headline"> Additional Notes </span></h2>
<ul><li> I propose to extend the SMILA Literal interface with the possibility to add a language specific label to the literal value. This way the SearchService could add labels in the search language to literals contained in the result which the client could use to nicely display concept values in the results.
</li><li> This proposal will have an effect on the ProcessingService/Pipelet interface, because at the moment we do not have the possibility to give an extra query object to the pipelet. See <a href="Search_Processing.html" title="SMILA/Specifications/Search Processing">SMILA/Specifications/Search Processing</a> for details, ideas and discussions.
</li><li> The proposed helper interfaces currently supports only using literal attributes, i.e. no MObjects as attribute values. This is based on the assumption is that it will be sufficient for nearly all search applications. Complex objects may still be created using the low-level Record API directly, because all helper classes allow the direct access to the underlying objects. Also an extension of the helper methods to allow the use of attribute paths instead just names would be an option, if necessary.
</li><li> An extension of the high level API supporting the representation of information about the searching user according to <a href="Smila_Security_Concept.html" title="SMILA/Specifications/Smila Security Concept">SMILA/Specifications/Smila Security Concept</a> will be added when the security specification is finished.
</li></ul>
<!--
NewPP limit report
Preprocessor node count: 50/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
#ifexist count: 0/100
-->
<!-- Saved in parser cache with key wikidb:pcache:idhash:17659-0!1!0!!en!2!edit=0 and timestamp 20110328164204 -->
<div class="printfooter">
Retrieved from "<a href="Search_API.html">http://wiki.eclipse.org/SMILA/Specifications/Search_API</a>"</div>
<div id="catlinks"><p class='catlinks'><a href="http://wiki.eclipse.org/Special:Categories" title="Special:Categories">Category</a>: <span dir='ltr'><a href="http://wiki.eclipse.org/Category:SMILA" title="Category:SMILA">SMILA</a></span></p></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 10:47, 26 January 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/User:Juergen.schumacher.empolis.com" title="User:Juergen.schumacher.empolis.com">Juergen Schumacher</a>.</p>
<p id="footerviews">This page has been accessed 1,901 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.059 secs. --></body></html>