使用Solr所遇问题记录
Solr 页面创建core
- 错误信息:
Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Multiple [schema.xml] fieldType registered to the same name: text_ik ignoring: text_ik{class=org.apache.solr.schema.TextField,analyzer=org.apache.solr.analysis.TokenizerChain,args=null}
- 原因分析:
这个错误表明在创建新的 Solr core 时出现了冲突,原因是有多个名为
text_ik
的 fieldType 在schema.xml或 managed-schema
中注册,其中一个是由 Solr 自带的org.apache.solr.schema.TextField
定义的。这会导致冲突,从而无法创建新的 core。简单说就是配置
ik
分词器时配置了两次。
- 解决方式:
如果你的
schema.xml或 managed-schema
中有自定义的text_ik
fieldType 定义,并且它与 Solr 自带的org.apache.solr.schema.TextField
定义重复,你可以选择删除自定义的定义,或者将其重命名为不与 Solr 自带的定义冲突的名字,例如text_ik_custom
。删除多余的
ik
分词器配置。
- 错误信息:
Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: [schema.xml] Duplicate field definition for 'id' [[[id{type=string,properties=indexed,stored,omitNorms,omitTermFreqAndPositions,sortMissingLast,required,useDocValuesAsStored,uninvertible, required=true}]]] and [[[id{type=string,properties=indexed,stored,omitNorms,omitTermFreqAndPositions,sortMissingLast,required,useDocValuesAsStored,uninvertible, required=true}]]]
- 原因分析:
这个错误表示在创建新的 Solr core 时,出现了重复的字段定义
id
,在schema.xml或 managed-schema
文件中定义了多次id
字段。这会导致冲突,从而无法创建新的 core。
- 解决方式:
删除重复字段的定义, 确保每个字段名在
schema.xml或 managed-schema
中只定义一次。
SpringBoot中依赖tika-app
报错
- 报错依赖:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-app</artifactId> <version>2.8.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
- 错误信息:
Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/D:/software/work/dataRepository/MavenRepository_bladx/org/apache/tika/tika-app/1.7/tika-app-1.7.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
原因分析:
是由日志库的冲突导致。错误消息中显示 Logback 和 Log4jLoggerFactory 冲突了 。
在此依赖中有自己的日志 bean,而在项目中又依赖了
slf4j
,从而冲突。
- 解决方式:
修改依赖为:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.8.0</version> </dependency>
SpringBoot中调用solrClient.addBeans(docs);
报错
- 错误信息:
org.apache.solr.client.solrj.beans.BindingException: class: class org.springblade.customer.entity.KnowledgeIk does not define any fields.
原因分析:
是由于在使用 SolrJ 的数据绑定功能时,对应的 Java 类
org.springblade.customer.entity.KnowledgeIk
中所定义的字段,在schema.xml或 managed-schema
文件中并未定义。Solr中的字段必须是先定义后使用。
解决方式:
对属性字段添加
@Field
注解 ,添加该注解后通常不需要再在managed-schema
(或旧版本中的schema.xml
)中显式定义字段。SolrJ 库会根据@Field
注解的信息自动将 Java Bean 的属性映射为 Solr 文档中的字段,并且在 Solr 的managed-schema
中动态地创建相应的字段定义。(前提是 Java Bean 的属性字段格式能与managed-schema
文件中动态域中所定义的字段匹配,例如:文件中定义有*_s
字段,而你定义的属性字段名为xxx_s
。)在
managed-schema
(或旧版本中的schema.xml
)中显式定义字段。注意:
这种动态字段映射方式需要确保 Solr 的
managed-schema
文件具有相应的权限,允许 SolrJ 库进行动态的字段创建。如果你的环境限制了这种自动创建字段的权限,则需要手动定义字段在managed-schema
中。
java属性添加了@Field 注解 但是有在Solr中并未显示
原因分析
未在
@Field
注解中指定属性名: 默认情况下,@Field
注解会将 Java 对象的属性名作为字段名。但是,如果你想要在 Solr 中使用不同的字段名,需要在@Field
注解中使用name
属性来指定字段名。@Field(name = "custom_field_name") private String propertyName;
属性值为 null 或空: 如果属性的值为 null 或空,Solr 默认情况下不会将它们添加到文档中。确保属性的值不为空,才能被正确映射到 Solr 文档中。
未添加到 Solr 的文档: 只有在将 Java 对象添加到 Solr 索引中时,
@Field
注解中定义的属性才会被映射到 Solr 文档中。确保你已经执行了将 Java 对象添加到 Solr 索引的操作。忽略字段:
@Field
注解中的ignore
属性可以用来指定是否忽略某个字段。如果某个属性被设置为忽略,它将不会被添加到 Solr 文档中。@Field(ignore = true) private String ignoredProperty;
- 字段类型不匹配: Solr 要求字段类型与属性的数据类型匹配。如果类型不匹配,Solr 可能会拒绝将属性添加到文档中。确保你在
@Field
注解中正确指定了字段的类型。