2

我试图在Grails 3.1.6中使用ElasticSearch 1.0.0.2。在弹性搜索中反编组域错误Grails

域类是:

class Post { 

String content 
Date dateCreated 

static belongsTo = [user: User] 

static hasMany = [tags: Tag] 

static searchable = { 
    tags component : true 
    user component: true 
} 
} 

我已经在我的SearchController注入ElasticSearchService,并试图获得搜索结果为:

try { 
      def searchResult = elasticSearchService.search("${params.q}") 
//   def searchResult = Post.search("${params.q}") 
      println("search result: "+searchResult) 
      return [searchResult: searchResult] 
     }catch (e){ 
      println e.message 
      return [searchError: true] 
     } 

但收到错误是这样的:

ERROR grails.plugins.elasticsearch.conversion.unmarshall.DomainClassUnmarshaller - Error unmarshalling property 'user' of Class Post with id 4 
java.lang.IllegalStateException: Property Post.user is not mapped as [component], but broken search hit found. 
    at sun.reflect.GeneratedConstructorAccessor116.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1075) 
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83) 
    at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77) 
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247) 
    at grails.plugins.elasticsearch.conversion.unmarshall.DomainClassUnmarshaller.unmarshallProperty(DomainClassUnmarshaller.groovy:206) 
    at sun.reflect.GeneratedMethodAccessor339.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1432) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:64) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:190) 

有人会告诉我我犯了什么错误。谢谢。

回答

0

有同样的问题,使用此片从elastisearch插件文档到我的部件改变到固定我的问题的引用:

3.8.1。可搜索引用 可搜索引用映射模式是用于关联的默认模式,并且要求关联的可搜索类根映射才能拥有自己的索引。使用这种模式时,关联的域不会在生成的JSON文档中完全编组:只保留id和实例的类型。从索引中检索文档时,插件将使用存储的标识自动重建索引中的关联。

class MyDomain { 
// odom is an association with the OtherDomain class, set as a reference 
OtherDomain odom 

    static searchable = { 
     odom reference:true 
    } 
} 

// The OtherDomain definition, with default searchable 
class OtherDomain { 
    static searchable = true 

    String field1 = "val1" 
    String field2 = "val2" 
    String field3 = "val3" 
    String field4 = "val4" 
} 

当索引MYDOMAIN的一个实例,所得到的JSON文档将被发送到ElasticSearch:

{ 
    "mydomain": { 
     "_id":1, 
     "odom": { "id":1 } 
    } 
} 

{ 
    "otherdomain": { 
     "_id":1, 
     "field1":"val1", 
     "field2":"val2", 
     "field3":"val3", 
     "field4":"val4" 
    } 
} 

这里是链接到文档 http://noamt.github.io/elasticsearch-grails-plugin/docs/index.html#searchableComponentReference