首页 文章

具有动态字段的Spring Data Solr无法正常工作

提问于
浏览
3

我试图用动态字段索引文档并定义它:

@SolrDocument(solrCoreName = "collection1")
public class SolrProduct {

    @Field
    String id;

    @Field
    String name;

    @Field("mappedField_*")
    Map<String, List<String>> mappedFieldValues;
}

以下回购:

public interface SolrProductRepository extends SolrCrudRepository<SolrProduct, String> { }

我的solr架构如下:

<field name="name" type="text_ws" indexed="true" stored="true"/>
<dynamicField name="mappedField_*" type="text_general" indexed="true" stored="true"/>

我想保存一个新文档,其中mappedFieldValues映射的值是:

{thermometer = [yes],camera = [yes],振动= [动作],品牌= [飞利浦]}

然而,我得到以下例外:

org.apache.solr.client.solrj.impl.HttpSolrServer $ RemoteSolrException:
错误:org.apache.solr.client . 请求(HttpSolrServer.java:199)org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:118)org.apache.solr.client.solrj.SolrServer.add(SolrServer.java: 116)在Org.springframework的org.springframework.data.solr.core.SolrTemplate $ 4.doInSolr(SolrTemplate.java:178)org.springframework.data.solr.core.SolrTemplate $ 4.doInSolr(SolrTemplate.java:175)位于org.springframework.data.solr.core.SolrTemplate的org.springframework.data.solr.core.SolrTemplate.saveBean(SolrTemplate.java:175)中的.data.solr.core.SolrTemplate.execute(SolrTemplate.java:132)位于org.springframework.data.solr.repository.support.SimpleSolrRepository.save(SimpleSolrRepository.java:149)的.saveBean(SolrTemplate.java:169)at s的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在org.springframework的java.lang.reflect.Method.invoke(Method.java:601)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中的un.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)位于org.springframework的org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:401)中的.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:416) .data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373)org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)org.springframework.transaction.interceptor.TransactionInterceptor org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTr中的$ 1.proceedWithInvocation(TransactionInterceptor.java:99)在org.springframework的org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)的org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)中的ansaction(TransactionAspectSupport.java:281)位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java)的.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) :207)在$ Proxy60.save(未知来源)com.example.Indexer.indexAll(Indexer.java:29)

所以在我看来,spring-data-solr没有用动态字段名称正确调用solr(而不是mappedField_thermometer它只是调用温度计) .

有任何想法吗?

1 回答

  • 0

    Spring数据solr支持动态字段映射,例如在我的项目中,我已将任何字段名称配置为Object类型

    @org.springframework.data.solr.core.mapping.Dynamic
    @org.apache.solr.client.solrj.beans.Field("*")
    private ListOrderedMap<String, Object> fieldValueMap;
    

    如您所见,任何字段值都映射到此映射 . 但在你的solr配置项目中,你只说了以“mappedField_ *”开头的映射字段,所以如果你将字段名改为mappedField_yourField它就能正常工作

相关问题