2012-05-30 2 views
2

Используя плагин для поиска в Grails (который использует Compass/Lucene под капотом), мы пытаемся разделить индекс поиска между двумя различными веб-приложениями. Одно приложение обращается к данным только в режиме «только для чтения». Другое приложение позволяет изменять данные и отвечает за обновление индекса при любом изменении или полный переиндекс по требованию.Общий компас/индекс Lucene в магазине JDBC

Чтобы сохранить индекс, мы используем 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 и плагином для поиска?
  • Можно ли отбросить данные, хранящиеся в памяти компаса/Lucene?
  • Можно ли вообще отключить кеширование?

ответ

1

Очистка всех кэшей перед поиском, кажется, решить проблему ...

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

Очистка кэшей перед поиск предотвращает кэши делать свою работу. –

Смежные вопросы