Package com.easydesk.lucene
package com.easydesk.lucene
easydesk-spring-lucene
기존 Avalon / Turbine Fulcrum 기반 lucene (com.nannet.fulcrum.lucene) component 를
Spring + Lucene 10.5.2 로 옮긴 module 이다. OM document builder 는 easydesk-spring-lucene-om 에 있다.
Lucene 10 은 Java 21 이상에서 실행된다. (compile 은 project 설정대로
release 17)
사용
java
@Configuration
@Import(LuceneConfig.class) // OM index 까지 사용하면 LuceneOmConfig
public class AppConfig { }
| 주입 type | bean |
|---|---|
SearchService | LuceneSearchService (index/search/commit/optimize/backup) |
Searchable, LocalSearchable, Indexer | DefaultSearchClient (@Primary) |
설정 (기존 componentConfiguration.xml <lucene> 대체)
| property | 기본값 | 기존 설정 |
|---|---|---|
easydesk.lucene.index-location | lucene | <indexLocation> |
easydesk.lucene.analyzer | com.easydesk.lucene.analyzer.CJKAnalyzer | <analyzer> |
easydesk.lucene.commit-period | 60000 (msec) | <sleepPeriod> |
easydesk.lucene.ram-buffer-size-mb | 16 | - |
easydesk.lucene.recreate-incompatible-index | false | - |
easydesk.lucene.slow-search-threshold | 50 (msec) | - |
<version> 은 없어졌다. (Lucene 10 Analyzer 는 Version 을 받지 않는다.)
<serverName>, <serverPort> (RMI remote mode) 는 제거되었다.
기존 구조와 달라진 점
| 기존 (Avalon, Lucene 4.1) | 현재 (Spring, Lucene 10.5.2) |
|---|---|
Configurable / Initializable / Disposable | 생성자 + @PostConstruct / @PreDestroy |
ServiceManager.lookup(SearchService.ROLE) | 생성자 주입 |
| MMapDirectory + RAMDirectory + Flusher(0.5s) / Worker(60s) thread | location 별 IndexWriter + near-real-time SearcherManager, @Scheduled commit |
Filter / ChainedFilter (module filter) | BooleanClause.Occur.FILTER + LongField.newSetQuery |
BitVector moduleFilter (easydesk-math) | java.util.BitSet moduleFilter (null = 제한 없음, 비어 있음 = 결과 없음) |
Collector (Lucene 4) | SimpleCollector + CollectorManager |
NumericRangeQuery / IntField / LongField | Lucene 10 IntField / LongField (point + doc values) |
| JFlex 1.6 grammar (Unicode 6.1) | Lucene 10.5.2 StandardTokenizerImpl.jflex (Unicode 12.1, Emoji) + MathJax $...$ rule, JFlex 1.9.1 |
addDocument 시 unique term 이 document 에 없으면 삭제 실패 | IndexWriter.updateDocument(term, doc), document 가 null 이면 삭제 |
| RMI Remote Server / Client | 제거 (Lucene 6 에서 RMI 지원 제거, Lucene Document 는 Serializable 이 아님) |
Index 호환성
Lucene 10 은 Lucene 9.0 이후에 만든 index 만 읽을 수 있다. 기존 Lucene 4.x index 는 열리지 않으므로
re-index 가 필요하다. 기존 index 가 남아 있으면 기동 시 ERROR log 를 남기고 그 location 은 건너뛴다.
easydesk.lucene.recreate-incompatible-index=true 로 두면 해당 location 의 이전 index file 을 지우고 빈 index 를 만든다.
TODO :
Index Server 를 분리할 경우 처리 ( 4.1 시절에는 RMI 로 Service-Client 를 분리 했으나 RemoteSearchable 지원은 종료됨, REST-API 적용 ?? )
-
ClassDescription같은 JVM 의
SearchService를 사용하는 client.Index 대상 객체.Index 할 때와 검색할 때 공통으로 사용하는 field 이름과 상수.Index 를 진행한다.Index 오류OM index location 규칙. index 하는 쪽 (com.easydesk.lucene.om.LocationFactory) 과 검색하는 쪽 (Searchable.search(..., path)) 이 같은 규칙을 사용하여야 한다.Local (같은 JVM) Lucene Text Search Engine 을 사용한다.Spring 기반 Lucene Search Service.도메인 객체 (OM) 를 index 한다.Lucene Text Search Engine 을 사용한다.Lucene Search Engine (server 용)