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

标签 java solr solrj

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

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

正如您所看到的,每当我们想要向模型添加字段时,这都会导致大量维护工作,并且如果我们想要更改架构,我们还需要更改 SolrSchemaModel 以及映射到它或从它映射的所有代码。

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

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

最佳答案

这里有几件事:

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

关于java - 如何编写可维护的 Solr 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33978858/

相关文章:

java - Solr,如何在 schema.xml 中定义嵌套文档

java - 为什么 SOLRJ 会因未定义字段错误而失败

java - 条件存储库注入(inject) - Spring Boot

java - 将变量存储到我的服务器

java - 正则表达式忽略 html 标签,但从具有不同结束 anchor 的单词边界开始

java - jar 中提供什么格式的大背景图像?

xml - Solr 索引在分隔符上拆分字段

solr - 加快SOLR搜索

search - 关于数据结构/查询功能的elasticsearch vs solr

java - 如何获取搜索结果中出现的术语集?