SlideShare a Scribd company logo
Daniel Seidel – Alkacon Software GmbH
Advanced searching
29.09.2015
2
What can you expect?
Presentation of new
OpenCms features
A tutorial on advanced Solr
features
3
A short history on searching
OpenCms 6.0
● Simple server-side search
● Many uni-lingual indexes
● Many proprietary configuration options
OpenCms 8.5
● Many more features
● Facets
● Highlighting
● Did you mean?
● …
● Multilingual indexes
● Support for client-side searches?
4
Building a search page - Lucene
How to
● Configure your index (one per language)
● Write JSP using CmsSearch as bean
Pros and Cons
Easily produce a search page
Easy query options, incl. simple filter and sort options
Pagination support
Scriptlet code necessary
All server-side code
Index configuration necessary (for each language)
No support for facets etc.
5
Building a search page - Solr
How to
● Write a custom client side search (using GWT)
● Adjust the demo search (may include altering GWT code)
Pros and Cons
Great search experience possible
All Ajax based
Many great features: facets, auto-completion, “Did you mean?”
“unlimited” sorting options
Relies heavily on JavaScript
Very complex to build and adjust
State keeping
Html rendering with JavaScript
Nearly always a per-customer solution
6
Combining the Advantages
Simplicity
since 6.0
Many features
since 8.5
● Stay on the server side (JSP)
● Class like CmsSearch, but
● Expose more Solr features
● Usable without scriptlet code
Design questions
7
What is the value of CmsSearch?
Simple search API tailored for OpenCms
Managing state
Hiding search details
Mapping from request parameters to
search options
Design questions
8
What can we support for Solr?
Simple search API tailored for OpenCms
Managing state
Mapping from request parameters to
search options
Hiding all search details
Design questions
9
How can we ease usage?
Reduce configuration to a minimal
Avoid explicit bean initialization
Allow to add raw Solr query parts
Easy access to results, state, configuration
(no scriptlet code necessary)
● Via search you obtain
● Configuration
● State (current query, checked facet entries, ...)
● Results (search results, facet items, ...)
● Via configFile a special XML content is given
● You drag search form configurations on the page
to render a fully functional search form
● A “feature-complete” default formatter is provided
10
The new tag: <cms:search>
<cms:search var="search"
configFile="${content.filename}"/>
● Live Demo
Drag & Drop your search form
Demo
Demo Demo
Demo
デモ
Search form creation
● Request parameters
● In cases where the default causes collisions
● In cases where additional parameters should be
handled
● General search options
● Core / Index
● Search for empty query?
● Escape query string?
● Query string modifier
● Add additional query parameters
12
What can I configure? (I)
● Special search options
● Pagination
● Sorting
● Facets (field and query facets)
● Highlighting
● Did you mean?
13
What can I configure? (II)
Important
You can, but need not necessarily
configure everything!
I_CmsSearchResultWrapper
I_CmsSearchControllerMain
Single controllers with
configuration and state
Result information
Results list
Facets result
Highlighting result
Page info
...
I_CmsSearchStateParameters
14
Structure of the result object
Configure the UI
elements
(input field names
and current
state/value)
Print results,
facet items,
etc.
Create a suitable link
that contains the
complete state of the
search form
<!-- ... -->
<c:set var="controllers" value="${search.controller}"/>
<!-- ... -->
<c:set var="sort" value="${controllers.sorting}"/>
<!-- ... -->
<select name="${sort.config.sortParam}">
<c:forEach var="option"
items="${sort.config.sortOptions}">
<option value="${option.paramValue}"
${sort.state.checkSelected[option]?"selected":""}>
${option.label}
</option>
</c:forEach>
</select>
<!-- ... -->
15
Rendering example: Sort options
<!-- ... -->
<c:set var="controllers" value="${search.controller}"/>
<!-- ... -->
<c:set var="sort" value="${controllers.sorting}"/>
<!-- ... -->
<select name="${sort.config.sortParam}">
<c:forEach var="option"
items="${sort.config.sortOptions}">
<option value="${option.paramValue}"
${sort.state.checkSelected[option]?"selected":""}>
${option.label}
</option>
</c:forEach>
</select>
<!-- ... -->
16
Rendering example: Sort options
Use abbreviations
<!-- ... -->
<c:set var="controllers" value="${search.controller}"/>
<!-- ... -->
<c:set var="sort" value="${controllers.sorting}"/>
<!-- ... -->
<select name="${sort.config.sortParam}">
<c:forEach var="option"
items="${sort.config.sortOptions}">
<option value="${option.paramValue}"
${sort.state.checkSelected[option]?"selected":""}>
${option.label}
</option>
</c:forEach>
</select>
<!-- ... -->
17
Rendering example: Sort options
Use the configuration
<!-- ... -->
<c:set var="controllers" value="${search.controller}"/>
<!-- ... -->
<c:set var="sort" value="${controllers.sorting}"/>
<!-- ... -->
<select name="${sort.config.sortParam}">
<c:forEach var="option"
items="${sort.config.sortOptions}">
<option value="${option.paramValue}"
${sort.state.checkSelected[option]?"selected":""}>
${option.label}
</option>
</c:forEach>
</select>
<!-- ... -->
18
Rendering example: Sort options
Use the state
<!-- ... -->
<c:forEach var="searchResult" items="${search.searchResults}">
<a href='<cms:link>${searchResult.fields["path"]}</cms:link>'>
${searchResult.fields["Title_prop"]}
</a>
<p>
${cms:trimToSize(
fn:escapeXml(searchResult.fields["content_en"])
,250)}
</p>
<hr />
</c:forEach>
<!-- ... -->
19
Rendering example: Results
<!-- ... -->
<c:forEach var="searchResult" items="${search.searchResults}">
<a href='<cms:link>${searchResult.fields["path"]}</cms:link>'>
${searchResult.fields["Title_prop"]}
</a>
<p>
${cms:trimToSize(
fn:escapeXml(searchResult.fields["content_en"])
,250)}
</p>
<hr />
</c:forEach>
<!-- ... -->
20
Rendering example: Results
Loop over the result collection
(get I_CmsSearchResourceBean objects)
<!-- ... -->
<c:forEach var="searchResult" items="${search.searchResults}">
<a href='<cms:link>${searchResult.fields["path"]}</cms:link>'>
${searchResult.fields["Title_prop"]}
</a>
<p>
${cms:trimToSize(
fn:escapeXml(searchResult.fields["content_en"])
,250)}
</p>
<hr />
</c:forEach>
<!-- ... -->
21
Rendering example: Results
Access index fields
<!-- ... -->
<c:set var="fControllers"
value="${controllers.fieldFacets}"/>
<c:forEach var="facet" items="${search.fieldFacets}">
<c:set var="facetController"
value="${fControllers.fieldFacetController[facet.name]}"/>
<c:if test="${cms:getListSize(facet.values) > 0}">
<!-- Render facet – see next slide -->
</c:if>
</c:forEach>
<!-- ... -->
22
Rendering example: Facets (I)
<!-- ... -->
<c:set var="fControllers"
value="${controllers.fieldFacets}"/>
<c:forEach var="facet" items="${search.fieldFacets}">
<c:set var="facetController"
value="${fControllers.fieldFacetController[facet.name]}"/>
<c:if test="${cms:getListSize(facet.values) > 0}">
<!-- Render facet – see next slide -->
</c:if>
</c:forEach>
<!-- ... -->
23
Rendering example: Facets (I)
Loop over facets from the
search result
<!-- ... -->
<c:set var="fControllers"
value="${controllers.fieldFacets}"/>
<c:forEach var="facet" items="${search.fieldFacets}">
<c:set var="facetController"
value="${fControllers.fieldFacetController[facet.name]}"/>
<c:if test="${cms:getListSize(facet.values) > 0}">
<!-- Render facet – see next slide -->
</c:if>
</c:forEach>
<!-- ... -->
24
Rendering example: Facets (I)
Get the facet’s controller
<!-- ... -->
<c:set var="fControllers"
value="${controllers.fieldFacets}"/>
<c:forEach var="facet" items="${search.fieldFacets}">
<c:set var="facetController"
value="${fControllers.fieldFacetController[facet.name]}"/>
<c:if test="${cms:getListSize(facet.values) > 0}">
<!-- Render facet – see next slide -->
</c:if>
</c:forEach>
<!-- ... -->
25
Rendering example: Facets (I)
Render the facet if necessary
(see next slide)
<!-- ... -->
<div>${facetController.config.label}</div>
<c:forEach var="facetItem" items="${facet.values}">
<div class="checkbox">
<label>
<input type="checkbox"
name="${facetController.config.paramKey}"
value="${facetItem.name}"
${facetController.state.isChecked[facetItem.name]
?"checked":""} />
${facetItem.name} (${facetItem.count})
</label>
</div>
</c:forEach>
<!-- ... -->
26
Rendering example: Facets (II)
<!-- ... -->
<div>${facetController.config.label}</div>
<c:forEach var="facetItem" items="${facet.values}">
<div class="checkbox">
<label>
<input type="checkbox"
name="${facetController.config.paramKey}"
value="${facetItem.name}"
${facetController.state.isChecked[facetItem.name]
?"checked":""} />
${facetItem.name} (${facetItem.count})
</label>
</div>
</c:forEach>
<!-- ... -->
27
Rendering example: Facets (II)
Use the configuration
<!-- ... -->
<div>${facetController.config.label}</div>
<c:forEach var="facetItem" items="${facet.values}">
<div class="checkbox">
<label>
<input type="checkbox"
name="${facetController.config.paramKey}"
value="${facetItem.name}"
${facetController.state.isChecked[facetItem.name]
?"checked":""} />
${facetItem.name} (${facetItem.count})
</label>
</div>
</c:forEach>
<!-- ... -->
28
Rendering example: Facets (II)
Use the result
<!-- ... -->
<div>${facetController.config.label}</div>
<c:forEach var="facetItem" items="${facet.values}">
<div class="checkbox">
<label>
<input type="checkbox"
name="${facetController.config.paramKey}"
value="${facetItem.name}"
${facetController.state.isChecked[facetItem.name]
?"checked":""} />
${facetItem.name} (${facetItem.count})
</label>
</div>
</c:forEach>
<!-- ... -->
29
Rendering example: Facets (II)
Use the state
<c:set var="pagination" value="${controllers.pagination}"/>
<c:forEach var="i" begin="${search.pageNavFirst}"
end="${search.pageNavLast}">
<c:set var="is">${i}</c:set>
<li ${pagination.state.currentPage eq i ? "class='active'" : ""}>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[is]}
</cms:link>">${is}</a>
</li>
</c:forEach>
<li>
<c:set var="pages">${search.numPages}</c:set>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[pages]}
</cms:link>">Last</a>
</li>
30
Rendering example: Pagination
<c:set var="pagination" value="${controllers.pagination}"/>
<c:forEach var="i" begin="${search.pageNavFirst}"
end="${search.pageNavLast}">
<c:set var="is">${i}</c:set>
<li ${pagination.state.currentPage eq i ? "class='active'" : ""}>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[is]}
</cms:link>">${is}</a>
</li>
</c:forEach>
<li>
<c:set var="pages">${search.numPages}</c:set>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[pages]}
</cms:link>">Last</a>
</li>
31
Rendering example: Pagination
Use pagination support
<c:set var="pagination" value="${controllers.pagination}"/>
<c:forEach var="i" begin="${search.pageNavFirst}"
end="${search.pageNavLast}">
<c:set var="is">${i}</c:set>
<li ${pagination.state.currentPage eq i ? "class='active'" : ""}>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[is]}
</cms:link>">${is}</a>
</li>
</c:forEach>
<li>
<c:set var="pages">${search.numPages}</c:set>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[pages]}
</cms:link>">Last</a>
</li>
32
Rendering example: Pagination
Use current state
<c:set var="pagination" value="${controllers.pagination}"/>
<c:forEach var="i" begin="${search.pageNavFirst}"
end="${search.pageNavLast}">
<c:set var="is">${i}</c:set>
<li ${pagination.state.currentPage eq i ? "class='active'" : ""}>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[is]}
</cms:link>">${is}</a>
</li>
</c:forEach>
<li>
<c:set var="pages">${search.numPages}</c:set>
<a href="<cms:link>${cms.requestContext.uri}
?${search.stateParameters.setPage[pages]}
</cms:link>">Last</a>
</li>
33
Rendering example: Pagination
Use state parameters
● Two options to send the current state:
● Submit a form
● Use state parameters
● With state parameters
● Everything is manipulated explicitly
● You do not need a form at all
● With a form
● You must make sure to send all the state you want
(use hidden parameters, e.g., for the last query)
● You can intentionally prevent state transmission
(e.g., for the current page)
34
Form vs. state parameters
● We did
● Introduce the tag <cms:search>
● See its configuration via an XML content
● Explore how to write a formatter for a search form
● If you need more information on formatting
● Explore the default formatter
● Explore the classes under
org.opencms.jsp.search.result
● We did not
● Cover all configuration options
● See all use cases for <cms:search>
35
Short summary
● Intention
● Show blogs, news, ...
● Link to detail pages
● Realization
● <cms:contentload>
● Manifold collectors
● Question
● Where’s the
difference between
lists and a search
result page?
36
Lists in OpenCms
● Intention
● Show blogs, news, ...
● Link to detail pages
● Realization
● <cms:contentload>
● Manifold collectors
● Question
● Where’s the
difference between
lists and a search
result page?
37
Lists in OpenCms
Essentially, there is no
difference!
38
A short history of lists
● Simple way to render lists
● Many specific collectors
● Facility to edit list entries directly
OpenCms 6.0 <cms:contentload> is introduced
OpenCms 8.5
● Collecting “byQuery” or “byContext”
● First contact of Search and Lists
● No facets etc. supported
CmsSolrCollector is added
OpenCms 10 <cms:search> and <cms:edit> are introduced
● Lists and search become one
● Facets etc. available for lists
● Editing becomes decoupled from lists
?
● What is specific for a list?
● XML content for configuration is unsuitable
● There is no query string provided by the user
● Usually there is no form
● XML contents, not the index is accessed
● How does <cms:search> handle the pecularities
● Configuration via JSON (String or file)
● An option to ignore the query parameter
● The already seen state parameters
(no form is necessary)
● I_CmsSearchResourceBean allows to access XML
contents via the CmsJspContentAccessBean
39
Lists with <cms:search>
● Live Demo
Watch out for the Solr features
Demo
Demo Demo
Demo
デモ
A list with <cms:search>
<c:set var="searchConfig">
{ "ignorequery" : true,
"extrasolrparams" :
"fq=type:u-blog&fq=parent-folders:
"/sites/default/.content/blogentries/"",
"pagesize" : ${content.value.pageSize},
"pagenavlength" : ${cms.element.settings["navlength"]}
<!-- Facet and sort option configuration -->
}
</c:set>
<cms:search configString="${searchConfig}" var="search"/>
<!-- ... -->
41
The JSON configuration for a list
<c:set var="searchConfig">
{ "ignorequery" : true,
"extrasolrparams" :
"fq=type:u-blog&fq=parent-folders:
"/sites/default/.content/blogentries/"",
"pagesize" : ${content.value.pageSize},
"pagenavlength" : ${cms.element.settings["navlength"]}
<!-- Facet and sort option configuration -->
}
</c:set>
<cms:search configString="${searchConfig}" var="search"/>
<!-- ... -->
42
The JSON configuration for a list
Most important options
<c:set var="searchConfig">
{ "ignorequery" : true,
"extrasolrparams" :
"fq=type:u-blog&fq=parent-folders:
"/sites/default/.content/blogentries/"",
"pagesize" : ${content.value.pageSize},
"pagenavlength" : ${cms.element.settings["navlength"]}
<!-- Facet and sort option configuration -->
}
</c:set>
<cms:search configString="${searchConfig}" var="search"/>
<!-- ... -->
43
The JSON configuration for a list
Optional extra features
<c:set var="searchConfig">
{ "ignorequery" : true,
"extrasolrparams" :
"fq=type:u-blog&fq=parent-folders:
"/sites/default/.content/blogentries/"",
"pagesize" : ${content.value.pageSize},
"pagenavlength" : ${cms.element.settings["navlength"]}
<!-- Facet and sort option configuration -->
}
</c:set>
<cms:search configString="${searchConfig}" var="search"/>
<!-- ... -->
44
The JSON configuration for a list
The content adjusts the configuration
<c:choose>
<c:when test="${search.numFound > 0}">
<c:forEach var="result" items="${search.searchResults}">
<c:set var="content" value="${result.xmlContent}"/>
<!-- render entry as usual -->
</c:forEach>
</c:when>
<c:otherwise>
No results found.
</c:otherwise>
</c:choose>
45
Rendering the list entries
Easier than before
Getting results and iterating over
them is separated
No nested <cms:contentload>
anymore
● <cms:contentload> supported
● Editing, adding or deleting list entries
● Adding entries to an empty list
● Can we provide the same feature?
● No, because iteration is separated from <cms:search>
● Do we need the same feature?
● No, there’s no reason why edit options and content
loading has to be coupled
● Can we get similar edit options differently?
● Yes, a special <cms:edit> tag
46
Editing list entries
● Places edit points wherever you like
● Allows to edit or delete existing XML contents
● Allows to add new contents
● Highlights the enclosed HTML when hovering
over the edit point
● New contents can be placed
● At the place configured in the sitemap configuration
● In a provided folder
● Where the content that is edited is located
47
The tag <cms:edit>
<c:choose>
<c:when test="${search.numFound > 0}">
<c:forEach var="result" items="${search.searchResults}">
<c:set var="content" value="${result.xmlContent}"/>
<cms:edit uuid='${result.fields["id"]}'
create="true" delete="true">
<!-- render entry as usual -->
</cms:edit>
</c:forEach>
</c:when>
<c:otherwise>
<cms:edit createType="u-blog">
<div>No results found.</div>
</cms:edit>
</c:otherwise>
</c:choose>
48
Edit options for the list
Easier than before
Harmonized usage for empty
and non-empty list
● How about the “Publish this page” option?
● <cms:contentload> with attribute “editable”
causes list entries to be related to the page
● Do we have a similar mechanism?
● Using <cms:edit> the edited content becomes
related to the page
● But does this suffice?
● Not if we use pagination.
● So can we do better?
● Yes: <cms:search ... addContentInfo="true">
● All list entries become related to the page
49
Do we still miss a feature?
50
What should you remember?
Server-sided Solr search becomes easy
Search pages and lists become the same
Edit point needed: Use <cms:edit>
By, by <cms:contentload> and friends
● Containers in lists
● Container tag takes the element(s)
<cms:container ... elements="${uuid}"/>
● Rendering is done by a suitable formatter
51
What’s next? (Maybe)
Easily render contents of different types
Inline editing will work out of the box
Harmonized rendering of XML contents
● Containers in lists
● Container tag takes the element(s)
<cms:container ... elements="${uuid}"/>
● Rendering is done by a suitable formatter
52
What’s next? (Maybe)
Easily render contents of different types
Inline editing will work out of the box
Harmonized rendering of XML contents
53
Last comments
Solr updated to version 5.1
(further updates follow)
Gallery index replaced by “Solr offline”
(watch out for bugs)
This is OpenCms 10 Alpha 1
(don’t expect everything in the final state)
Daniel Seidel
Alkacon Software GmbH
http://www.alkacon.com
http://www.opencms.org
Thank you very much for your attention!

