本教程介绍了如何为一个一分钟创建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页面):