grails - Grails可搜索插件-没有列出要索引的实体

标签 grails lucene grails-plugin searchable

我在Grails 2.2.3应用程序中使用了Searchable Plugin 0.6.4,但是遇到一个奇怪的错误。错误提示:GrailsContextLoader Error initializing the application: No entities listed to be indexed, have you defined your entities correctly?
我只列出了要索引的一类。下面是该类(简化了一点):

class Incident {

    String howReceived
    Date timeOfCall
    Date timeOfArrival

    User reportingOfficer

    static searchable = [ except: ['version', 'dateCreated', 'lastUpdated'] ]

    static embedded = [ 'witnesses' ]
    static hasMany = [ witnesses: Witness ]

    static mapping = {
        datasource 'police'
        table 'incidents'
    }
}

这就是我所拥有的,一个简单的映射。下面,我还包括了我打开的堆栈跟踪和调试语句。

编辑:出于某种原因,看来sessionFactory bean在DefaultHibernateEntitiesLocator类中找不到任何类元数据。所以...
Map allClassMetaData = sessionFactory.getAllClassMetadata();
assert allClassMetaData == null

不知道为什么或该信息有帮助。

调试
searchable.SearchableGrailsPlugin Not found: Searchable
searchable.SearchableGrailsPlugin Trying to load config from 'SearchableConfiguration.class'
searchable.SearchableGrailsPlugin Not found: SearchableConfiguration
searchable.SearchableGrailsPlugin Defining Compass and Compass::GPS beans
searchable.SearchableGrailsPlugin Done defining Compass and Compass::GPS beans
spring.DefaultSearchableCompassFactoryBean Building SearchableCompassFactoryBean with grailsApplication [org.codehaus.groovy.grails.commons.DefaultGrailsApplication@10fdea05] and compassClassMappingXmlBuilder [grails.plugin.searchable.internal.compass.mapping.DefaultSearchableCompassClassMappingXmlBuilder@e0ef6fa]
spring.SearchableCompassFactoryBean Building new Compass
config.EnvironmentSearchableCompassConfigurator Setting Compass connection to [/Users/grantmcconnaughey/.grails/projects/campus-police/searchable-index/development]
config.DefaultGrailsDomainClassMappingSearchableCompassConfigurator Mapping class [com.company.police.Incident] with strategy [searchable class property]
config.DefaultGrailsDomainClassMappingSearchableCompassConfigurator No mapping strategy found for class [com.company.police.Employee]: assuming this class is not searchable
mapping.SearchableGrailsDomainClassCompassMappingUtils Mapping [Incident.howReceived]
mapping.SearchableGrailsDomainClassCompassMappingUtils Mapping [Incident.id]
mapping.SearchableGrailsDomainClassCompassMappingUtils Mapping [Incident.timeOfArrival]
mapping.SearchableGrailsDomainClassCompassMappingUtils Mapping [Incident.timeOfCall]
mapping.DefaultSearchableCompassClassMappingXmlBuilder Building Compass mapping XML for [com.company.police.Incident] from description [CompassClassMapping: mappedClass=[class com.company.police.Incident],  mappedClassSuperClass=[null], alias=[Incident], spellCheck=[null], subIndex=[null], root=[true], poly=[false], extend=[null], propertyMappings=[[CompassClassPropertyMapping: type=[property], propertyName=[domestic], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[hateCrime], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[howReceived], attributes=[{}], CompassClassPropertyMapping: type=[id], propertyName=[id], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[occurredFrom], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[occurredTo], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[officerAssaulted], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[officerKilled], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[readyForSignature], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[reportNumber], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[timeOfArrival], attributes=[{}], CompassClassPropertyMapping: type=[property], propertyName=[timeOfCall], attributes=[{}]]]]
mapping.DefaultSearchableCompassClassMappingXmlBuilder Mapping Searchable Property 'com.company.police.Incident.howReceived' with property attributes [name:howReceived] and meta-data [howReceived:[:]]
mapping.DefaultSearchableCompassClassMappingXmlBuilder Mapping Searchable Property 'com.company.police.Incident.timeOfArrival' with property attributes [name:timeOfArrival] and meta-data [timeOfArrival:[:]]
mapping.DefaultSearchableCompassClassMappingXmlBuilder Mapping Searchable Property 'com.company.police.Incident.timeOfCall' with property attributes [name:timeOfCall] and meta-data [timeOfCall:[:]]
mapping.DefaultSearchableCompassClassMappingXmlBuilder com.company.police.Incident xml [<?xml version="1.0"?>
<!DOCTYPE compass-core-mapping PUBLIC 
    "-//Compass/Compass Core Mapping DTD 2.0//EN"
    "http://www.compass-project.org/dtd/compass-core-mapping-2.2.dtd">
<compass-core-mapping>
  <class name='com.company.police.Incident' alias='Incident' root='true' poly='false' support-unmarshall='true'>
    <id name='id' />
    <property name='howReceived'>
      <meta-data>howReceived</meta-data>
    </property>
    <property name='timeOfArrival'>
      <meta-data>timeOfArrival</meta-data>
    </property>
    <property name='timeOfCall'>
      <meta-data>timeOfCall</meta-data>
    </property>
  </class>
</compass-core-mapping>]
mapping.SearchableClassPropertySearchableGrailsDomainClassMappingConfigurator Adding [com.company.police.Incident] mapping to CompassConfiguration
spring.SearchableCompassFactoryBean Done building Compass
domain.DynamicDomainMethodUtils Adding searchable methods to [com.company.police.Incident]
searchable.SearchableGrailsPlugin Started Compass::GPS
compass.CompassGpsUtils Starting Searchable Plugin bulk index