More Related Content

What's hot

The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORM
Yaroslav Muravskyi
 
JDBC - JPA - Spring Data
JDBC - JPA - Spring DataJDBC - JPA - Spring Data
JDBC - JPA - Spring Data
Arturs Drozdovs
 
MongoDB World 2019: The Sights (and Smells) of a Bad Query
MongoDB World 2019: The Sights (and Smells) of a Bad QueryMongoDB World 2019: The Sights (and Smells) of a Bad Query
MongoDB World 2019: The Sights (and Smells) of a Bad Query
MongoDB
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
Emprovise
 
Indexing and Performance Tuning
Indexing and Performance TuningIndexing and Performance Tuning
Indexing and Performance Tuning
MongoDB
 
Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )
Sandip Basnet
 
How and why to upgrade to java 16 or 17
How and why to upgrade to java 16 or 17How and why to upgrade to java 16 or 17
How and why to upgrade to java 16 or 17
Johan Janssen
 
Ajax presentation
Ajax presentationAjax presentation
Ajax presentation
engcs2008
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
Jeevesh Pandey
 
Appium Interview Questions and Answers | Edureka
Appium Interview Questions and Answers | EdurekaAppium Interview Questions and Answers | Edureka
Appium Interview Questions and Answers | Edureka
Edureka!
 
