Index: src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (revision 1586254) +++ src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (working copy) @@ -163,6 +163,13 @@ private final NodeAggregator aggregator; + private volatile static CachedReader LAST_READER; + + static class CachedReader { + NodeState indexRoot; + IndexReader reader; + } + public LuceneIndex(Analyzer analyzer, NodeAggregator aggregator) { this.analyzer = analyzer; this.aggregator = aggregator; @@ -267,6 +274,18 @@ return false; } + + private static NodeState getIndexNodeState(NodeState root) { + NodeState def = getIndexDef(root); + if (def == null) { + return null; + } + String type = def.getString(PERSISTENCE_NAME); + if (type == null || PERSISTENCE_OAK.equalsIgnoreCase(type)) { + return getIndexDataNode(def); + } + return null; + } private static Directory newDirectory(NodeState root) { NodeState def = getIndexDef(root); @@ -354,15 +373,35 @@ // we only restrict non-full-text conditions if there is // no relative property in the full-text constraint boolean nonFullTextConstraints = parent.isEmpty(); - Directory directory = newDirectory(root); + NodeState indexRoot = getIndexNodeState(root); + CachedReader cached = LAST_READER; + IndexReader reader = null; + if (cached != null) { + if (cached.indexRoot.equals(indexRoot)) { + reader = cached.reader; + } else { + LAST_READER = null; + } + } QueryEngineSettings settings = filter.getQueryEngineSettings(); - if (directory == null) { - return newPathCursor(Collections. emptySet(), settings); + Directory directory = null; + if (reader == null) { + directory = newDirectory(root); + if (directory == null) { + return newPathCursor(Collections. emptySet(), settings); + } } long s = System.currentTimeMillis(); try { try { - IndexReader reader = DirectoryReader.open(directory); + if (reader == null) { + reader = DirectoryReader.open(directory); + CachedReader cache = new CachedReader(); + cache.indexRoot = indexRoot; + cache.reader = reader; + LAST_READER = cache; +System.out.println("open new reader"); + } try { IndexSearcher searcher = new IndexSearcher(reader); List rows = new ArrayList(); @@ -412,10 +451,10 @@ System.currentTimeMillis() - s); return new LucenePathCursor(rows, settings); } finally { - reader.close(); + // reader.close(); } } finally { - directory.close(); + // directory.close(); } } catch (IOException e) { LOG.warn("query via {} failed.", this, e);