Stacktrace
context.GrailsContextLoader Error initializing the application: No entities listed to be indexed, have you defined your entities correctly?
java.lang.IllegalArgumentException: No entities listed to be indexed, have you defined your entities correctly?
    at org.compass.gps.device.support.parallel.ConcurrentParallelIndexExecutor.performIndex(ConcurrentParallelIndexExecutor.java:88)
    at org.compass.gps.device.support.parallel.AbstractParallelGpsDevice.index(AbstractParallelGpsDevice.java:119)
    at org.compass.gps.impl.DefaultReplaceIndexCallback.buildIndexIfNeeded(DefaultReplaceIndexCallback.java:42)
    at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager$ReplaceIndexOperationCallback.firstStep(DefaultLuceneSearchEngineIndexManager.java:281)
    at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager.doOperate(DefaultLuceneSearchEngineIndexManager.java:218)
    at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager.doReplaceIndex(DefaultLuceneSearchEngineIndexManager.java:266)
    at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager.replaceIndex(DefaultLuceneSearchEngineIndexManager.java:261)
    at org.compass.gps.impl.SingleCompassGps.doIndex(SingleCompassGps.java:118)
    at org.compass.gps.impl.AbstractCompassGps.index(AbstractCompassGps.java:154)
    at org.compass.gps.impl.AbstractCompassGps.index(AbstractCompassGps.java:128)
    at grails.plugin.searchable.internal.compass.CompassGpsUtils.index(CompassGpsUtils.java:49)

最佳答案

问题是使用具有非默认名称的数据源,在本例中为“police”。我在文档中没有任何地方提到该插件无法与名称不同于“dataSource”的数据源一起使用。我将尝试尽快更新其文档。

我找到了修复here。万一该链接断开,这就是您要做的。将以下内容添加到resources.groovy:

import org.compass.gps.device.hibernate.HibernateGpsDevice
import grails.plugin.searchable.internal.compass.config.SessionFactoryLookup

beans = {
    compassGpsDevice(HibernateGpsDevice) { bean ->
        bean.destroyMethod = "stop"
        name = "hibernate"
        sessionFactory = { SessionFactoryLookup sfl ->
          sessionFactory = ref('sessionFactory_datasourceName') 
        }
        fetchCount = 5000
    }
}

要添加具有可索引类的其他数据源,请添加以下内容:
anotherUniquecompassGpsDevice(HibernateGpsDevice) { bean ->
    bean.destroyMethod = "stop"
    name = "unqiueHibernateName"
    sessionFactory = { SessionFactoryLookup sfl ->
        sessionFactory = ref('sessionFactory_uniquedatasource') 
    }
    fetchCount = 5000
  }

最后添加...
import org.compass.gps.impl.SingleCompassGps

compassGps(SingleCompassGps) {
    compass = ref('compass')
    gpsDevices = [compassGpsDevice, anotherUniqueCompassGpsDevice]
}

关于grails - Grails可搜索插件-没有列出要索引的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21949106/

相关文章:

java - 既然 Lucene 4.1 中不存在 TermEnum,那么如何从 IndexReader 获取字段呢?

java - 如何从Lucene中的TokenStream中删除数字?

java - ElasticSearch - 提高特定领域的分数

grails - 我应该使用哪个版本的Grails?

gwt - 加载 grails gwt 模块 xml 时出错

grails - Grails整体样式

grails - 将Grails Shiro应用程序升级到Spring Security Shiro,绕过@Secured (“permitAll”)

grails - 如何在 Grails 插件中排除 Domain 类的导出?

grails - 如何获取grails中一列的所有数据?

grails - 标签g:include没有将模型正确传递给 View