Я использую lucene для создания оперативных индексов на лету на основе входящих данных, то есть в основном содержимого таблицы, где любая информация представляется в виде документа с дополнительной ссылкой на его метаинформацию, например таблицу / столбец / значение / тип. Это работает довольно хорошо и гибко, но до сих пор мои менеджеры решили расширить функциональность, чтобы искать по всем наборам данных, которые есть в нашей системе, эти наборы данных создаются / обновляются динамически, индекс оперативной памяти, очевидно, больше не может использоваться в как у нас сейчас, потому что у нас просто не хватает памяти в какой-то момент времени.
Каков общий подход к достижению этого в lucene манере без существенных изменений в поисковой системе, которые у нас уже есть.
вот фрагмент кода для создания индекса оперативной памяти
final Analyzer analyzer = new StandardAnalyzer();
final Directory index = new RAMDirectory();
final IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
try (final IndexWriter writer = new IndexWriter(index, config)) {
addTableDocuments(tables, writer);
addColumnDocuments(columns, writer);
addValueDocuments(values, writer);
}
вот фрагмент кода для поиска по индексу
try (final IndexReader reader = DirectoryReader.open(index)) {
final IndexSearcher searcher = new IndexSearcher(reader);
final DuplicateFilter duplicateFilter = new DuplicateFilter(LuceneUtils.LUCENE_DOCUMENT_TITLE);
duplicateFilter.setKeepMode(DuplicateFilter.KeepMode.KM_USE_LAST_OCCURRENCE);
final ScoreDoc[] scoreDocs = searcher.search(query, duplicateFilter, limit).scoreDocs;
final List<Document> documents = new ArrayList<>();
for (ScoreDoc scoreDoc : scoreDocs) {
final int docId = scoreDoc.doc;
final Document document = searcher.doc(docId);
documents.add(document);
}
}