Need for Query and Index in AEM
For functionalities like full text search, retrieve content based on certain property or conditions associated with property/to avoid iterations on huge volume of content under the root, we write query based logic in AEM.
Languages supported :
- XPATH
 - JCR-SQL2
 
XPath:
- Created using AEM Query Builder API. - com.day.cq.search.*
 - From development point of view, we need to be aware of standard OOB predicates to arrive at XPATH query.
 
- JCR-SQL2 queries are created using QueryManager - javax.jcr.query.QueryManager
 - QueryManager is acquired through JCR Session - session.getWorkspace().getQueryManager()
 
Query Processing:
- Before AEM 6.0/Jackrabbit 2, everything in AEM is indexed by default.
 - With Jackrabbit Oak, we can create custom indexes based on the need. OOB indexes are available under /oak:index node in the repository.
 - Oak Query Engine
 - Process queries in the form of JCR-SQL2.
 - This means if we write queries using QueryBuilder API involving predicates, it will result in XPath query.
 - QueryEngineImpl(org.apache.jackrabbit.oak.query.QueryEngineImpl) then parses XPATH query and converts to SQL2.
 - Uses a cost based query optimizer to get the cost involved to process the query from all the available indexes.
 - All the available indexes under oak:index will estimate the cost.
 - Cost for traversal is also calculated.
 - Cost value of the index can be "Infinity". This implies that respective index cannot deal with specific condition/respective index cannot query the data.
 - Query Engine then picks the index which has lowest estimated cost.
 - Note :
 - Cost value is an estimated worst-case value and hence need not be accurate.
 - The above said process happens whenever a query is executed.
 - Example:
 - If a query is written to get all pages with specific "jcr:title" value, query engine need not traverse the entire repository for jcr:title, instead looks for selected index(based on cost) and then fetch/filter results from that indexed content.
 - oak:index definition for jcr:title of page is available OOB in /oak:index/cqPageLucene/indexRules/cq:Page/properties/jcrTitle
 
Need for creating custom index:
- When the query engine has to traverse the entire repository/more than allowed nodes(per configuration, its100000 - Apache Jackrabbit Query Engine Settings - In memory read limit) for what we have queried for, it will result in slow query and eventually throw UnsupportedOperationException to stop further processing. (Observing the logs, we would notice a warn level message suggesting to create an index as shown below)
 
*DEBUG* [0:0:0:0:0:0:0:1 [1588022611960] GET /libs/cq/search/content/querydebug.html HTTP/1.1] org.apache.jackrabbit.oak.query.QueryImpl no proper index was found for filter Filter(query=select [jcr:path], [jcr:score], * from [nt:unstructured] as a where isdescendantnode(a, '/') /* xpath: /jcr:root//element(*, nt:unstructured) */, path=//*)
*WARN* [0:0:0:0:0:0:0:1 [1588022611960] GET /libs/cq/search/content/querydebug.html HTTP/1.1] org.apache.jackrabbit.oak.query.QueryImpl Traversal query (query without index): select [jcr:path], [jcr:score], * from [nt:unstructured] as a where isdescendantnode(a, '/') /* xpath: /jcr:root//element(*, nt:unstructured) */; consider creating an index
Screenshot of OSGI config for reference:
Play around in your local instance (to visualize the flow mentioned above)
Screenshot of OSGI config for reference:
Play around in your local instance (to visualize the flow mentioned above)
- Create a new logger entry in sling log for below highlighted APIs

 - Navigate to http://localhost:4502/libs/cq/search/content/querydebug.html and frame a sample query predicates and execute. (Can also try to intentionally induce a traversal query in local and observe the logs)
path=/content/we-retail 
type=cq:Page
1_property=@jcr:content/jcr:title
1_property.value=English
p.limit=-1 - Observe the logs either in log file or directly in /system/console/slinglog (Have highlighted the points mentioned in the flow)

 

Thanks for the blog article.Thanks Again. Keep writing.
ReplyDeleteSAP Bods online training