Facetten

Facetten erlauben dem Benutzer die Suchresultate aufgrund der Inhalte des Index einfach zu verfeinern.



Damit indizierte Eigenschaften als Facetten verwendet werden können, muss im CategoryDescriptor für die Eigenschaft das Attribut aggregatable auf true gesetzt werden.

Wichtig: Facetten stehen aktuell nur String-Werte zur Verfügung.

Facetten werden im Mindbreeze Client automatisch angezeigt, können aber mit der Option Aggregations deaktiviert werden.


Im Search Service stehen die gleichen Facetten zur Verfügung wie im Client Service. Sie können aber auch beliebige Facetten mit addAggregation bei einer View anfordern.


…
View.newBuilder()
	.setId("View")
	.setCount(10)
	.addAggregation("name")
…


Die Facetten sind als List von Aggregation-Objekten im ResultSet enthalten.


<% 
for (Aggregation aggregation : resultSet.getAggregationList()) {				
		if (aggregation.getEntryCount() == 0) continue;
%>
<div class="facet">
		<div class="facetName">
<b><%="mes:date".equals(aggregation.getName())? "Datum" : aggregation.getName()%></b>
</div>
		<div class="facetEntries">
<% 
			for (Aggregation.Entry entry : aggregation.getEntryList()) {
				byte[] queryExpr = entry.getQueryExpr().toByteArray();
				String facetQuery = Base64.encodeBase64URLSafeString(queryExpr);
%>
		<div><a href="<%=Nav.self(request, "start", "0")%>&facet=<%=facetQuery%>"><%= entry.getName() %> (<%= entry.getCount() %>)</a></div>	
<% 	
			} 
%>
</div>
</div>
<% 
} 
%>


Jede Ausprägung der Facetten enthält den Wert der Eigenschaft, die Anzahl der Objekte, sowie ein QueryExpr-Objekt, für die Einschränkung der Dokumente. Dieses QueryExpr-Objekt können Sie bei der Suche zur Einschränkung verwenden.


QueryExpr.And.Builder constraints = QueryExpr.And.newBuilder();
String[] facets = request.getParameterValues("facet");
if (facets != null) { 
	for (String facet : facets) {
		if (facet.isEmpty()) continue;
		QueryExpr queryExpr = QueryExpr.newBuilder().mergeFrom(Base64.decodeBase64(facet)).build();
		constraints.addExpr(queryExpr);		
	}
}
if (constraints.getExprCount() > 0) {
searchRequest.setQueryConstraints(QueryExpr.newBuilder()
.setKind(QueryExpr.Kind.EXPR_AND)
.setAndExpr(constraints)
);
}