Общий индекс компаса /Lucene в магазине JDBC
Используя поисковый плагин в Grails (который использует Compass/Lucene под капотом), мы пытаемся разделить поисковый индекс между двумя различными веб-приложениями. Одно приложение получает доступ к данным только для чтения. Другое приложение позволяет изменять данные и отвечает за обновление индекса при любых изменениях или полное повторное индексирование по требованию.
Для хранения индекса мы используем JDBC Store (оба приложения указывают на одну и ту же БД) 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?
- Можно ли вообще отключить кеширование?
1 ответ
Очистка всех кэшей перед поиском, кажется, решает проблему...
searchableService.compass.compass.searchEngineFactory.indexManager.clearCache()