Desenvolvimento IOS - Mobile
Desenvolvimento IOS - MobileDesenvolvimento IOS - Mobile
Desenvolvimento IOS - Mobile
Wanderlei Silva do Carmo
 
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Lucidworks
 
Web api
Web apiWeb api
ASP .net MVC
ASP .net MVCASP .net MVC
ASP .net MVC
Divya Sharma
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
Sébastien Prunier
 
Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21
Stamatis Zampetakis
 
Domain driven design and model driven development
Domain driven design and model driven developmentDomain driven design and model driven development
Domain driven design and model driven development
Dmitry Geyzersky
 
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Julian Hyde
 
Flux architecture
Flux architectureFlux architecture
Flux architecture
Boyan Mihaylov
 
MongoDB
MongoDBMongoDB
MongoDB
wiTTyMinds1
 

What's hot (20)

The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORM
 
JDBC - JPA - Spring Data
JDBC - JPA - Spring DataJDBC - JPA - Spring Data
JDBC - JPA - Spring Data
 
MongoDB World 2019: The Sights (and Smells) of a Bad Query
MongoDB World 2019: The Sights (and Smells) of a Bad QueryMongoDB World 2019: The Sights (and Smells) of a Bad Query
MongoDB World 2019: The Sights (and Smells) of a Bad Query
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Indexing and Performance Tuning
Indexing and Performance TuningIndexing and Performance Tuning
Indexing and Performance Tuning
 
Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )
 
How and why to upgrade to java 16 or 17
How and why to upgrade to java 16 or 17How and why to upgrade to java 16 or 17
How and why to upgrade to java 16 or 17
 
