Reputation: 1179
I have a requirement, wherein I want to display facets starting with a particular sequence of characters. Can this be done ?
e.g.:
If my search:search
returns following facets
<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>
I want further filter the facets by saying only get me all the facets starting with say PAGE
. I cannot apply the filter after I got all the facets as the facets can be in 1000's. So, I want to apply the filter while getting the facets itself. Can this be done ?
Upvotes: 2
Views: 415
Reputation: 20414
If you know the starting characters upfront, you could use buckets in your search constraint definition such as:
<bucket name="PAGE" ge="PAGE" lt="PAGF">PAGE</bucket>
See also http://docs.marklogic.com/guide/search-dev/appendixa#id_80046
For getting them in a more dynamic fashion, you would need a custom constraint as mentioned by wst.
HTH!
Upvotes: 1
Reputation: 11771
Yes, you can create a custom constraint with a custom facet function. Out of the box, facets are based on direct value comparisons only, not wildcards. Your custom constraint would be pretty boilerplate (see the documentation examples), and your facet function would perform the wildcarding:
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)
};
Upvotes: 1