2

Я пытаюсь использовать ElasticSearch 1.0.0.2 в Grails 3.1.6.unmarshalling класс домена ошибка в упругом поиске Grails

Класс домена:

class Post { 

String content 
Date dateCreated 

static belongsTo = [user: User] 

static hasMany = [tags: Tag] 

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

Я впрыскивается ElasticSearchService в моем SearchController и пытаюсь получить результаты поиска как:

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: сохраняются только идентификатор и тип экземпляров. Когда документ извлекается из индекса, плагин автоматически перестраивает ассоциацию из индексов, используя сохраненный идентификатор.

Пример

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