Ajax presentation
Ajax presentationAjax presentation
Ajax presentation
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Appium Interview Questions and Answers | Edureka
Appium Interview Questions and Answers | EdurekaAppium Interview Questions and Answers | Edureka
Appium Interview Questions and Answers | Edureka
 
Desenvolvimento IOS - Mobile
Desenvolvimento IOS - MobileDesenvolvimento IOS - Mobile
Desenvolvimento IOS - Mobile
 
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
 
Web api
Web apiWeb api
Web api
 
ASP .net MVC
ASP .net MVCASP .net MVC
ASP .net MVC
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21
 
Domain driven design and model driven development
Domain driven design and model driven developmentDomain driven design and model driven development
Domain driven design and model driven development
 
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
 
Flux architecture
Flux architectureFlux architecture
Flux architecture
 
MongoDB
MongoDBMongoDB
MongoDB
 

Viewers also liked

OpenCms Days 2015 OCEE explained
OpenCms Days 2015 OCEE explainedOpenCms Days 2015 OCEE explained
OpenCms Days 2015 OCEE explained
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and JenkinsOpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and Jenkins
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2016: OpenCms at the swiss seismological service
OpenCms Days 2016: OpenCms at the swiss seismological serviceOpenCms Days 2016: OpenCms at the swiss seismological service
OpenCms Days 2016: OpenCms at the swiss seismological service
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2016: Participation and transparency portals with OpenCms
OpenCms Days 2016: Participation and transparency portals with OpenCmsOpenCms Days 2016: Participation and transparency portals with OpenCms
OpenCms Days 2016: Participation and transparency portals with OpenCms
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 OpenCms X marks the spot
OpenCms Days 2015 OpenCms X marks the spotOpenCms Days 2015 OpenCms X marks the spot
OpenCms Days 2015 OpenCms X marks the spot
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 Creating Apps for the OpenCms 10 workplace
OpenCms Days 2015  Creating Apps for the OpenCms 10 workplace OpenCms Days 2015  Creating Apps for the OpenCms 10 workplace
OpenCms Days 2015 Creating Apps for the OpenCms 10 workplace
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 Next generation repository
OpenCms Days 2015  Next generation repositoryOpenCms Days 2015  Next generation repository
OpenCms Days 2015 Next generation repository
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 Modern templates with nested containers
OpenCms Days 2015 Modern templates with nested containersOpenCms Days 2015 Modern templates with nested containers
OpenCms Days 2015 Modern templates with nested containers
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2016: Keynote - Introducing OpenCms 10.5
OpenCms Days 2016:   Keynote - Introducing OpenCms 10.5OpenCms Days 2016:   Keynote - Introducing OpenCms 10.5
OpenCms Days 2016: Keynote - Introducing OpenCms 10.5
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2016: Multilingual websites with OpenCms
OpenCms Days 2016:   Multilingual websites with OpenCmsOpenCms Days 2016:   Multilingual websites with OpenCms
OpenCms Days 2016: Multilingual websites with OpenCms
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2016: Next generation content repository
OpenCms Days 2016: Next generation content repository OpenCms Days 2016: Next generation content repository
OpenCms Days 2016: Next generation content repository
Alkacon Software GmbH & Co. KG
 

Viewers also liked (11)

OpenCms Days 2015 OCEE explained
OpenCms Days 2015 OCEE explainedOpenCms Days 2015 OCEE explained
OpenCms Days 2015 OCEE explained
 
OpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and JenkinsOpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and Jenkins
 
OpenCms Days 2016: OpenCms at the swiss seismological service
OpenCms Days 2016: OpenCms at the swiss seismological serviceOpenCms Days 2016: OpenCms at the swiss seismological service
OpenCms Days 2016: OpenCms at the swiss seismological service
 
OpenCms Days 2016: Participation and transparency portals with OpenCms
OpenCms Days 2016: Participation and transparency portals with OpenCmsOpenCms Days 2016: Participation and transparency portals with OpenCms
OpenCms Days 2016: Participation and transparency portals with OpenCms
 
OpenCms Days 2015 OpenCms X marks the spot
OpenCms Days 2015 OpenCms X marks the spotOpenCms Days 2015 OpenCms X marks the spot
OpenCms Days 2015 OpenCms X marks the spot
 
OpenCms Days 2015 Creating Apps for the OpenCms 10 workplace
OpenCms Days 2015  Creating Apps for the OpenCms 10 workplace OpenCms Days 2015  Creating Apps for the OpenCms 10 workplace
OpenCms Days 2015 Creating Apps for the OpenCms 10 workplace
 
OpenCms Days 2015 Next generation repository
OpenCms Days 2015  Next generation repositoryOpenCms Days 2015  Next generation repository
OpenCms Days 2015 Next generation repository
 
OpenCms Days 2015 Modern templates with nested containers
OpenCms Days 2015 Modern templates with nested containersOpenCms Days 2015 Modern templates with nested containers
OpenCms Days 2015 Modern templates with nested containers
 
OpenCms Days 2016: Keynote - Introducing OpenCms 10.5
OpenCms Days 2016:   Keynote - Introducing OpenCms 10.5OpenCms Days 2016:   Keynote - Introducing OpenCms 10.5
OpenCms Days 2016: Keynote - Introducing OpenCms 10.5
 
OpenCms Days 2016: Multilingual websites with OpenCms
OpenCms Days 2016:   Multilingual websites with OpenCmsOpenCms Days 2016:   Multilingual websites with OpenCms
OpenCms Days 2016: Multilingual websites with OpenCms
 
OpenCms Days 2016: Next generation content repository
OpenCms Days 2016: Next generation content repository OpenCms Days 2016: Next generation content repository
OpenCms Days 2016: Next generation content repository
 

Similar to OpenCms Days 2015 Advanced Solr Searching

Using Search API, Search API Solr and Facets in Drupal 8
Using Search API, Search API Solr and Facets in Drupal 8Using Search API, Search API Solr and Facets in Drupal 8
Using Search API, Search API Solr and Facets in Drupal 8
Websolutions Agency
 
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
 Harness SharePoint and jQuery to Make Dynamic Displays and Applications Harness SharePoint and jQuery to Make Dynamic Displays and Applications
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
InnoTech
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsMark Rackley
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_HourMVC & SQL_In_1_Hour
MVC & SQL_In_1_HourDilip Patel
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery Essentials
Mark Rackley
 
How to generate customized java 8 code from your database
How to generate customized java 8 code from your databaseHow to generate customized java 8 code from your database
How to generate customized java 8 code from your database
Speedment, Inc.
 
Silicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your databaseSilicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your database
Speedment, Inc.
 
Develop an App with the Odoo Framework
Develop an App with the Odoo FrameworkDevelop an App with the Odoo Framework
Develop an App with the Odoo Framework
Odoo
 
Drupal 8. Search API. Facets. Customize / combine facets
Drupal 8. Search API. Facets. Customize / combine facetsDrupal 8. Search API. Facets. Customize / combine facets
Drupal 8. Search API. Facets. Customize / combine facets
AnyforSoft
 
Google
GoogleGoogle
Googlesoon
 
Becoming "Facet"-nated with Search API
Becoming "Facet"-nated with Search APIBecoming "Facet"-nated with Search API
Becoming "Facet"-nated with Search API
cgmonroe
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Leveraging SharePoint 2013 Search and CSR
Leveraging SharePoint 2013 Search and CSRLeveraging SharePoint 2013 Search and CSR
Leveraging SharePoint 2013 Search and CSR
Sparkhound Inc.
 
