Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写可维护的Solr代码?_Java_Solr_Solrj - Fatal编程技术网

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

Java 如何编写可维护的Solr代码?,java,solr,solrj,Java,Solr,Solrj,在我们的项目中,我们有一个solr模式,它的值具有多个几乎重复的字段。我的意思是,我们有一个示例字段field,我们在solr中存储为field、field\u w和field\u l,它们在搜索中都有不同的增强因子(动态类型不是_w或_l而是类似的) 因此,我们有一个模型,我们通过自定义代码将其映射到SolrSchemaModel,然后将其存储在Solr中。当我们阅读Solr时,我们会阅读SolrDocumentList(不是SolrSchemaModel,因为它有嵌入的文档,这些文档在阅读时

在我们的项目中,我们有一个solr模式,它的值具有多个几乎重复的字段。我的意思是,我们有一个示例字段field,我们在solr中存储为fieldfield\u wfield\u l,它们在搜索中都有不同的增强因子(动态类型不是_w或_l而是类似的)

因此,我们有一个模型,我们通过自定义代码将其映射到SolrSchemaModel,然后将其存储在Solr中。当我们阅读Solr时,我们会阅读SolrDocumentList(不是SolrSchemaModel,因为它有嵌入的文档,这些文档在阅读时映射到\uuuuuu childDocuments\uuuuu),并构建模型搜索响应(不是模型,因为它缺少字段)

正如您所看到的,每当我们想要向模型添加字段时,这将导致大量的维护,如果我们想要更改模式,我们还需要更改SolrSchemaModel以及与之之间的所有代码映射

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


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

这里有几点:

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

  • 我们将序列化的JSON保存在solr中,并在返回时反序列化它们。我明白了,如果你没有一份大文件就可以了。所以,当你写信给solr时,你存储了所有可搜索的字段,而在阅读时,你只阅读了一个字段,对吗?谢谢,这正是我想要的答案。我不知道复制字段:-)所有的例子都有。如果您阅读schema.xml,它会显示您可以学习的所有有趣的东西(例如dynamicField*,注释掉)。您只需要给它一些时间,因为随着时间的推移,这些示例已经变得越来越大。