grails - JDBC存储中的共享Compass/Lucene索引

标签 grails jdbc lucene searchable compass-lucene

使用Grails中的可搜索插件(在后台使用Compass / Lucene),我们试图在两个不同的Web应用程序之间共享搜索索引。一个应用程序仅以只读方式访问数据。另一个应用程序允许修改数据,并负责在发生任何更改时更新索引或按需进行完全重新索引。

为了存储索引,我们使用JDBC Store(两个应用程序都指向同一个DB)http://www.compass-project.org/docs/latest/reference/html/core-connection.html

不幸的是,当我们在一个应用程序中重建整个索引时,另一个应用程序似乎已缓存了无效的数据,并且如果执行搜索,则会引发异常:

| Error 2012-05-30 09:22:07,560 [http-bio-8080-exec-8] ERROR errors.GrailsExceptionResolver  - IndexOutOfBoundsException occurred when processing request: [POST] /search
Index: 45, Size: 13. Stacktrace follows:
Message: Index: 45, Size: 13
   Line | Method
->> 547 | RangeCheck  in java.util.ArrayList
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   322 | get         in     ''
|   265 | fieldInfo . in org.apache.lucene.index.FieldInfos
|   254 | fieldName   in     ''
|    86 | read . . .  in org.apache.lucene.index.TermBuffer
|   127 | next        in org.apache.lucene.index.SegmentTermEnum
|   158 | scanTo . .  in     ''
|   271 | get         in org.apache.lucene.index.TermInfosReader
|   332 | terms . . . in     ''
|   717 | terms       in org.apache.lucene.index.SegmentReader
|    93 | generate .  in org.apache.lucene.search.PrefixGenerator
|    58 | getDocIdSet in org.apache.lucene.search.PrefixFilter
|   116 | <init> . .  in org.apache.lucene.search.ConstantScoreQuery$ConstantScorer
|    81 | scorer      in org.apache.lucene.search.ConstantScoreQuery$ConstantWeight
|   230 | scorer . .  in org.apache.lucene.search.BooleanQuery$BooleanWeight
|   131 | search      in org.apache.lucene.search.IndexSearcher
|   112 | search . .  in     ''
|   204 | search      in org.apache.lucene.search.MultiSearcher
|   113 | getMoreDocs in org.apache.lucene.search.Hits
|    90 | <init>      in     ''
|    61 | search . .  in org.apache.lucene.search.Searcher
|   146 | findByQuery in org.compass.core.lucene.engine.transaction.support.AbstractTransactionProcessor
|   259 | doFind . .  in org.compass.core.lucene.engine.transaction.readcommitted.ReadCommittedTransactionProcessor
|   246 | find        in org.compass.core.lucene.engine.transaction.support.AbstractConcurrentTransactionProcessor
|   352 | find . . .  in org.compass.core.lucene.engine.LuceneSearchEngine
|   188 | hits        in org.compass.core.lucene.engine.LuceneSearchEngineQuery
|   199 | hits . . .  in org.compass.core.impl.DefaultCompassQuery
|   104 | doInCompass in grails.plugin.searchable.internal.compass.search.DefaultSearchMethod$SearchCompassCallback
|   133 | execute . . in org.compass.core.CompassTemplate
|    57 | doInCompass in grails.plugin.searchable.internal.compass.support.AbstractSearchableMethod
|    66 | invoke . .  in grails.plugin.searchable.internal.compass.search.DefaultSearchMethod
|    37 | search      in grails.plugin.searchable.SearchableService

我们可以传达这样的事实:将索引从一个应用程序重建到另一个应用程序,以便可以执行一些清理工作。
  • 是否有人对Grails和Searchable插件有类似的问题?
  • 是否可以丢弃Compass / Lucene缓存的数据?
  • 是否可以一般禁用缓存?
  • 最佳答案

    在搜索之前清除所有缓存似乎可以解决问题...

    searchableService.compass.compass.searchEngineFactory.indexManager.clearCache()
    

    关于grails - JDBC存储中的共享Compass/Lucene索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10813021/

    相关文章:

    java - Grails 2.3.0 产品 war 错误

    java - 在数据库中查找具有 Java 中 OffsetDateTime 范围的记录

    java - eclipse中struts2 mysql连接错误

    grails - 使用 Grails 的 DDL 查询

    javascript - Grails:更改 img src 的 JS 函数没有响应

    mysql - 从 cascalog 写入 MySQL 不起作用。如何调试这个?

    ruby-on-rails - Solr (Sunspot) 运行,但不会启动

    java - 如何通过对 Infinispan 或 Hibernate Search 的 API 调用为单个项目编制索引?

    lucene - ElasticSearch 映射和相关对象

    grails - 在grails中安装elasticsearch插件时出现NoNodeAvailableException