SpringBoot集成Solr所遇问题记录

使用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.tikagroupId>
            <artifactId>tika-appartifactId>
            <version>2.8.0version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4jgroupId>
                    <artifactId>slf4j-apiartifactId>
                exclusion>
                <exclusion>
                    <groupId>org.slf4jgroupId>
                    <artifactId>slf4j-log4j12artifactId>
                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.tikagroupId>
            <artifactId>tika-coreartifactId>
            <version>2.8.0version>
        dependency>

        <dependency>
            <groupId>org.apache.tikagroupId>
            <artifactId>tika-parsers-standard-packageartifactId>
            <version>2.8.0version>
        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 注解中正确指定了字段的类型。

你可能感兴趣的:(实践是检验真理的唯一标准,spring,boot,solr,后端)