原标题:Spring认证中国教育管理中心-ApacheSolrSpring数据教程三(Spring中国教育管理中心)ApacheSolrSpring数据教程三Solr杂项操作支持本本章涵盖了对无法通过存储库界面直接访问的Solr操作的额外支持,例如分面。建议将这些操作添加为自定义实现,如SpringDataRepositories的自定义实现中所述。4.1.集合/核心名称使用@SolrDocument注释,可以通过给它一个静态值或使用SpEL进行动态评估来自定义使用的集合名称。@SolrDocument(collection="techproducts")classStaticCollectionName{...}@SolrDocument(collection="#{@someBean.getCollectionName()}")classDynamicCollectionName{...}@SolrDocument注解的类型可以传给targetTypeexpression中的变量被获取。4.2.部分更新PartialUpdates可以使用PartialUpdatewhichimplements来完成更新。PartialUpdateupdate=newPartialUpdate("id","123");update.add("name","updated-name");solrTemplate.saveBean("collection-1",update);4.3.投影可以通过@Query使用字段值来应用投影。@Query(fields={"name","id"})ListfindByNameStartingWith(Stringname);4.4.Faceted用法FacetedSolrRepository不能直接应用,但是SolrTemplate支持这个功能。以下示例显示了一个方面查询:FacetQueryquery=newSimpleFacetQuery(newCriteria(Criteria.WILDCARD).expression(Criteria.WILDCARD)).setFacetOptions(newFacetOptions().addFacetOnField("name").setFacetLimit(5));FacetPagepage=solrTemplate.queryForFacetPage("collection-1",query,Product.class);字段或查询的分面也可以使用@Facet。请记住,结果是FacetPage。Using@Facet允许您定义使用输入参数作为值的占位符。以下示例使用@Facet批注来定义分面查询:@Query(value=":")@Facet(fields={"name"},limit=5)FacetPagefindAllFacetOnName(Pageablepage);以下示例显示了另一个带前缀的方面查询:@Query(value="popularity:?0")@Facet(fields={"name"},limit=5,prefix="?1")FacetPagefindByPopularityFacetOnName(intpopularity,Stringprefix,Pageablepage);Solr允许在每个字段的基础上定义方面参数。为了向定义的字段添加特殊的方面选项,请使用FieldWithFacetParameters,如以下示例所示://produces:f.name.facet.prefix=springFacetOptionsoptions=newFacetOptions();options.addFacetOnField(newFieldWithFacetParameters("名称").setPrefix("弹簧"));4.4.1.范围分面您可以通过在查询FacetOptions上配置所需的范围来创建范围分面。您可以通过创建FacetOptions实例、将选项设置为aFacetQuery并通过查询分面页面来请求范围化的SolrTemplate,如下所示。FacetOptionsfacetOptions=newFacetOptions().addFacetByRange(newFieldWithNumericRangeParameters("price",5,20,5).setHardEnd(true).setInclude(FacetRangeInclude.ALL)).addFacetByRange(newFieldWithDateRangeParameters("发布",新日期(1420070400)),newDate(946684800),"+1YEAR").setInclude(FacetRangeInclude.ALL).setOther(FacetRangeOther.BEFORE));facetOptions.setFacetMinCount(0);Criteriacriteria=newSimpleStringCriteria(":");SimpleFacetQuery=facetQuerynewSimpleFacetQuery(criteria).setFacetOptions(facetOptions);FacetPagestatResultPage=solrTemplate.queryForFacetPage("collection-1",facetQuery,ExampleSolrBean.class);facetrange请求的字段有两种实现方式:Numericfacetrange:用于对数值字段进行范围分面。要请求范围分面,您可以使用org.springframework.data.solr.core.query.FacetOptions.FieldWithNumericRangeParameters类的实例。它的实例化需要字段名、起始值(Number)、结束值(Number)和间隙(Number);日期分面范围:用于对日期字段执行范围分面。要请求范围分面,您可以使用org.springframework.data.solr.core.query.FacetOptions.FieldWithDateRangeParameters类的实例。它的实例化需要字段名、起始值(日期)、结束值(日期)和间隙(字符串)。您可以使用org.apache.solr.util.DateMathParser为此类字段定义间隙(例如,+6MONTHS+3DAYS/DAY表示未来六个月零三天,四舍五入到最近的一天)。此外,可以为具有范围参数的字段配置以下属性(org.springframework.data.solr.core.query.FacetOptions.FieldWithRangeParameters):HardEnd:setHardEnd(Boolean)定义最后一个范围是否应该突然结束,即使endisnotsatisfied(start-end)%gap=0.Include:setInclude(org.apache.solr.common.params.FacetParams.FacetRangeInclude)定义应如何处理范围方面请求的边界(下限和上限)(排除)或排除)。其他:setOther(org.apache.solr.common.params.FacetParams.FacetRangeOther)定义范围分面的附加(其他)计数(例如,范围分面开始之前、范围分面结束之后,甚至开始和结束文档计数之间)。4.4.2.Pivot分面也支持Pivot分面(决策树),可以使用@Facet注解查询,如下:publicinterface{@Facet(pivots=@Pivot({"category","dimension"},pivotMinCount=0))FacetPagefindByTitle(Stringtitle,Pageablepage);@Facet(pivots=@Pivot({"category","dimension"}))FacetPagefindByDescription(Stringdescription,Pageablepage);}或者,你可以使用查询SolrTemplate如下:FacetQueryfacetQuery=newSimpleFacetQuery(newSimpleStringCriteria("title:foo"));FacetOptionsfacetOptions=newFacetOptions();facetOptions.setFacetMinCount(0);facetOptions.addFacetOnPivot("categorydimension");facetQuery.setFacetOptions(facetOptions);FacetPagefacetResult=solrTemplate.queryForFacetPage("collection-1",facetQuery,Product.class);要检索数据透视结果,请使用以下getPivot方法:Listpivot=facetResult.getPivot(newSimplePivotField("categories","available"));4.5.项目术语向量不能直接在SolrRepository中使用,但可以通过SolrTemplate应用。请记住,结果是TermsPage。以下示例显示了如何创建术语查询:TermsQueryquery=SimpleTermsQuery.queryBuilder().fields("name").build();TermsPagepage=solrTemplate.queryForTermsPage("collection-1",query);4.6.结果分组和字段折叠结果分组不能直接在SolrRepository内部使用,但可以通过SolrTemplate应用。请记住,结果是GroupPage。以下示例显示如何创建结果组:newSimpleQuery(newSimpleStringCriteria(":"));GroupOptionsgroupOptions=newGroupOptions().addGroupByField(field).addGroupByFunction(func).addGroupByQuery(query);groupQuery.setGroupOptions(groupOptions);GroupPage产品>page=solrTemplate.queryForGroupPage("collection-1",query,Product.class);GroupResultfieldGroup=page.getGroupResult(field);GroupResultfuncGroup=page.getGroupResult(func);GroupResultqueryGroup=page.getGroupResult(询问);4.7.FieldStatisticsFieldStatistics用于从给定的Solr字段中检索统计信息(最大值、最小值、总和、计数、平均值、缺失、stddev和不同的计算)。您可以为查询提供StatsOptions,并为从StatsPage返回的FieldStatsResult提供。例如,您可以按如下方式使用SolrTemplate://simplefieldstatsStatsOptionsstatsOptions=newStatsOptions().addField("price");//querySimpleQuerystatsQuery=newSimpleQuery(":");statsQuery.setStatsOptions(statsOptions);StatsPagestatsPage=solrTemplate.queryForStatsPage("collection-1",statsQuery,Product.class);//检索统计信息infoFieldStatsResultpriceStatResult("priceResultstatPage.getField");Objectmax=priceStatResult.getMax();Longmissing=priceStatResult.getMissing();您可以通过如下注释存储库方法@Stats来获得相同的结果:@Query("name:?0")@Stats(value={"price"})StatsPagefindByName(Stringname,Pageablepage);还支持不同的计算和方面://对于不同的calculationStatsOptionsstatsOptions=newStatsOptions().addField("category")//对于不同的计算。setCalcDistinct(true)//对于faceting.addFacet("availability");//querySimpleQuerystatsQuery=newSimpleQuery(":");statsQuery。setStatsOptions(statsOptions);StatsPagestatsPage=solrTemplate.queryForStatsPage("collection-1",statsQuery,Product.class);//字段statsFieldStatsResultcategoryStatResult=statResultPage.getFieldStatsResult("categoryListing");Object/tin/retrievcategoryValues=priceStatResult.getDistinctValues();LongdistinctCount=categoryStatResult.getDistinctCount();//检索facetingMapavailabilityFacetResult=categoryStatResult.getFacetStatsResult("availability");LongavailableCount=availabilityFacetResult.get("true").getCount();前面示例的注释(因此更短)版本如下所示:@Query("name:?0")@Stats(value="category",facets={"availability"},calcDistinct=true)StatsPage<产品>findByName(字符串名称);要执行选择性分面或选择性不同计算,您可以使用@SelectiveStats,如下所示://selectivedistinctfaceting...FieldfacetField=getFacetField();StatsOptionsstatsOptions=newStatsOptions().addField("price").addField("类别").addSelectiveFacet("name").addSelectiveFacet(facetField);...//或注释存储库方法如下...@Stats(value="price",selective=@SelectiveStats(field="category",facets={"name","available"}))...//选择性不同计算...StatsOptionsstatsOptions=newStatsOptions().addField("price").addField("category").setSelectiveCalcDistinct(true);...//或注释存储库方法如下...@Stats(value="price",selective=@SelectiveStats(field="category",calcDistinct=true))...4.8.过滤查询过滤查询提高了查询速度并且不影响文档分数我们建议将地理空间搜索作为过滤查询来实现。在Solr中,除非另有说明,否则所有距离均以公里为单位,而点则以纬度和经度为单位。以下示例显示了针对某个地理点(在本例中为奥地利)的筛选查询:"store").near(newPoint(48.305478,14.286699),newDistance(5));query.addFilterQuery(fq);您还可以使用@Query定义简单的过滤器查询。Using@Query允许您定义使用输入参数作为值的占位符。以下示例显示了带有占位符(:)的查询:@Query(value=":",filters={"inStock:true","popularity:[*TO3]"})ListfindAllFilterAvailableTrueAndPopularityLessThanEqual3();