An ExcerptProvider retrieves text excerpts for a node in the query result and marks up the words in the text that match the query terms.
By default, highlighting words matched the query is disabled because
this feature requires that additional information is written to the search
index. To enable this feature, you need to add a configuration parameter
to the query-handler
element in your JCR configuration file.
<param name="support-highlighting" value="true"/>
Additionally, there is a parameter that controls the format of the
excerpt created. In JCR, the default is set to
org.exoplatform.services.jcr.impl.core.query.lucene.DefaultHTMLExcerpt
.
The configuration parameter for this setting is:
<param name="excerptprovider-class" value="org.exoplatform.services.jcr.impl.core.query.lucene.DefaultXMLExcerpt"/>
This excerpt provider creates an XML fragment of the following form:
<excerpt>
<fragment>
<highlight>exoplatform</highlight> implements both the mandatory
XPath and optional SQL <highlight>query</highlight> syntax.
</fragment>
<fragment>
Before parsing the XPath <highlight>query</highlight> in
<highlight>exoplatform</highlight>, the statement is surrounded
</fragment>
</excerpt>
This excerpt provider creates an HTML fragment of the following form:
<div>
<span>
<strong>exoplatform</strong> implements both the mandatory XPath
and optional SQL <strong>query</strong> syntax.
</span>
<span>
Before parsing the XPath <strong>query</strong> in
<strong>exoplatform</strong>, the statement is surrounded
</span>
</div>
If you are using XPath, you must use the rep:excerpt()
function in
the last location step:
QueryManager qm = session.getWorkspace().getQueryManager();
Query q = qm.createQuery("//*[jcr:contains(., 'exoplatform')]/(@Title|rep:excerpt(.))", Query.XPATH);
QueryResult result = q.execute();
for (RowIterator it = result.getRows(); it.hasNext(); ) {
Row r = it.nextRow();
Value title = r.getValue("Title");
Value excerpt = r.getValue("rep:excerpt(.)");
}
The above code searches for nodes that contain the exoplatform word
and then gets the value of the Title
property and an excerpt
for each result node.
It is also possible to use a relative path in the
Row.getValue()
call while the query statement still remains the same. Also,
you may use a relative path to a string property. The returned value
will then be an excerpt based on string value of the property.
Both available excerpt providers will create fragments of about 150 characters and up to 3 fragments.
In SQL, the function is called excerpt()
without the rep
prefix,
but the column in the RowIterator
will nonetheless be labelled
rep:excerpt(.)
.
QueryManager qm = session.getWorkspace().getQueryManager();
Query q = qm.createQuery("select excerpt(.) from nt:resource where contains(., 'exoplatform')", Query.SQL);
QueryResult result = q.execute();
for (RowIterator it = result.getRows(); it.hasNext(); ) {
Row r = it.nextRow();
Value excerpt = r.getValue("rep:excerpt(.)");
}
It is also possible to get an excerpt of all the properties at the same time. See the example below:
QueryManager qm = session.getWorkspace().getQueryManager();
queryManager.createQuery("select excerpt(.) from exo:article where contains(exo:title, 'excerpt') or contains(exo:text, 'excerpt') or contains(exo:summary, 'excerpt') ORDER BY exo:title", Query.SQL);
QueryResult result = q.execute();
for (RowIterator it = result.getRows(); it.hasNext(); )
{
Row r = it.nextRow();
Value excerpt = r.getValue("rep:excerpt(exo:text|exo:summary|exo:title)");
}
The maximum number of fragments to create can be changed thanks to the
exo.jcr.component.core.AbstractExcerpt.maxFragments
System property. The default value of this parameter is 3.
The maximum number of characters in a fragment can be changed thanks to the
exo.jcr.component.core.AbstractExcerpt.maxFragmentSize
System property.
The default value of this parameter is 150 characters.