The SharePoint & jQuery Guide
The SharePoint & jQuery GuideThe SharePoint & jQuery Guide
The SharePoint & jQuery Guide
Mark Rackley
 
The SharePoint and jQuery Guide by Mark Rackley - SPTechCon
The SharePoint and jQuery Guide by Mark Rackley - SPTechConThe SharePoint and jQuery Guide by Mark Rackley - SPTechCon
The SharePoint and jQuery Guide by Mark Rackley - SPTechCon
SPTechCon
 
Agile data presentation 3 - cambridge
Agile data   presentation 3 - cambridgeAgile data   presentation 3 - cambridge
Agile data presentation 3 - cambridge
Romans Malinovskis
 
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.jsDrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
Vladimir Roudakov
 

Similar to OpenCms Days 2015 Advanced Solr Searching (20)

Using Search API, Search API Solr and Facets in Drupal 8
Using Search API, Search API Solr and Facets in Drupal 8Using Search API, Search API Solr and Facets in Drupal 8
Using Search API, Search API Solr and Facets in Drupal 8
 
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
 Harness SharePoint and jQuery to Make Dynamic Displays and Applications Harness SharePoint and jQuery to Make Dynamic Displays and Applications
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentials
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_HourMVC & SQL_In_1_Hour
MVC & SQL_In_1_Hour
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
IGears: Template Architecture and Principles
IGears: Template Architecture and PrinciplesIGears: Template Architecture and Principles
IGears: Template Architecture and Principles
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery Essentials
 
How to generate customized java 8 code from your database
How to generate customized java 8 code from your databaseHow to generate customized java 8 code from your database
How to generate customized java 8 code from your database
 
Silicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your databaseSilicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your database
 
Develop an App with the Odoo Framework
Develop an App with the Odoo FrameworkDevelop an App with the Odoo Framework
Develop an App with the Odoo Framework
 
Drupal 8. Search API. Facets. Customize / combine facets
Drupal 8. Search API. Facets. Customize / combine facetsDrupal 8. Search API. Facets. Customize / combine facets
Drupal 8. Search API. Facets. Customize / combine facets
 
Google
GoogleGoogle
Google
 
Becoming "Facet"-nated with Search API
Becoming "Facet"-nated with Search APIBecoming "Facet"-nated with Search API
Becoming "Facet"-nated with Search API
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Leveraging SharePoint 2013 Search and CSR
Leveraging SharePoint 2013 Search and CSRLeveraging SharePoint 2013 Search and CSR
Leveraging SharePoint 2013 Search and CSR
 
Jsf2.0 -4
Jsf2.0 -4Jsf2.0 -4
Jsf2.0 -4
 
The SharePoint & jQuery Guide
The SharePoint & jQuery GuideThe SharePoint & jQuery Guide
The SharePoint & jQuery Guide
 
The SharePoint and jQuery Guide by Mark Rackley - SPTechCon
The SharePoint and jQuery Guide by Mark Rackley - SPTechConThe SharePoint and jQuery Guide by Mark Rackley - SPTechCon
The SharePoint and jQuery Guide by Mark Rackley - SPTechCon
 
Agile data presentation 3 - cambridge
Agile data   presentation 3 - cambridgeAgile data   presentation 3 - cambridge
Agile data presentation 3 - cambridge
 
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.jsDrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
DrupalCon Dublin 2016 - Automated browser testing with Nightwatch.js
 

More from Alkacon Software GmbH & Co. KG

OpenCms Days 2015 OpenGovernment
OpenCms Days 2015 OpenGovernmentOpenCms Days 2015 OpenGovernment
OpenCms Days 2015 OpenGovernment
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 OpenCms at erarta
OpenCms Days 2015 OpenCms at erarta OpenCms Days 2015 OpenCms at erarta
OpenCms Days 2015 OpenCms at erarta
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 How do you develop for OpenCms?
OpenCms Days 2015 How do you develop for OpenCms?OpenCms Days 2015 How do you develop for OpenCms?
OpenCms Days 2015 How do you develop for OpenCms?
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2015 Arkema, a leading chemicals company
OpenCms Days 2015 Arkema, a leading chemicals companyOpenCms Days 2015 Arkema, a leading chemicals company
OpenCms Days 2015 Arkema, a leading chemicals company
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - How Techem handles international customer portals
OpenCms Days 2014 - How Techem handles international customer portalsOpenCms Days 2014 - How Techem handles international customer portals
OpenCms Days 2014 - How Techem handles international customer portals
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and GruntOpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - OpenCms cloud setup with the FI-TS
OpenCms Days 2014 - OpenCms cloud setup with the FI-TSOpenCms Days 2014 - OpenCms cloud setup with the FI-TS
OpenCms Days 2014 - OpenCms cloud setup with the FI-TS
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - OpenCms 9 - A video tube?
OpenCms Days 2014 - OpenCms 9 - A video tube?OpenCms Days 2014 - OpenCms 9 - A video tube?
OpenCms Days 2014 - OpenCms 9 - A video tube?
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - User Generated Content in OpenCms 9.5
OpenCms Days 2014 - User Generated Content in OpenCms 9.5OpenCms Days 2014 - User Generated Content in OpenCms 9.5
OpenCms Days 2014 - User Generated Content in OpenCms 9.5
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Updating to OpenCms 9.5
OpenCms Days 2014 - Updating to OpenCms 9.5OpenCms Days 2014 - Updating to OpenCms 9.5
OpenCms Days 2014 - Updating to OpenCms 9.5
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Using the SOLR collector
OpenCms Days 2014 - Using the SOLR collectorOpenCms Days 2014 - Using the SOLR collector
OpenCms Days 2014 - Using the SOLR collector
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Responsive bootstrap templates reloaded
OpenCms Days 2014 - Responsive bootstrap templates reloadedOpenCms Days 2014 - Responsive bootstrap templates reloaded
OpenCms Days 2014 - Responsive bootstrap templates reloaded
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Nested containers in action
OpenCms Days 2014 - Nested containers in actionOpenCms Days 2014 - Nested containers in action
OpenCms Days 2014 - Nested containers in action
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentationOpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
Alkacon Software GmbH & Co. KG
 
OpenCms Days 2014 - OpenCms content editor and pdf extensions
OpenCms Days 2014 - OpenCms content editor and pdf extensionsOpenCms Days 2014 - OpenCms content editor and pdf extensions
OpenCms Days 2014 - OpenCms content editor and pdf extensions
Alkacon Software GmbH & Co. KG
 

More from Alkacon Software GmbH & Co. KG (18)

OpenCms Days 2015 OpenGovernment
OpenCms Days 2015 OpenGovernmentOpenCms Days 2015 OpenGovernment
OpenCms Days 2015 OpenGovernment
 
OpenCms Days 2015 OpenCms at erarta
OpenCms Days 2015 OpenCms at erarta OpenCms Days 2015 OpenCms at erarta
OpenCms Days 2015 OpenCms at erarta
 
OpenCms Days 2015 How do you develop for OpenCms?
OpenCms Days 2015 How do you develop for OpenCms?OpenCms Days 2015 How do you develop for OpenCms?
OpenCms Days 2015 How do you develop for OpenCms?
 
OpenCms Days 2015 Arkema, a leading chemicals company
OpenCms Days 2015 Arkema, a leading chemicals companyOpenCms Days 2015 Arkema, a leading chemicals company
OpenCms Days 2015 Arkema, a leading chemicals company
 
