RemoteSolrException: ERROR: [doc=2] unknown field 'firstName'

RemoteSolrException: ERROR: [doc=2] unknown field 'firstName'

我写了一个 Spring 项目,它使用 SolrInputDocument 从表中添加数据。我使用了 doc.addField() 方法

doc.addField("actorId",a.getId()); doc.addField("firstName",a.getFirstName()); (仅发布其中的一小部分) 用于添加我从 MySql 检索到的数据。

当我尝试将这些值添加到 SOLR 索引时,出现以下错误。

Exception in thread "main" org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: ERROR: [doc=2] unknown field 'firstName' at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:552) at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:210) at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:206) at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:124) at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:68) at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:54)

我请求你帮助我知道我必须在任何其他文件中的什么地方提到字段 "id" 和 "firstName" 以便 SOLR 知道我正在使用这些作为添加数据的参数。

当出现 RemoteSolrException 消息时 ERROR: [doc=2] unknown field ... 显然意味着您要插入的字段不存在于您的索引(核心或集合)中。

您绝对必须阅读 Solr 文档,因为在 Solr 模式的设计中隐藏了大部分 Solr 信息检索 (IR) 逻辑。我建议阅读 Solr Overview of Documents, Fields, and Schema Design.

无论如何,我会尽量给你一些指导和建议,以避免对我来说更难理解的东西。

首先,您必须认识到 Solr 运行 作为独立服务器或在 SolrCloud 模式下的区别。前者是一个服务器,它的配置在本地写入磁盘,用于每个索引(命名为核心)。后者是集群配置,其中更多 Solr 实例表现为单个服务器(即分布式搜索、分片、副本、容错等),配置存储在 Zookeeper 集合体上。

我强烈建议从独立配置开始,除了所有差异之外,独立配置在您的光盘中可以轻松访问,并且具有 SolrCloud 中存在的所有 IR 功能。

同样,您还应该认识到 managed-schemaschema.xml 中索引 运行 之间的区别:

  • managed-schema is the name for the schema file Solr uses by default to support making Schema changes at runtime via the Schema API, or Schemaless Mode features.

  • schema.xml is the traditional name for a schema file which can be edited manually by users who use the ClassicIndexSchemaFactory.

在这种情况下,需要理解的重要一点是,在 Solr 中,您可以定义一个 class 字段,例如所有名称以 _s(字符串)或 _i(整数),这些classes在Solr中被调用Dynamic Fields

managed-schema(又名 Schemaless)配置中,所有最重要的字段类型都可以使用(即字符串、整数、布尔值、日期、货币、text_general 等)。这提供了立即加载数据的机会,您所要做的就是在每个字段的末尾添加正确的后缀:

  • productName 变为 productName_s
  • manufacturer 变为 manufacturer_s
  • quantity 变为 manufacturer_i
  • dateInvoice 变成 dateInvoice_d
  • price 变为 price_c

动态字段可以在无模式和传统模式模式下使用。

那么为什么会有这种差异呢?好吧,部分是历史原因,我认为 Solr 工程师试图让用户更容易地将他们的数据加载到 Solr 索引中。但是,当您开始编写自己的自定义 schema.xml 时,您终于可以访问 IR 的强大功能,这使 Solr 和 Lucene 引擎如此著名,并且是周围最好的开源全文服务器之一。

很可能您已经在索引中使用无模式模式,因此只需更改 firstName_s 中的字段名称并尝试再次加载数据。

关于id字段,在schemaless模式下id字段是作为主键的特殊字段,是一种“保留名”,不需要加任何后缀。

id 字段的类型为字符串。