10月底,我参加了为期3天的Solr培训。 鉴于我在年中参加了以前的Elastic Search演讲 ,这非常有趣。 作为老的Spring Data爱好者,当我发现Spring Data提供了Solr模块时,我就抓住了尝试它的机会。
在这种情况下,我很清楚Solr上的抽象层并不意味着我们可以轻松更改基础数据存储:Solr被设计为反向索引,而其他Spring Data模块则更加专门化(JPA,MongoDB等) )。 但是,与Solr相比,使用Spring Data仍有一些优点:
- 快速原型,当您不需要整个九码时
- 当大多数团队已经了解Spring Data而不是Solr时,请使用Solr
- 从底部进行Spring集成
- 最后但并非最不重要的一点是,您可以轻松地在嵌入式Solr和独立的Solr之间切换。 Spring Data很好地将Solrj API和HTTP都包装在其自己的API之后。 如果您认为这不是相关用例,因为它永远不会发生,请考虑进行集成测试
在使用相关数据初始化Solr之后,您必须完成以下步骤才能开始开发:
- 第一步是使用基础Solr配置Spring上下文。 Spring数据的Solr需要的bean
solrTemplate
类型的SolrOperations
。 为此使用JavaConfig:@Configuration @EnableSolrRepositories("ch.frankel.blog.springdata.solr.repository") publicclassJavaConfig{ @Bean protectedHttpSolrServerFactoryBeansolrServerFactory(){ HttpSolrServerFactoryBeanfactory=newHttpSolrServerFactoryBean(); factory.setUrl("http://localhost:8983/solr"); returnfactory; } @Bean publicSolrOperationssolrTemplate()throwsException{ returnnewSolrTemplate(solrServerFactory().getObject()); } }
- 创建管理实体。 Solr中存储的所有字段都必须使用
@Field
注释。 如果实体属性名称与Solr字段名称不同,则@Field
接受一个值来覆盖该名称:publicclassLoan{ @Field privateStringid; @Field("gov_type") privateStringgovernmentType; // Getters and setters }
- 创建存储库接口:从
SolrRepository<Bean,ID>
或SolrCrudRepository<Bean,ID>
继承。 请注意,前者仅提供count()
方法。publicinterfaceLoanRepositoryextendsSolrRepository<Loan,String>{}
- 向前一个界面添加查询方法:
- 简单的查询方法受益于Spring数据解析:
List<Loan> findByLoanType(String)
将转换为?q=loan_type:…
- 更高级的查询(或名称不遵循此模式的方法)应使用
@Query
注释:@Query("state_name:[* TO *]")
将找到所有具有state_name
值的state_name
。 注释可以通过使用?x
绑定尽可能多的参数,其中x是方法参数列表中的参数索引。 -
@Facet
面也通过@Facet
注释处理,该注释采用构面应使用的字段名称。 但是,这会将方法签名更改为FacetPage
并且要由调用方法(可能位于服务层)来处理。
- 简单的查询方法受益于Spring数据解析:
最终的类应该看起来像这样,考虑到它提供的所有功能,这真是太棒了:
publicinterfaceLoanRepositoryextendsSolrRepository<Loan,String>{
List<Loan>findByLoanType(Stringloan);
List<Loan>findByTitleContaining(Stringtitle);
@Query("state_name:[* TO *]")
List<Loan>findLocalized();
@Query("*:*")
@Facet(fields="loan_type")
FacetPage<Loan>findAllLoanTypes(Pageablepage);
}
整个项目源代码可出现在的IntelliJ / Maven的格式,完整的测试。 请注意,您将需要一个具有特定Solr模式和文档的运行中的Solr实例。 提供了模式和文档文件(federal.xml),但它们不是自动的:您需要将模式和文档文件覆盖到正在运行的实例中(使用经典的java -jar post.jar
命令行) 。