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

How does one write maintainable Solr code?

在我们的项目中,我们有一个 solr 模式,它的值包含多个几乎重复的字段。我的意思是我们有一个示例字段 Field,我们将其存储为 fieldfield_wfield_l 在 solr 中,它们中的每一个在搜索中都有不同的提升因子(动态类型不是 _w 或 _l 但相似)。

因此,我们有一个 Model,我们通过自定义代码将其映射到 SolrSchemaModel,然后将其存储在 Solr 中。当我们从 Solr 读取时,我们然后读取 SolrDocumentList(不是 SolrSchemaModel,因为它具有映射到 [=57= 的嵌入式文档] 阅读)并构建一个 ModelSearchResponse(不是 Model,因为它缺少字段)。

如您所见,每当我们想要向 Model 添加字段时,如果我们需要进行 lot 维护想要更改架构,我们还需要更改 SolrSchemaModel 以及与之映射的所有代码。

其他人如何使用 Solr 处理持久性?一个想法是将 class 的 JSON 序列化为 Solr 字段,这样只要模式或 Model 发生变化并且 serialisation/deserialisation 完好无损。另一个人建议不要将 Solr 用作仅具有独立内容的持久性(我想这意味着在返回结果之前执行搜索后在另一个数据库上执行读取)。

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

这里有几件事:

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