Java service
Augmented Search exposes a OSGI service to execute search queries. To use this service in your Jahia modules, you need to have a dependency on Augmented Search in your pom.xml file.
<dependency>
<groupId>org.jahia.modules</groupId>
<artifactId>augmented-search</artifactId>
<version>2.1.2</version>
<scope>provided</scope>
</dependency>
Then, to use Augmented Search you will first need to get the service.
ServiceReference searchReference = bundleContext.getServiceReference(AugmentedSearchService.class);
if (searchReference != null) {
AugmentedSearchService searchService = bundleContext.getService(searchReference);
You can then use the searchService
to execute searches. For example, the snippet below searches for terms in the query
variable across all content nodes (as per the filter on jnt:content
defined in GqlFilterNodeType
).
GqlSearchResults response = searchService.search(query,
AugmentedSearchService.SearchIn.CONTENT, 20, 0, null,
new GqlFilter(null, null, null, null,
new GqlFilterNodeType("jnt:content", false), null, null),
getCurrentResource().getNode().getResolveSite().getSiteKey(),
getCurrentResource().getLocale().getLanguage(), getCurrentResource().getWorkspace(),
getCurrentResource().getNode().getSession());
You can also perform simple searches or fetch facets along with your search. The response object contains the result from all the facets and from the main search query. To access those results, grab the SearchResponse
object by calling getMainQueryResponse
.
The following snippet returns a summary of the search results.
String message = String.format("Search took %s and found %d results when searching for %s",
response.getTook(),
response.getTotalHits(),
query);
This can also be used in a taglib for example.
<as:search q="ceo"/>
<ol>
<c:forEach items="${asResults.hits}" var="hit">
<li>${hit.fields["jgql:displayableName"].value}</li>
</c:forEach>
</ol>
Which results in the following rendering.
You can find the full codebase for the taglib example in this repository: https://github.com/Jahia/augmented-search-taglib
Fetch mappedNodeTypes
You can fetch any properties stored in the Elasticsearch directly from the OSGI service.
In the example below (also available in this repository), we are passing Arrays.asList("jgql:createdBy", "jgql:lastModifiedBy")
to fetch the values of the corresponding properties from the index.
public int doEndTag() throws JspException {
BundleContext bundleContext = FrameworkUtil.getBundle(SearchTag.class).getBundleContext();
if (bundleContext != null) {
ServiceReference<AugmentedSearchService> searchReference = bundleContext.getServiceReference(AugmentedSearchService.class);
if (searchReference != null) {
AugmentedSearchService searchService = bundleContext.getService(searchReference);
try {
GqlFilter filter = new GqlFilter(null, null, null, null,
new GqlFilterNodeType("jnt:content", true),
null, null);
JCRNodeWrapper node = getCurrentResource().getNode();
GqlSearchResultsV2 response = searchService.search(query, AugmentedSearchService.SearchIn.CONTENT, 20, 0,
null,
filter,
node.getResolveSite().getSiteKey(),
getCurrentResource().getLocale().getLanguage(),
getCurrentResource().getWorkspace(),
node.getSession(),
Arrays.asList("jgql:createdBy", "jgql:lastModifiedBy"));
String message = String.format("Search took %s and found %d results when searching for %s",
response.getTook(),
response.getTotalHits(),
query);
pageContext.getOut().print(message);
pageContext.setAttribute("asResults", response.getHits());
} catch (EmptySearchException | RepositoryException | IOException e) {
throw new JspException(e);
}
}
return EVAL_BODY_INCLUDE;
}
return SKIP_BODY;
}