2017-06-13 4 views
2

Ich habe eine Anforderung, wobei ich Facetten beginnend mit einer bestimmten Folge von Zeichen anzeigen möchte. Kann das gemacht werden?Facettenfilterung in Marklogic

z.B .:

Wenn meine search:search kehrt Facetten folgende

<search:values-response name="facet" type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:search="http://marklogic.com/appservices/search"> 
<search:distinct-value frequency="846">DMPK</search:distinct-value> 
<search:distinct-value frequency="323">TNF</search:distinct-value> 
<search:distinct-value frequency="301">IL6</search:distinct-value> 
<search:distinct-value frequency="297">PAGE4</search:distinct-value> 
<search:distinct-value frequency="296">INS</search:distinct-value> 
<search:distinct-value frequency="291">PSD</search:distinct-value> 
<search:distinct-value frequency="280">EGFR</search:distinct-value> 
<search:distinct-value frequency="271">PAGE3</search:distinct-value> 
<search:distinct-value frequency="270">PAGE5</search:distinct-value> 
<search:distinct-value frequency="268">CD4</search:distinct-value> 
<metrics xmlns="http://marklogic.com/appservices/search"> 
<values-resolution-time>PT0.012602S</values-resolution-time> 
<total-time>PT0.014218S</total-time> 
</metrics> 
</search:values-response> 

Ich möchte weiter die Facetten filtern, indem Sie mir nur alle Facetten bekommen Spruch mit PAGE sagen beginnen. Ich kann den Filter nicht anwenden, nachdem ich alle Facetten erhalten habe, da die Facetten in 1000er sein können. Also möchte ich den Filter anwenden, während ich die Facetten selbst erhalte. Kann das gemacht werden?

Antwort

1

Ja, Sie können eine custom constraint mit einer custom facet function erstellen. Out-of-the-Box-Facetten basieren ausschließlich auf direkten Wertvergleichen und nicht auf Platzhaltern. Ihre individuelle Einschränkung wäre ziemlich vorformulierten (siehe Dokumentation Beispiele), und die Facette Funktion durchführen würde die Stellvertreterzeichen:

declare function my:start-facet(
    $constraint as element(search:constraint), 
    $query as cts:query?, 
    $facet-options as xs:string*, 
    $quality-weight as xs:double?, 
    $forests as xs:unsignedLong*) 
as item()* 
{ 
    cts:element-value-match(
    xs:QName("my:element"), "PAGE*", 
    $facet-options, $query, $quality-weight, $queries) 
}; 
+0

Ich verwende 'search: values', um die Facettierung zu erhalten, da ich die zu sendenden Facetten brauche. Wie kann ich die benutzerdefinierte Einschränkung dafür verwenden? – Ravi

+0

@Ravi 'search: Werte' und benutzerdefinierte Einschränkungen sind verschiedene Funktionen. Sie könnten eine ähnliche Lösung wie @ grtjn mit Buckets in 'search: values' verwenden, um etwas Ähnliches wie gewünscht zu erhalten, aber es ist nicht anpassbar. – wst

+0

Hmm .. Ich glaube nicht, dass Buckets funktionieren werden, wenn ich 'PAGE *' sagen will. Ich möchte, dass die Facetten nur 'PAGE1 10',' PAGE2 15' usw. sind und ignoriere alle anderen Facetten, die das nicht tun Beginnen Sie mit 'PAGE'. Ich denke, ich muss mein UI-Design überdenken - Danke für die Vorschläge – Ravi

1

Wenn Sie die Start Zeichen im Voraus wissen, Sie Eimer bei der Suche Constraint-Definition verwenden könnten wie zum Beispiel:

<bucket name="PAGE" ge="PAGE" lt="PAGF">PAGE</bucket> 

Siehe auch http://docs.marklogic.com/guide/search-dev/appendixa#id_80046

Für sie in einer dynamischeren Art und Weise erhalten, würden Sie eine benutzerdefinierte Einschränkung müssen wie von wst erwähnt.

HTH!

+0

Ich denke, ich werde mein UI-Design überdenken und Facing und Filter von Facetten aussortieren ... Aber ich werde Ihre [...] ml-constraints] (https://github.com/grtjn/ml-constraints) code und ändere ein bisschen, um meine Bedürfnisse zu erfüllen - Danke für den Vorschlag – Ravi