我编写了一个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知道我使用这些作为添加数据的参数。
答案 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-schema
和schema.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
字段的类型为字符串。