Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.
SOLVED

search for text in content fragments ("search text containing in any property or associated tags in content fragments")

Avatar

Level 7

I am trying to do "search for text in a content fragment or tags associated with content fragments".

I was trying to understand how this https://github.com/Adobe-Marketing-Cloud/aem-guides/blob/master/simple-search-guide/core/src/main/ja...

 code doing search but could not get around how predicateresolver, searchprovider adding any predicates.

 

I assume below code is doing "any property contains search text" return the result node.

 

 

   private void initModel() {
        final long start = System.currentTimeMillis();
        final Map<String, String> searchPredicates = predicateResolver.getRequestPredicates(request);

        if (isSearchable()) {
            com.day.cq.search.result.SearchResult result = searchProvider.search(resourceResolver, searchPredicates);
            pagination = searchProvider.buildPagination(result, "Previous", "Next");
            searchResults = searchProvider.buildSearchResults(result);
            totalResults = computeTotalMatches(result);
            timeTaken = result.getExecutionTimeMillis();
        }
    }

 

 

Any pointers on this.  There are no predicateresolvers or factories given, so not sure how this code even constructs any predicates.

I am looking to see if there is a search api alredy build in aem or write query my self using aem predicates , query builder api to do "search text containing in any property or associated tags in content fragments"

 

Thanks.

Sri

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Hi @sreenu539 ,

You can use fulltext search in content fragments to achieve this requirement, as shown below.

Here we are getting search text from a request in a servlet.

String fullSearchText = request.getParameter("searchText");

Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, SYSTEM_USER);
ResourceResolver resourceResolver = resolverFactory.getServiceResourceResolver(param);
session = resourceResolver.adaptTo(Session.class);

HashMap<String, String> hashMap = new HashMap<>();
// Add primary predicate to the HashMap
hashMap.put("path", "/content/dam/learning");
hashMap.put("type", "cq:ContentFragment");
// Add the full-text predicate to the HashMap
hashMap.put("fulltext", fullSearchText);
// Add the orderby parameter to the HashMap
hashMap.put("orderby", "@jcr:content/cq:lastModified");
hashMap.put("orderby.sort", "desc");
//Fetch all the result
hashMap.put("p.limit", "-1");

// Create the Query object from the HashMap
Query query = queryBuilder.createQuery(PredicateGroup.create(hashMap), session);

// Execute the query and get the results
query.setStart(0);
SearchResult result = query.getResult();
List<Hit> hits = result.getHits();

// Iterate through the results and do something with each hit
arrayList = new ArrayList<>();
for (Hit hit : hits) {
String path = hit.getPath();
//Custom code using result path
}

Hope this could help you !!!

Regards

Shiv

 

Shiv Prakash

View solution in original post

2 Replies

Avatar

Correct answer by
Community Advisor

Hi @sreenu539 ,

You can use fulltext search in content fragments to achieve this requirement, as shown below.

Here we are getting search text from a request in a servlet.

String fullSearchText = request.getParameter("searchText");

Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, SYSTEM_USER);
ResourceResolver resourceResolver = resolverFactory.getServiceResourceResolver(param);
session = resourceResolver.adaptTo(Session.class);

HashMap<String, String> hashMap = new HashMap<>();
// Add primary predicate to the HashMap
hashMap.put("path", "/content/dam/learning");
hashMap.put("type", "cq:ContentFragment");
// Add the full-text predicate to the HashMap
hashMap.put("fulltext", fullSearchText);
// Add the orderby parameter to the HashMap
hashMap.put("orderby", "@jcr:content/cq:lastModified");
hashMap.put("orderby.sort", "desc");
//Fetch all the result
hashMap.put("p.limit", "-1");

// Create the Query object from the HashMap
Query query = queryBuilder.createQuery(PredicateGroup.create(hashMap), session);

// Execute the query and get the results
query.setStart(0);
SearchResult result = query.getResult();
List<Hit> hits = result.getHits();

// Iterate through the results and do something with each hit
arrayList = new ArrayList<>();
for (Hit hit : hits) {
String path = hit.getPath();
//Custom code using result path
}

Hope this could help you !!!

Regards

Shiv

 

Shiv Prakash

Avatar

Community Advisor

@sreenu539 - You can create your custom query builder and look for the search text under the specific CF path.