OpenCms Days 2014 - How Techem handles international customer portals
OpenCms Days 2014 - How Techem handles international customer portalsOpenCms Days 2014 - How Techem handles international customer portals
OpenCms Days 2014 - How Techem handles international customer portals
 
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and GruntOpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
OpenCms Days 2014 - Enhancing OpenCms front end development with Sass and Grunt
 
OpenCms Days 2014 - OpenCms cloud setup with the FI-TS
OpenCms Days 2014 - OpenCms cloud setup with the FI-TSOpenCms Days 2014 - OpenCms cloud setup with the FI-TS
OpenCms Days 2014 - OpenCms cloud setup with the FI-TS
 
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
OpenCms Days 2014 - OpenCms Module Development and Deployment with IntelliJ, ...
 
OpenCms Days 2014 - OpenCms 9 - A video tube?
OpenCms Days 2014 - OpenCms 9 - A video tube?OpenCms Days 2014 - OpenCms 9 - A video tube?
OpenCms Days 2014 - OpenCms 9 - A video tube?
 
OpenCms Days 2014 - User Generated Content in OpenCms 9.5
OpenCms Days 2014 - User Generated Content in OpenCms 9.5OpenCms Days 2014 - User Generated Content in OpenCms 9.5
OpenCms Days 2014 - User Generated Content in OpenCms 9.5
 
OpenCms Days 2014 - Updating to OpenCms 9.5
OpenCms Days 2014 - Updating to OpenCms 9.5OpenCms Days 2014 - Updating to OpenCms 9.5
OpenCms Days 2014 - Updating to OpenCms 9.5
 
OpenCms Days 2014 - Using the SOLR collector
OpenCms Days 2014 - Using the SOLR collectorOpenCms Days 2014 - Using the SOLR collector
OpenCms Days 2014 - Using the SOLR collector
 
OpenCms Days 2014 - Responsive bootstrap templates reloaded
OpenCms Days 2014 - Responsive bootstrap templates reloadedOpenCms Days 2014 - Responsive bootstrap templates reloaded
OpenCms Days 2014 - Responsive bootstrap templates reloaded
 
OpenCms Days 2014 - Nested containers in action
OpenCms Days 2014 - Nested containers in actionOpenCms Days 2014 - Nested containers in action
OpenCms Days 2014 - Nested containers in action
 
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
OpenCms Days 2014 Keynote - Step up to OpenCms 9.5
 
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentationOpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
OpenCms Days 2014 - Introducing the 9.5 OpenCms documentation
 
OpenCms Days 2014 - OpenCms content editor and pdf extensions
OpenCms Days 2014 - OpenCms content editor and pdf extensionsOpenCms Days 2014 - OpenCms content editor and pdf extensions
OpenCms Days 2014 - OpenCms content editor and pdf extensions
 
Open cms days 2013 - all dressed up_release
Open cms days 2013 - all dressed up_releaseOpen cms days 2013 - all dressed up_release
Open cms days 2013 - all dressed up_release
 

Recently uploaded

GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
vrstrong314
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
Globus
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 

Recently uploaded (20)

GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 

