RemoteSolrException:错误:[doc = 2]未知字段'firstName'

时间:2017-05-07 05:32:28

标签: java mysql spring solr solrj

我编写了一个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知道我使用这些作为添加数据的参数。

1 个答案:

答案 0 :(得分:1)

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

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

无论如何,我会尽量给你一些指导和建议,以避免让我难以理解。

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

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

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

  
      
  • managed-schema是模式文件的名称,Solr默认使用它来支持在运行时通过模式进行模式更改   API或Schemaless Mode功能。

  •   
  • schema.xml是架构文件的传统名称,可以由使用ClassicIndexSchemaFactory的用户手动编辑。

  •   

在这种情况下,要理解的重要一点是,在Solr中,您可以定义一个字段类,例如名称以_s(字符串)或_i(整数)结尾的所有字段,这些类在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字段,在无模式模式id字段是一个用作主键的特殊字段,是一种您不必添加的保留名称任何后缀。

id字段的类型为字符串。