如何编写可维护的Solr代码?

时间:2015-11-29 02:45:16

标签: java solr solrj

在我们的项目中,我们有一个solr模式,其中包含多个,接近重复的字段的值。我的意思是我们有一个示例字段字段,我们将其存储为字段 field_w field_l solr和每个都有不同的搜索增强因子(动态类型不是_w或_l但相似)。

因此,我们有一个模型,我们通过自定义代码映射到 SolrSchemaModel ,然后我们将其存储在Solr中。当我们从Solr读取时,我们读取 SolrDocumentList (不是 SolrSchemaModel ,因为它有嵌入的文档,在读取时映射到 __ childDocuments __ )并构建一个< strong> ModelSearchResponse (不是模型,因为它缺少字段)。

正如您所看到的,只要我们想要将字段添加到模型,这将导致很多维护,如果我们想要更改架构,我们还需要更改 SolrSchemaModel 以及与之相关的所有代码映射。

其他人如何处理Solr的持久性?弹跳的一个想法是将类的JSON序列化作为Solr字段,这样只要架构或模型发生更改并且序列化/反序列化保持不变,就会更改写入。另一个人建议不要使用Solr作为持久性只有一些单独的东西(我想这意味着在返回结果之前执行搜索后在另一个数据库上执行读取)。

人们如何解决这个问题?如果相关,请将 Java 8 SolrJ 一起使用。

1 个答案:

答案 0 :(得分:2)

这里有几件事情:

  1. 如果您要将字段复制到其他字段以进行不同的分析,则不需要存储其他字段,只需将其编入索引即可。因此,您只需要在Solr级别上 copyField 它们,而不是更改序列化模型。
  2. 处理不需要跟踪模式等价的经典方法是在表示类型的名称中带有前缀或后缀的动态字段。因此,所有* _s字段都是字符串,所有* _d字段都是日期。您的映射器甚至可能会自动后缀/解除后缀。这是大多数CMS在与Solr交谈时使用的内容。
  3. copyField支持源字段和目标字段的通配符,因此您仍然可以结合上述技术。