


nagarjunav
nagarjunav
23-09-2019
Hi All,
Please advise if AEM Query builder API supports searching of Content Fragment's (Adobe's Core component) content included within a Page.
I have added a Content Fragment core component on an empty content page (newly created) and authored all the required values for the component including fragmentPath. The component renders as expected and displays the Content Fragment data. However, when I tried searching for the data within content fragment using the following sample queries through Query Builder Debugger, it did not return any results. I am not sure if any new predicates are needed to enable the search functionality for content fragments.
Query Builder query 1:
type=cq:Page
path=<search path>(e.g., /content/we-retail/us/en)
fulltext=<searchterm> (e.g., winter)
Query Builder query 2:
type=cq:Page
path=<search path>(e.g., /content/we-retail/us/en)
fulltext=<searchterm> (e.g., winter)
contentfragment
AEM Version: 6.3.3.0
AEM Core Components Version: 2.5.0
Any advise or guidance would be greatly appreciated. Thank you in advance.
berliant
Employee
berliant
Employee
23-09-2019
You can try a query similar to:
type=nt:unstructure
path=/content/we-retail/us
1_group.1_property=sling:resourceType
1_group.1_property.value=weretail/components/content/contentfragment
fulltext=winter
nagarjunav
nagarjunav
23-09-2019
berliant Thanks for your prompt reply!
However, the provided query does not seem to work (no search results) for the specified scenario (Trying to search content fragment component data included within page).
type=nt:unstructured
path=/content/we-retail/us/en
1_group.1_property=sling:resourceType
1_group.1_property.value=weretail/components/content/contentfragment
fulltext=winter
Please note that the actual content fragment data is not being saved within page node structure as it is only being referenced through the "fragmentPath" property. Also, the core content fragment component has already been proxied under we-retail directory/project - "/apps/weretail/components/content/contentfragment". Let me know if you have any questions.
berliant
Employee
berliant
Employee
23-09-2019
Sorry for a typo in my previous post. Here is the query, that works on my test env and returns a page where a Content Fragment includes a word "winter":
path=/content/we-retail/us
type= cq:Page
group.p.and
group.1_fulltext=winter
group.2_fulltext=contentfragment
nagarjunav
nagarjunav
23-09-2019
berliant Thanks again! But the updated query provided also does not seem to work (no search results yet).
I have authored a test page under "/content/we-retail/us" containing Core Content Fragment component which includes a word "career". Are you using a proxied Core "Content Fragment" component or out of the box (General) "Content Fragment" component?
Please note that the search works appropriately with OOB (General) Content Fragment already. My question is specific to the latest Core Content Fragment Component.
I am currently using AEM 6.3.3.0 with AEM Core Components v2.5.0 installed. Could you please let me know which version of AEM Core components has been installed in your test environment and the AEM version being used.
berliant
Employee
berliant
Employee
23-09-2019
My test was done on the same version.
As you have "contentfragment" in JCR I don't think it matters what component you are extending.
It searches on the keyword and the fact that the page has CF.
nagarjunav
nagarjunav
23-09-2019
berliant Really appreciate your prompt response.
Sorry, I forgot to mention that I have been trying to search for "Structured Content Fragments" created using custom Content Fragment Model. The search had been working appropriately for a simple content fragment but does not seem to work with the structured content fragments.
Find below the structured content fragment included on a test page. The main difference I could see is that the "text" property ( which is created automatically for simple fragments) containing the fragment data/text is not being created within component node as multiple model elements are being referenced in this case under "master" variation. The search may not be working as the text is not attached to the page node and is just being referenced through "fragmentPath" property.
Find below the structured content fragment created with a new Content Fragment Model containing "name", "age", "sport", "about" elements.
Please review and advise if Query builder API supports searching the structured content fragments as well or just the simple content fragments.
berliant
Employee
berliant
Employee
23-09-2019
You need to index your custom properties: "about", "name", "age" etc.
The query that I provided executes the plan:
PLAN: [cq:Page] as [a] /* lucene:cqPageLucene(/oak:index/cqPageLucene) +(+:fulltext:winter +:fulltext:contentfragment) +:ancestors:/content/we-retail/us ft:("winter" "contentfragment") where (contains([a].[*], 'winter')) and (contains([a].[*], 'contentfragment')) and (isdescendantnode([a], [/content/we-retail/us])) */
It means that you need to edit cqPageLucene index by adding a dedicated property. For example, for "about" it should be something like:
Make sure that you re-index /oak:index/cqPageLucene prior of testing the query.
nagarjunav
nagarjunav
24-09-2019
berliant Thanks again for your response.
I have added the "about" property as specified under "cqPageLucene" and also re-indexed the "/oak:index/cqPageLucene" index. However, the debugger does not return any results yet. I have also tried restarting the AEM instance and re-indexing again.
Could you please review and let me know if any additional configurations are needed.
Find below the "Query Explanation" details.
cqPageLucene(/oak:index/cqPageLucene)
Total time: 2 ms
Query execution time: 1 ms
Get nodes time: 1 ms
[cq:Page] as [a] /* lucene:cqPageLucene(/oak:index/cqPageLucene) +(+:fulltext:career +:fulltext:contentfragment) +:ancestors:/content/we-retail/us ft:("career" "contentfragment") where (contains([a].[*], 'career')) and (contains([a].[*], 'contentfragment')) and (isdescendantnode([a], [/content/we-retail/us])) */
Parsing xpath statement: explain /jcr:root/content/we-retail/us//element(*, cq:Page)[(jcr:contains(., 'career') and jcr:contains(., 'contentfragment'))]
XPath > SQL2: explain select [jcr:path], [jcr:score], * from [cq:Page] as a where contains(*, 'career') and contains(*, 'contentfragment') and isdescendantnode(a, '/content/we-retail/us') /* xpath: /jcr:root/content/we-retail/us//element(*, cq:Page)[(jcr:contains(., 'career') and jcr:contains(., 'contentfragment'))] */
Literal used
Attempting optimisation
cost using filter Filter(query=explain select [jcr:path], [jcr:score], * from [cq:Page] as a where contains(*, 'career') and contains(*, 'contentfragment') and isdescendantnode(a, '/content/we-retail/us') /* xpath: /jcr:root/content/we-retail/us//element(*, cq:Page)[(jcr:contains(., 'career') and jcr:contains(., 'contentfragment'))] */ fullText="career" "contentfragment", path=/content/we-retail/us//*)
cost for reference is Infinity
cost for property is Infinity
cost for nodeType is Infinity
Evaluating plan with index definition Lucene Index : /oak:index/slingeventJob
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/versionStoreIndex
Evaluating plan with index definition Lucene Index : /oak:index/cqTagLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/workflowDataLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/socialLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /content/oak:index/enablementResourceName
Evaluating plan with index definition Lucene Index : /oak:index/authorizables
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/ntBaseLucene
Evaluating plan with index definition Lucene Index : /oak:index/lucene-spellcheck
Applicable IndexingRule found IndexRule: nt:base
Evaluating plan with index definition Lucene Index : /oak:index/lucene
Applicable IndexingRule found IndexRule: nt:base
Evaluating plan with index definition Lucene Index : /oak:index/commerceLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/cqProjectLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/cqMobileAppLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/damAssetLucene
No applicable IndexingRule found for any of the superTypes [nt:hierarchyNode, cq:Page, nt:base, mix:created]
Evaluating plan with index definition Lucene Index : /oak:index/cqPageLucene
Applicable IndexingRule found IndexRule: cq:Page
cost for lucene-property[/oak:index/cqPageLucene] is 8608.0
Full-text index without plan: "career" "contentfragment"
cost for aggregate lucene is Infinity
looking for plans for paths : []
cost for solr is Infinity
cost for traverse is Infinity
No alternatives found. Query: select [a].[jcr:path] as [jcr:path], [a].[jcr:score] as [jcr:score], [a].[jcr:primaryType] as [jcr:primaryType], [a].[jcr:createdBy] as [jcr:createdBy], [a].[jcr:created] as [jcr:created] from [cq:Page] as [a] where (contains([a].[*], 'career')) and (contains([a].[*], 'contentfragment')) and (isdescendantnode([a], [/content/we-retail/us]))
berliant
Employee
berliant
Employee
24-09-2019
Can you share a package with your test page?