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"/>

マップされたFieldValuesマップの値が次の新しいドキュメントを保存しようとしています:

{温度計=[はい]、カメラ=[はい]、振動=[モーション]、ブランド=[フィリップス]}

それでも、次の例外が発生します。

org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:

エラー: [doc=5530cbd78b15a5f18dfe3d28] org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:495) の不明なフィールド 'thermometer' org.apache.solr.client.solrj.impl.HttpSolrServer. request(HttpSolrServer.java:199) at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:118) at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java: 116) 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.execute(SolrTemplate.java:132) at org.springframework.data.solr.core.SolrTemplate.saveBean(SolrTemplate.java:175) at org.springframework.data.solr.core.SolrTemplate.saveBean(SolrTemplate.java:169) の org.springframework.data.solr.repository.support.SimpleSolrRepository.save(SimpleSolrRepository.java:149) の sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) の sun.reflect. NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method.invoke(Method.java:601) で org.springframework.data.repository .core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:416) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:401) at org.springframework.data.repository 。芯。org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java) :99) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) で org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) で org.springframework.aop.framework. org.springframework.dao.support.PersistenceExceptionTranslationInterceptor の ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)。$Proxy60 で org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) でcom.example.Indexer.indexAll(Indexer.java:29) に保存 (不明なソース)

そのため、spring-data-solr が動的フィールド名で solr を適切に呼び出していないように思えます (mappedField_thermometer の代わりに、単に温度計を呼び出します)。

何か案は?

4

1 に答える 1

1

Spring データ solr は、動的フィールド マッピングをサポートしています。たとえば、私のプロジェクトでは、フィールド名をオブジェクト タイプに設定しました。

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

ご覧のとおり、フィールド値はすべてこのマップにマップされます。しかし、solr構成のプロジェクトでは、「mappedField_*」で始まるフィールドをマップするだけだと言っているので、フィールド名をmappedField_yourFieldに変更すると、正しく機能します

于 2016-12-14T15:56:07.840 に答える