I don't agreed with Michael McCandless. :)
I konw that after 2.3, add and delete can run in one IndexWriter at one
time, and also lucene has a update method which delete documents by term
then add the new document.
In my test, either LockObtainFailedException with thread sleep sentence:
org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out:
[EMAIL PROTECTED]:\index\write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:85)
at
org.apache.lucene.index.DirectoryIndexReader.acquireWriteLock(DirectoryIndexReader.java:298)
at org.apache.lucene.index.IndexReader.deleteDocument(IndexReader.java:750)
at
org.apache.lucene.index.IndexReader.deleteDocuments(IndexReader.java:786)
at org.test.IndexThread.run(IndexThread.java:33)
or StaleReaderException without thread sleep sentence:
org.apache.lucene.index.StaleReaderException: IndexReader out of date and no
longer valid for delete, undelete, or setNorm operations
at
org.apache.lucene.index.DirectoryIndexReader.acquireWriteLock(DirectoryIndexReader.java:308)
at org.apache.lucene.index.IndexReader.deleteDocument(IndexReader.java:750)
at
org.apache.lucene.index.IndexReader.deleteDocuments(IndexReader.java:786)
at org.test.IndexThread.run(IndexThread.java:31)
My test code:
public class Main {
public static void main(String[] args) throws IOException {
Directory directory = FSDirectory.getDirectory("e:/index");
IndexWriter writer = new IndexWriter(directory, null, false);
Document document = new Document();
document.add(new Field("bbb", "bbb", Store.YES, Index.UN_TOKENIZED));
writer.addDocument(document);
Thread t = new IndexThread();
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writer.optimize();
writer.close();
System.out.println("out");
}
}
public class IndexThread extends Thread {
@Override
public void run() {
Directory directory;
try {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
directory = FSDirectory.getDirectory("e:/index");
System.out.println("thread begin");
//IndexWriter reader = new IndexWriter(directory, null, false);
IndexReader reader = IndexReader.open(directory);
Term term = new Term("bbb", "bbb");
reader.deleteDocuments(term);
reader.close();
System.out.println("thread end");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2008/9/4, Michael McCandless <[EMAIL PROTECTED]>:
>
>
> Actually, as of 2.3, this is no longer true: merges and optimizing run in
> the background, and allow add/update/delete documents to run at the same
> time.
>
> I think it's probably best to use application logic (outside of Lucene) to
> keep track of what updates happened to the master while the slave was
> optimizing.
>
> Mike
>
> 叶双明 wrote:
>
> No documents can added into index when the index is optimizing, or
>> optimizing can't run durling documents adding to the index.
>> So, without other error, I think we can beleive the two index are indeed
>> the
>> same.
>>
>> :)
>>
>> 2008/9/4 Noble Paul നോബിള് नोब्ळ् <[EMAIL PROTECTED]>
>>
>> The use case is as follows
>>>
>>> I have two indexes . One at the master and one at the slave. The user
>>> occasionally keeps committing on the master and the delta is
>>> replicated everytime. But when the optimize happens the transfer size
>>> can be really large. So I am thinking of doing the optimize
>>> separately on master and slave .
>>>
>>> So far, so good. But how can I really know that after the optimize the
>>> indexes are indeed the same or no documents got added in between.?
>>>
>>>
>>>
>>> On Fri, Aug 29, 2008 at 3:13 PM, Karl Wettin <[EMAIL PROTECTED]>
>>> wrote:
>>>
>>>>
>>>> 29 aug 2008 kl. 11.35 skrev Noble Paul നോബിള് नोब्ळ्:
>>>>
>>>> hi,
>>>>> I wish to know if the contents of two indexes have same data.
>>>>> will all the files be exactly same if I put same set of documents to
>>>>>
>>>> both?
>>>
>>>>
>>>> If you insert the documents in the same order with the same settings and
>>>> both indices are optimized, then the files ought to be identitical. I'm
>>>> however not sure.
>>>>
>>>> The instantiated index contrib module contains a test that assert two
>>>>
>>> index
>>>
>>>> readers are identical. You could use this to be really sure, but it it a
>>>> rather long running process for a large index:
>>>>
>>>>
>>>>
>>> http://svn.apache.org/repos/asf/lucene/java/trunk/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestIndicesEquals.java
>>>
>>>>
>>>>
>>>> Perhaps you should explain why you need to do this.
>>>>
>>>>
>>>> karl
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> --Noble Paul
>>>
>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>