本教程介绍了如何为一个一分钟创建App应用程序(即AWM)编写自定义SOLR搜索。在这个例子中,我们使用了"支出报表"应用程序。
目标是建立一个只会返回支出报表的搜索功能,并在facet(面板)使用支出报表的一些字段。在这个例子中,我们将为facet添加支出报表类的状态、组织、货币、客户和用户字段。
此外,我们将建立一个“List Facet”,允许显示StaticList以及DBList字段。此facet的代码可复用于此类型的任何字段。
为SOLR搜索配置代码
我们定制solrConfig对象的"filterQuery","facetFields"和"facetDisplayers"字段。其他配置选项是默认的。
- filterQuery: 我们限制DOCUMENT类型的item和包含一个ERCode.ERClass类。
- facetFields: 我们为ERCode.ERCodeClass类的属性添加一些额外的面板字段。我们还删除从默认配置不需要的某些字段。
- facetDisplays: 我们声明用于每个字段的facet代码。
创建包含以下代码的ExpenseReport.Search页面:
{{velocity output="false"}}
#set ($solrConfig = {
'filterQuery': [
'type:DOCUMENT',
'class:ERCode.ERCodeClass'
],
'facetFields': [
'property.ERCode.ERCodeClass.status_string',
'property.ERCode.ERCodeClass.organisation_string',
'property.ERCode.ERCodeClass.currency_string',
'property.ERCode.ERCodeClass.user_string',
'author',
'creator',
'date',
'creationdate'
],
'facetDisplayers': {
'type': 'Main.SolrTypeFacet',
'wiki': 'Main.SolrWikiFacet',
'locale': 'Main.SolrLocaleFacet',
'author': 'Main.SolrUserFacet',
'creator': 'Main.SolrUserFacet',
'attauthor': 'Main.SolrUserFacet',
'date': 'Main.SolrDateFacet',
'creationdate': 'Main.SolrDateFacet',
'attdate': 'Main.SolrDateFacet',
'class': 'Main.SolrClassFacet',
'attsize': 'Main.SolrFileSizeFacet',
'mimetype': 'Main.SolrMediaTypeFacet',
'property.ERCode.ERCodeClass.status_string' : 'ExpenseReport.ListFacet',
'property.ERCode.ERCodeClass.organisation_string' : 'ExpenseReport.ListFacet',
'property.ERCode.ERCodeClass.currency_string' : 'ExpenseReport.ListFacet',
'property.ERCode.ERCodeClass.client_string' : 'ExpenseReport.ListFacet',
'property.ERCode.ERCodeClass.user_string' : 'Main.SolrUserFacet'
}
})
{{/velocity}}
{{include reference="Main.SolrSearch" /}}
List字段的facet代码
我们需要为list字段添加facet代码,因为XWiki是默认不提供的。在ExpenseReport.ListFacet添加以下代码:
{{velocity}}
#macro (displaySearchFacetValue_list $value)
#set($class = $xwiki.getDocument($pclass).getxWikiClass())
#set($prop = $class.get($propName))
## here we convert the raw value in a nicely displayed value
$prop.getMapValues().get($value).value
#end
#if ($facetValues)
## here we extract the class name and field name so that we can avoid hardcoding it
#set($index1 = $facetField.name.lastIndexOf("."))
#set($index2 = $facetField.name.lastIndexOf("_"))
#set($pclass = $facetField.name.substring(0, $index1).substring(9))
#set($index1 = $index1 + 1)
#set($propName = $facetField.name.substring($index1, $index2))
{{html}}
<ul class="${propName}">
#displaySearchFacetValuesLimited($facetValues {} 'displaySearchFacetValue_list')
</ul>
{{/html}}
#end
{{/velocity}}
效果展示
下面是我们定制Solr搜索的效果(ExpenseReport.Search页面):