You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/09/22 17:43:30 UTC
svn commit: r697873 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/query/lucene/
test/java/org/apache/jackrabbit/core/query/
test/java/org/apache/jackrabbit/core/query/lucene/
test/repository/workspaces/indexing-test/
Author: mreutegg
Date: Mon Sep 22 08:43:29 2008
New Revision: 697873
URL: http://svn.apache.org/viewvc?rev=697873&view=rev
Log:
JCR-1745: Mark pending nodes in IndexingQueue directly in index
Added:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java (with props)
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueue.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractIndexingTest.java
jackrabbit/trunk/jackrabbit-core/src/test/repository/workspaces/indexing-test/workspace.xml
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java Mon Sep 22 08:43:29 2008
@@ -154,9 +154,8 @@
* in the constructor.
*
* @return the directory instance passed in the constructor
- * @throws IOException
*/
- Directory getDirectory() throws IOException {
+ Directory getDirectory() {
return directory;
}
@@ -448,6 +447,9 @@
private Document getFinishedDocument(Document doc) throws IOException {
if (!Util.isDocumentReady(doc)) {
Document copy = new Document();
+ // mark the document that reindexing is required
+ copy.add(new Field(FieldNames.REINDEXING_REQUIRED, "",
+ Field.Store.NO, Field.Index.NO_NORMS));
Iterator fields = doc.getFields().iterator();
while (fields.hasNext()) {
Fieldable f = (Fieldable) fields.next();
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/FieldNames.java Mon Sep 22 08:43:29 2008
@@ -101,6 +101,12 @@
public static final String PROPERTY_LENGTHS = "_:PROPERTY_LENGTHS".intern();
/**
+ * Name of the field that marks nodes that require reindexing because the
+ * text extraction process timed out. See also {@link IndexingQueue}.
+ */
+ public static final String REINDEXING_REQUIRED = "_:REINDEXING_REQUIRED".intern();
+
+ /**
* Returns a named length for use as a term in the index. The named length
* is of the form: <code>propertyName</code> + '[' +
* {@link LongField#longToString(long)}.
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueue.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueue.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueue.java Mon Sep 22 08:43:29 2008
@@ -26,6 +26,8 @@
import org.apache.jackrabbit.core.NodeId;
import org.apache.jackrabbit.uuid.UUID;
import org.apache.lucene.document.Document;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,28 +73,42 @@
* Initializes the indexing queue.
*
* @param index the multi index this indexing queue belongs to.
+ * @throws IOException if an error occurs while reading from the index.
*/
- void initialize(MultiIndex index) {
+ void initialize(MultiIndex index) throws IOException {
if (initialized) {
throw new IllegalStateException("already initialized");
}
+ // check index for nodes that need to be reindexed
+ CachingMultiIndexReader reader = index.getIndexReader();
+ try {
+ TermDocs tDocs = reader.termDocs(
+ new Term(FieldNames.REINDEXING_REQUIRED, ""));
+ try {
+ while (tDocs.next()) {
+ queueStore.addUUID(reader.document(tDocs.doc(),
+ FieldSelectors.UUID).get(FieldNames.UUID));
+ }
+ } finally {
+ tDocs.close();
+ }
+ } finally {
+ reader.release();
+ }
String[] uuids = queueStore.getPending();
for (int i = 0; i < uuids.length; i++) {
try {
UUID uuid = UUID.fromString(uuids[i]);
Document doc = index.createDocument(new NodeId(uuid));
pendingDocuments.put(uuids[i], doc);
+ log.debug("added node {}. New size of indexing queue: {}",
+ uuid, new Integer(pendingDocuments.size()));
} catch (IllegalArgumentException e) {
log.warn("Invalid UUID in indexing queue store: " + uuids[i]);
} catch (RepositoryException e) {
// node does not exist anymore
log.debug("Node with uuid {} does not exist anymore", uuids[i]);
- try {
- queueStore.removeUUID(uuids[i]);
- } catch (IOException ex) {
- log.warn("Unable to remove node {} from indexing queue",
- uuids[i], ex);
- }
+ queueStore.removeUUID(uuids[i]);
}
}
initialized = true;
@@ -128,10 +144,8 @@
* @return the document for the given <code>uuid</code> or <code>null</code>
* if this queue does not contain a document with the given
* <code>uuid</code>.
- * @throws IOException if an error occurs removing the document from the
- * queue.
*/
- public synchronized Document removeDocument(String uuid) throws IOException {
+ public synchronized Document removeDocument(String uuid) {
checkInitialized();
Document doc = (Document) pendingDocuments.remove(uuid);
if (doc != null) {
@@ -149,10 +163,8 @@
* @return an existing document in the queue with the same uuid as the one
* in <code>doc</code> or <code>null</code> if there was no such
* document.
- * @throws IOException an error occurs while adding the document to this
- * queue.
*/
- public synchronized Document addDocument(Document doc) throws IOException {
+ public synchronized Document addDocument(Document doc) {
checkInitialized();
String uuid = doc.get(FieldNames.UUID);
Document existing = (Document) pendingDocuments.put(uuid, doc);
@@ -168,10 +180,8 @@
/**
* Closes this indexing queue and disposes all pending documents.
- *
- * @throws IOException if an error occurs while closing this queue.
*/
- public synchronized void close() throws IOException {
+ public synchronized void close() {
checkInitialized();
// go through pending documents and close readers
Iterator it = pendingDocuments.values().iterator();
@@ -184,17 +194,6 @@
}
/**
- * Commits any pending changes to this queue store to disk.
- *
- * @throws IOException if an error occurs while writing pending changes to
- * disk.
- */
- public synchronized void commit() throws IOException {
- checkInitialized();
- queueStore.commit();
- }
-
- /**
* Checks if this indexing queue is initialized and otherwise throws a
* {@link IllegalStateException}.
*/
@@ -203,4 +202,15 @@
throw new IllegalStateException("not initialized");
}
}
+
+ //----------------------------< testing only >------------------------------
+
+ /**
+ * <b>This method is for testing only!</b>
+ *
+ * @return the number of the currently pending documents.
+ */
+ synchronized int getNumPendingDocuments() {
+ return pendingDocuments.size();
+ }
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueStore.java Mon Sep 22 08:43:29 2008
@@ -18,7 +18,6 @@
import org.apache.jackrabbit.core.fs.FileSystem;
import org.apache.jackrabbit.core.fs.FileSystemException;
-import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
@@ -26,15 +25,15 @@
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.io.BufferedOutputStream;
import java.util.Set;
import java.util.HashSet;
/**
- * <code>IndexingQueueStore</code> implements the persistent store to keep
- * track of pending document in an indexing queue.
+ * <code>IndexingQueueStore</code> implements a store that keeps the uuids of
+ * nodes that are pending in the indexing queue. Until Jackrabbit 1.4 this store
+ * was also persisted to a {@link FileSystem}. Starting with 1.5 the pending
+ * nodes are marked directly in the index with a special field.
+ * See {@link FieldNames#REINDEXING_REQUIRED}.
*/
class IndexingQueueStore {
@@ -64,7 +63,7 @@
private final Set pending = new HashSet();
/**
- * The file system where to write the pending document UUIDs.
+ * The file system from where to read pending document UUIDs.
*/
private final FileSystem fs;
@@ -74,11 +73,6 @@
private final String fileName;
/**
- * Non-null if we are currently writing to the file.
- */
- private Writer out;
-
- /**
* Creates a new <code>IndexingQueueStore</code> using the given file
* system.
*
@@ -105,10 +99,8 @@
* Adds a <code>uuid</code> to the store.
*
* @param uuid the uuid to add.
- * @throws IOException if an error occurs while writing.
*/
- public void addUUID(String uuid) throws IOException {
- writeEntry(ADD, uuid, getLog());
+ public void addUUID(String uuid) {
pending.add(uuid);
}
@@ -116,46 +108,26 @@
* Removes a <code>uuid</code> from the store.
*
* @param uuid the uuid to add.
- * @throws IOException if an error occurs while writing.
*/
- public void removeUUID(String uuid) throws IOException {
- writeEntry(REMOVE, uuid, getLog());
+ public void removeUUID(String uuid) {
pending.remove(uuid);
}
/**
- * Commits the pending changes to the file.
- *
- * @throws IOException if an error occurs while writing.
+ * Closes this queue store.
*/
- public void commit() throws IOException {
- if (out != null) {
- out.flush();
- if (pending.size() == 0) {
- out.close();
- out = null;
- // truncate log
- try {
- fs.getOutputStream(fileName).close();
- } catch (FileSystemException e) {
- // ignore
+ public void close() {
+ if (pending.isEmpty()) {
+ try {
+ if (fs.exists(fileName)) {
+ fs.deleteFile(fileName);
}
+ } catch (FileSystemException e) {
+ log.warn("unable to delete " + fileName);
}
}
}
- /**
- * Flushes and closes this queue store.
- *
- * @throws IOException if an error occurs while writing.
- */
- public void close() throws IOException {
- commit();
- if (out != null) {
- out.close();
- }
- }
-
//----------------------------< internal >----------------------------------
/**
@@ -198,50 +170,4 @@
}
}
}
-
- /**
- * Writes an entry to the log file.
- *
- * @param op the operation. Either {@link #ADD} or {@link #REMOVE}.
- * @param uuid the uuid of the added or removed node.
- * @param writer the writer where the entry is written to.
- * @throws IOException if an error occurs when writing the entry.
- */
- private static void writeEntry(String op, String uuid, Writer writer) throws IOException {
- StringBuffer buf = new StringBuffer(op);
- buf.append(' ').append(uuid).append('\n');
- writer.write(buf.toString());
- }
-
- /**
- * Returns the writer to the log file.
- *
- * @return the writer to the log file.
- * @throws IOException if an error occurs while opening the log file.
- */
- private Writer getLog() throws IOException {
- if (out == null) {
- // open file
- try {
- long len = 0;
- if (fs.exists(fileName)) {
- len = fs.length(fileName);
- }
- RandomAccessOutputStream raos
- = fs.getRandomAccessOutputStream(fileName);
- raos.seek(len);
- // use buffering
- out = new OutputStreamWriter(
- new BufferedOutputStream(raos, 1024),
- ENCODING);
- } catch (FileSystemException e) {
- if (out != null) {
- out.close();
- out = null;
- }
- throw Util.createIOException(e);
- }
- }
- return out;
- }
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Mon Sep 22 08:43:29 2008
@@ -768,11 +768,7 @@
}
// finally close indexing queue
- try {
- indexingQueue.close();
- } catch (IOException e) {
- log.error("Exception while closing search index.", e);
- }
+ indexingQueue.close();
}
}
@@ -981,8 +977,6 @@
// after a crash.
if (a.getType() == Action.TYPE_COMMIT || a.getType() == Action.TYPE_ADD_INDEX) {
redoLog.flush();
- // also flush indexing queue
- indexingQueue.commit();
}
return a;
}
@@ -1198,11 +1192,7 @@
// remove documents from the queue
Iterator it = finished.keySet().iterator();
while (it.hasNext()) {
- try {
- indexingQueue.removeDocument(it.next().toString());
- } catch (IOException e) {
- log.error("Failed to remove node from indexing queue", e);
- }
+ indexingQueue.removeDocument(it.next().toString());
}
try {
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractIndexingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractIndexingTest.java?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractIndexingTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractIndexingTest.java Mon Sep 22 08:43:29 2008
@@ -43,4 +43,11 @@
testRootNode = null;
super.tearDown();
}
+
+ /**
+ * @return the query handler inside the {@link #qm query manager}.
+ */
+ protected QueryHandler getQueryHandler() {
+ return ((QueryManagerImpl) qm).getQueryHandler();
+ }
}
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java?rev=697873&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java Mon Sep 22 08:43:29 2008
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.lucene;
+
+import org.apache.jackrabbit.extractor.TextExtractor;
+import org.apache.jackrabbit.core.query.AbstractIndexingTest;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.query.Query;
+import java.io.Reader;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.ByteArrayInputStream;
+import java.util.Calendar;
+
+/**
+ * <code>IndexingQueueTest</code> checks if the indexing queue properly indexes
+ * nodes in a background thread when text extraction takes more than 100 ms.
+ */
+public class IndexingQueueTest extends AbstractIndexingTest {
+
+ private static final String CONTENT_TYPE = "application/indexing-queue-test";
+
+ private static final String ENCODING = "UTF-8";
+
+ public void testQueue() throws Exception {
+ SearchIndex index = (SearchIndex) getQueryHandler();
+ IndexingQueue queue = index.getIndex().getIndexingQueue();
+
+ assertEquals(0, queue.getNumPendingDocuments());
+
+ String text = "the quick brown fox jumps over the lazy dog.";
+ InputStream in = new ByteArrayInputStream(text.getBytes(ENCODING));
+ Node resource = testRootNode.addNode(nodeName1, "nt:resource");
+ resource.setProperty("jcr:data", in);
+ resource.setProperty("jcr:lastModified", Calendar.getInstance());
+ resource.setProperty("jcr:mimeType", CONTENT_TYPE);
+ resource.setProperty("jcr:encoding", ENCODING);
+ session.save();
+
+ assertEquals(1, queue.getNumPendingDocuments());
+
+ Query q = qm.createQuery(testPath + "/*[jcr:contains(., 'fox')]", Query.XPATH);
+ NodeIterator nodes = q.execute().getNodes();
+ assertFalse(nodes.hasNext());
+
+ while (queue.getNumPendingDocuments() > 0) {
+ Thread.sleep(50);
+ }
+
+ q = qm.createQuery(testPath + "/*[jcr:contains(., 'fox')]", Query.XPATH);
+ nodes = q.execute().getNodes();
+ assertTrue(nodes.hasNext());
+ }
+
+ public static final class Extractor implements TextExtractor {
+
+ public String[] getContentTypes() {
+ return new String[]{CONTENT_TYPE};
+ }
+
+ public Reader extractText(InputStream stream, String type, String encoding)
+ throws IOException {
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ throw new IOException();
+ }
+ return new InputStreamReader(stream, encoding);
+ }
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingQueueTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java?rev=697873&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java Mon Sep 22 08:43:29 2008
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.lucene;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Test suite that includes all testcases for the Search module.
+ */
+public class TestAll extends TestCase {
+
+ /**
+ * Returns a <code>Test</code> suite that executes all tests inside this
+ * package.
+ *
+ * @return a <code>Test</code> suite that executes all tests inside this
+ * package.
+ */
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Search tests");
+
+ suite.addTestSuite(IndexingQueueTest.class);
+
+ return suite;
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/TestAll.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/test/repository/workspaces/indexing-test/workspace.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/repository/workspaces/indexing-test/workspace.xml?rev=697873&r1=697872&r2=697873&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/repository/workspaces/indexing-test/workspace.xml (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/repository/workspaces/indexing-test/workspace.xml Mon Sep 22 08:43:29 2008
@@ -39,6 +39,8 @@
<param name="indexingConfiguration" value="${wsp.home}/indexing-configuration.xml"/>
<param name="supportHighlighting" value="true"/>
<param name="excerptProviderClass" value="org.apache.jackrabbit.core.query.lucene.WeightedHTMLExcerpt"/>
+ <param name="textFilterClasses" value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.core.query.lucene.IndexingQueueTest$Extractor"/>
+ <param name="extractorPoolSize" value="2"/>
</SearchIndex>
</Workspace>