OpenCms Days 2015 Advanced Solr Searching

  • 1. Daniel Seidel – Alkacon Software GmbH Advanced searching 29.09.2015
  • 2. 2 What can you expect? Presentation of new OpenCms features A tutorial on advanced Solr features
  • 3. 3 A short history on searching OpenCms 6.0 ● Simple server-side search ● Many uni-lingual indexes ● Many proprietary configuration options OpenCms 8.5 ● Many more features ● Facets ● Highlighting ● Did you mean? ● … ● Multilingual indexes ● Support for client-side searches?
  • 4. 4 Building a search page - Lucene How to ● Configure your index (one per language) ● Write JSP using CmsSearch as bean Pros and Cons Easily produce a search page Easy query options, incl. simple filter and sort options Pagination support Scriptlet code necessary All server-side code Index configuration necessary (for each language) No support for facets etc.
  • 5. 5 Building a search page - Solr How to ● Write a custom client side search (using GWT) ● Adjust the demo search (may include altering GWT code) Pros and Cons Great search experience possible All Ajax based Many great features: facets, auto-completion, “Did you mean?” “unlimited” sorting options Relies heavily on JavaScript Very complex to build and adjust State keeping Html rendering with JavaScript Nearly always a per-customer solution
  • 6. 6 Combining the Advantages Simplicity since 6.0 Many features since 8.5 ● Stay on the server side (JSP) ● Class like CmsSearch, but ● Expose more Solr features ● Usable without scriptlet code
  • 7. Design questions 7 What is the value of CmsSearch? Simple search API tailored for OpenCms Managing state Hiding search details Mapping from request parameters to search options
  • 8. Design questions 8 What can we support for Solr? Simple search API tailored for OpenCms Managing state Mapping from request parameters to search options Hiding all search details
  • 9. Design questions 9 How can we ease usage? Reduce configuration to a minimal Avoid explicit bean initialization Allow to add raw Solr query parts Easy access to results, state, configuration (no scriptlet code necessary)
  • 10. ● Via search you obtain ● Configuration ● State (current query, checked facet entries, ...) ● Results (search results, facet items, ...) ● Via configFile a special XML content is given ● You drag search form configurations on the page to render a fully functional search form ● A “feature-complete” default formatter is provided 10 The new tag: <cms:search> <cms:search var="search" configFile="${content.filename}"/>
  • 11. ● Live Demo Drag & Drop your search form Demo Demo Demo Demo デモ Search form creation
  • 12. ● Request parameters ● In cases where the default causes collisions ● In cases where additional parameters should be handled ● General search options ● Core / Index ● Search for empty query? ● Escape query string? ● Query string modifier ● Add additional query parameters 12 What can I configure? (I)
  • 13. ● Special search options ● Pagination ● Sorting ● Facets (field and query facets) ● Highlighting ● Did you mean? 13 What can I configure? (II) Important You can, but need not necessarily configure everything!
  • 14. I_CmsSearchResultWrapper I_CmsSearchControllerMain Single controllers with configuration and state Result information Results list Facets result Highlighting result Page info ... I_CmsSearchStateParameters 14 Structure of the result object Configure the UI elements (input field names and current state/value) Print results, facet items, etc. Create a suitable link that contains the complete state of the search form
  • 15. <!-- ... --> <c:set var="controllers" value="${search.controller}"/> <!-- ... --> <c:set var="sort" value="${controllers.sorting}"/> <!-- ... --> <select name="${sort.config.sortParam}"> <c:forEach var="option" items="${sort.config.sortOptions}"> <option value="${option.paramValue}" ${sort.state.checkSelected[option]?"selected":""}> ${option.label} </option> </c:forEach> </select> <!-- ... --> 15 Rendering example: Sort options
  • 16. <!-- ... --> <c:set var="controllers" value="${search.controller}"/> <!-- ... --> <c:set var="sort" value="${controllers.sorting}"/> <!-- ... --> <select name="${sort.config.sortParam}"> <c:forEach var="option" items="${sort.config.sortOptions}"> <option value="${option.paramValue}" ${sort.state.checkSelected[option]?"selected":""}> ${option.label} </option> </c:forEach> </select> <!-- ... --> 16 Rendering example: Sort options Use abbreviations
  • 17. <!-- ... --> <c:set var="controllers" value="${search.controller}"/> <!-- ... --> <c:set var="sort" value="${controllers.sorting}"/> <!-- ... --> <select name="${sort.config.sortParam}"> <c:forEach var="option" items="${sort.config.sortOptions}"> <option value="${option.paramValue}" ${sort.state.checkSelected[option]?"selected":""}> ${option.label} </option> </c:forEach> </select> <!-- ... --> 17 Rendering example: Sort options Use the configuration
  • 18. <!-- ... --> <c:set var="controllers" value="${search.controller}"/> <!-- ... --> <c:set var="sort" value="${controllers.sorting}"/> <!-- ... --> <select name="${sort.config.sortParam}"> <c:forEach var="option" items="${sort.config.sortOptions}"> <option value="${option.paramValue}" ${sort.state.checkSelected[option]?"selected":""}> ${option.label} </option> </c:forEach> </select> <!-- ... --> 18 Rendering example: Sort options Use the state
  • 19. <!-- ... --> <c:forEach var="searchResult" items="${search.searchResults}"> <a href='<cms:link>${searchResult.fields["path"]}</cms:link>'> ${searchResult.fields["Title_prop"]} </a> <p> ${cms:trimToSize( fn:escapeXml(searchResult.fields["content_en"]) ,250)} </p> <hr /> </c:forEach> <!-- ... --> 19 Rendering example: Results
  • 20. <!-- ... --> <c:forEach var="searchResult" items="${search.searchResults}"> <a href='<cms:link>${searchResult.fields["path"]}</cms:link>'> ${searchResult.fields["Title_prop"]} </a> <p> ${cms:trimToSize( fn:escapeXml(searchResult.fields["content_en"]) ,250)} </p> <hr /> </c:forEach> <!-- ... --> 20 Rendering example: Results Loop over the result collection (get I_CmsSearchResourceBean objects)
  • 21. <!-- ... --> <c:forEach var="searchResult" items="${search.searchResults}"> <a href='<cms:link>${searchResult.fields["path"]}</cms:link>'> ${searchResult.fields["Title_prop"]} </a> <p> ${cms:trimToSize( fn:escapeXml(searchResult.fields["content_en"]) ,250)} </p> <hr /> </c:forEach> <!-- ... --> 21 Rendering example: Results Access index fields
  • 22. <!-- ... --> <c:set var="fControllers" value="${controllers.fieldFacets}"/> <c:forEach var="facet" items="${search.fieldFacets}"> <c:set var="facetController" value="${fControllers.fieldFacetController[facet.name]}"/> <c:if test="${cms:getListSize(facet.values) > 0}"> <!-- Render facet – see next slide --> </c:if> </c:forEach> <!-- ... --> 22 Rendering example: Facets (I)
  • 23. <!-- ... --> <c:set var="fControllers" value="${controllers.fieldFacets}"/> <c:forEach var="facet" items="${search.fieldFacets}"> <c:set var="facetController" value="${fControllers.fieldFacetController[facet.name]}"/> <c:if test="${cms:getListSize(facet.values) > 0}"> <!-- Render facet – see next slide --> </c:if> </c:forEach> <!-- ... --> 23 Rendering example: Facets (I) Loop over facets from the search result
  • 24. <!-- ... --> <c:set var="fControllers" value="${controllers.fieldFacets}"/> <c:forEach var="facet" items="${search.fieldFacets}"> <c:set var="facetController" value="${fControllers.fieldFacetController[facet.name]}"/> <c:if test="${cms:getListSize(facet.values) > 0}"> <!-- Render facet – see next slide --> </c:if> </c:forEach> <!-- ... --> 24 Rendering example: Facets (I) Get the facet’s controller
  • 25. <!-- ... --> <c:set var="fControllers" value="${controllers.fieldFacets}"/> <c:forEach var="facet" items="${search.fieldFacets}"> <c:set var="facetController" value="${fControllers.fieldFacetController[facet.name]}"/> <c:if test="${cms:getListSize(facet.values) > 0}"> <!-- Render facet – see next slide --> </c:if> </c:forEach> <!-- ... --> 25 Rendering example: Facets (I) Render the facet if necessary (see next slide)
  • 26. <!-- ... --> <div>${facetController.config.label}</div> <c:forEach var="facetItem" items="${facet.values}"> <div class="checkbox"> <label> <input type="checkbox" name="${facetController.config.paramKey}" value="${facetItem.name}" ${facetController.state.isChecked[facetItem.name] ?"checked":""} /> ${facetItem.name} (${facetItem.count}) </label> </div> </c:forEach> <!-- ... --> 26 Rendering example: Facets (II)
  • 27. <!-- ... --> <div>${facetController.config.label}</div> <c:forEach var="facetItem" items="${facet.values}"> <div class="checkbox"> <label> <input type="checkbox" name="${facetController.config.paramKey}" value="${facetItem.name}" ${facetController.state.isChecked[facetItem.name] ?"checked":""} /> ${facetItem.name} (${facetItem.count}) </label> </div> </c:forEach> <!-- ... --> 27 Rendering example: Facets (II) Use the configuration
  • 28. <!-- ... --> <div>${facetController.config.label}</div> <c:forEach var="facetItem" items="${facet.values}"> <div class="checkbox"> <label> <input type="checkbox" name="${facetController.config.paramKey}" value="${facetItem.name}" ${facetController.state.isChecked[facetItem.name] ?"checked":""} /> ${facetItem.name} (${facetItem.count}) </label> </div> </c:forEach> <!-- ... --> 28 Rendering example: Facets (II) Use the result
  • 29. <!-- ... --> <div>${facetController.config.label}</div> <c:forEach var="facetItem" items="${facet.values}"> <div class="checkbox"> <label> <input type="checkbox" name="${facetController.config.paramKey}" value="${facetItem.name}" ${facetController.state.isChecked[facetItem.name] ?"checked":""} /> ${facetItem.name} (${facetItem.count}) </label> </div> </c:forEach> <!-- ... --> 29 Rendering example: Facets (II) Use the state
  • 30. <c:set var="pagination" value="${controllers.pagination}"/> <c:forEach var="i" begin="${search.pageNavFirst}" end="${search.pageNavLast}"> <c:set var="is">${i}</c:set> <li ${pagination.state.currentPage eq i ? "class='active'" : ""}> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[is]} </cms:link>">${is}</a> </li> </c:forEach> <li> <c:set var="pages">${search.numPages}</c:set> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[pages]} </cms:link>">Last</a> </li> 30 Rendering example: Pagination
  • 31. <c:set var="pagination" value="${controllers.pagination}"/> <c:forEach var="i" begin="${search.pageNavFirst}" end="${search.pageNavLast}"> <c:set var="is">${i}</c:set> <li ${pagination.state.currentPage eq i ? "class='active'" : ""}> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[is]} </cms:link>">${is}</a> </li> </c:forEach> <li> <c:set var="pages">${search.numPages}</c:set> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[pages]} </cms:link>">Last</a> </li> 31 Rendering example: Pagination Use pagination support
  • 32. <c:set var="pagination" value="${controllers.pagination}"/> <c:forEach var="i" begin="${search.pageNavFirst}" end="${search.pageNavLast}"> <c:set var="is">${i}</c:set> <li ${pagination.state.currentPage eq i ? "class='active'" : ""}> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[is]} </cms:link>">${is}</a> </li> </c:forEach> <li> <c:set var="pages">${search.numPages}</c:set> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[pages]} </cms:link>">Last</a> </li> 32 Rendering example: Pagination Use current state
  • 33. <c:set var="pagination" value="${controllers.pagination}"/> <c:forEach var="i" begin="${search.pageNavFirst}" end="${search.pageNavLast}"> <c:set var="is">${i}</c:set> <li ${pagination.state.currentPage eq i ? "class='active'" : ""}> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[is]} </cms:link>">${is}</a> </li> </c:forEach> <li> <c:set var="pages">${search.numPages}</c:set> <a href="<cms:link>${cms.requestContext.uri} ?${search.stateParameters.setPage[pages]} </cms:link>">Last</a> </li> 33 Rendering example: Pagination Use state parameters
  • 34. ● Two options to send the current state: ● Submit a form ● Use state parameters ● With state parameters ● Everything is manipulated explicitly ● You do not need a form at all ● With a form ● You must make sure to send all the state you want (use hidden parameters, e.g., for the last query) ● You can intentionally prevent state transmission (e.g., for the current page) 34 Form vs. state parameters
  • 35. ● We did ● Introduce the tag <cms:search> ● See its configuration via an XML content ● Explore how to write a formatter for a search form ● If you need more information on formatting ● Explore the default formatter ● Explore the classes under org.opencms.jsp.search.result ● We did not ● Cover all configuration options ● See all use cases for <cms:search> 35 Short summary
  • 36. ● Intention ● Show blogs, news, ... ● Link to detail pages ● Realization ● <cms:contentload> ● Manifold collectors ● Question ● Where’s the difference between lists and a search result page? 36 Lists in OpenCms
  • 37. ● Intention ● Show blogs, news, ... ● Link to detail pages ● Realization ● <cms:contentload> ● Manifold collectors ● Question ● Where’s the difference between lists and a search result page? 37 Lists in OpenCms Essentially, there is no difference!
  • 38. 38 A short history of lists ● Simple way to render lists ● Many specific collectors ● Facility to edit list entries directly OpenCms 6.0 <cms:contentload> is introduced OpenCms 8.5 ● Collecting “byQuery” or “byContext” ● First contact of Search and Lists ● No facets etc. supported CmsSolrCollector is added OpenCms 10 <cms:search> and <cms:edit> are introduced ● Lists and search become one ● Facets etc. available for lists ● Editing becomes decoupled from lists ?
  • 39. ● What is specific for a list? ● XML content for configuration is unsuitable ● There is no query string provided by the user ● Usually there is no form ● XML contents, not the index is accessed ● How does <cms:search> handle the pecularities ● Configuration via JSON (String or file) ● An option to ignore the query parameter ● The already seen state parameters (no form is necessary) ● I_CmsSearchResourceBean allows to access XML contents via the CmsJspContentAccessBean 39 Lists with <cms:search>
  • 40. ● Live Demo Watch out for the Solr features Demo Demo Demo Demo デモ A list with <cms:search>
  • 41. <c:set var="searchConfig"> { "ignorequery" : true, "extrasolrparams" : "fq=type:u-blog&fq=parent-folders: "/sites/default/.content/blogentries/"", "pagesize" : ${content.value.pageSize}, "pagenavlength" : ${cms.element.settings["navlength"]} <!-- Facet and sort option configuration --> } </c:set> <cms:search configString="${searchConfig}" var="search"/> <!-- ... --> 41 The JSON configuration for a list
  • 42. <c:set var="searchConfig"> { "ignorequery" : true, "extrasolrparams" : "fq=type:u-blog&fq=parent-folders: "/sites/default/.content/blogentries/"", "pagesize" : ${content.value.pageSize}, "pagenavlength" : ${cms.element.settings["navlength"]} <!-- Facet and sort option configuration --> } </c:set> <cms:search configString="${searchConfig}" var="search"/> <!-- ... --> 42 The JSON configuration for a list Most important options
  • 43. <c:set var="searchConfig"> { "ignorequery" : true, "extrasolrparams" : "fq=type:u-blog&fq=parent-folders: "/sites/default/.content/blogentries/"", "pagesize" : ${content.value.pageSize}, "pagenavlength" : ${cms.element.settings["navlength"]} <!-- Facet and sort option configuration --> } </c:set> <cms:search configString="${searchConfig}" var="search"/> <!-- ... --> 43 The JSON configuration for a list Optional extra features
  • 44. <c:set var="searchConfig"> { "ignorequery" : true, "extrasolrparams" : "fq=type:u-blog&fq=parent-folders: "/sites/default/.content/blogentries/"", "pagesize" : ${content.value.pageSize}, "pagenavlength" : ${cms.element.settings["navlength"]} <!-- Facet and sort option configuration --> } </c:set> <cms:search configString="${searchConfig}" var="search"/> <!-- ... --> 44 The JSON configuration for a list The content adjusts the configuration
  • 45. <c:choose> <c:when test="${search.numFound > 0}"> <c:forEach var="result" items="${search.searchResults}"> <c:set var="content" value="${result.xmlContent}"/> <!-- render entry as usual --> </c:forEach> </c:when> <c:otherwise> No results found. </c:otherwise> </c:choose> 45 Rendering the list entries Easier than before Getting results and iterating over them is separated No nested <cms:contentload> anymore
  • 46. ● <cms:contentload> supported ● Editing, adding or deleting list entries ● Adding entries to an empty list ● Can we provide the same feature? ● No, because iteration is separated from <cms:search> ● Do we need the same feature? ● No, there’s no reason why edit options and content loading has to be coupled ● Can we get similar edit options differently? ● Yes, a special <cms:edit> tag 46 Editing list entries
  • 47. ● Places edit points wherever you like ● Allows to edit or delete existing XML contents ● Allows to add new contents ● Highlights the enclosed HTML when hovering over the edit point ● New contents can be placed ● At the place configured in the sitemap configuration ● In a provided folder ● Where the content that is edited is located 47 The tag <cms:edit>
  • 48. <c:choose> <c:when test="${search.numFound > 0}"> <c:forEach var="result" items="${search.searchResults}"> <c:set var="content" value="${result.xmlContent}"/> <cms:edit uuid='${result.fields["id"]}' create="true" delete="true"> <!-- render entry as usual --> </cms:edit> </c:forEach> </c:when> <c:otherwise> <cms:edit createType="u-blog"> <div>No results found.</div> </cms:edit> </c:otherwise> </c:choose> 48 Edit options for the list Easier than before Harmonized usage for empty and non-empty list
  • 49. ● How about the “Publish this page” option? ● <cms:contentload> with attribute “editable” causes list entries to be related to the page ● Do we have a similar mechanism? ● Using <cms:edit> the edited content becomes related to the page ● But does this suffice? ● Not if we use pagination. ● So can we do better? ● Yes: <cms:search ... addContentInfo="true"> ● All list entries become related to the page 49 Do we still miss a feature?
  • 50. 50 What should you remember? Server-sided Solr search becomes easy Search pages and lists become the same Edit point needed: Use <cms:edit> By, by <cms:contentload> and friends
  • 51. ● Containers in lists ● Container tag takes the element(s) <cms:container ... elements="${uuid}"/> ● Rendering is done by a suitable formatter 51 What’s next? (Maybe) Easily render contents of different types Inline editing will work out of the box Harmonized rendering of XML contents
  • 52. ● Containers in lists ● Container tag takes the element(s) <cms:container ... elements="${uuid}"/> ● Rendering is done by a suitable formatter 52 What’s next? (Maybe) Easily render contents of different types Inline editing will work out of the box Harmonized rendering of XML contents
  • 53. 53 Last comments Solr updated to version 5.1 (further updates follow) Gallery index replaced by “Solr offline” (watch out for bugs) This is OpenCms 10 Alpha 1 (don’t expect everything in the final state)
  • 54. Daniel Seidel Alkacon Software GmbH http://www.alkacon.com http://www.opencms.org Thank you very much for your attention!