Here is the simplified code that causes problem (Lock obtain timed out).
MyIndexer is used for indexing and searching. IndexTest starts 5 threads for
indexing and 100 threads for searching.

MyIndexer.java
public class MyIndexer
{
    File m_IndexFile;
    IndexReader m_IndexReader;
    Directory m_Directory;
    Searcher m_Searcher;
    Analyzer m_Analyzer;
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public MyIndexer(File a_IndexFile) throws IOException
    {
        m_IndexFile = a_IndexFile;
        m_Analyzer = new StandardAnalyzer();
        m_Directory = FSDirectory.getDirectory(m_IndexFile, false);
        m_IndexReader = IndexReader.open(m_Directory);
        m_Searcher = new IndexSearcher(m_IndexReader);
    }

    public void addAndIndex(String a_Name) throws IOException
    {
        // lock.writeLock().lock();
        try
        {
            IndexWriter indexWriter = new IndexWriter(m_Directory,
m_Analyzer,
                    false);
            Document doc = new Document();
            doc.add(new Field("name", a_Name, Field.Store.YES,
                    Field.Index.TOKENIZED));
            indexWriter.addDocument(doc);
            indexWriter.optimize();
            indexWriter.close();
        }
        finally
        {
            // lock.writeLock().unlock();
        }
    }

    public Hits search(String a_Query)
    {
        try
        {
            // lock.readLock().lock();
            Query query = new QueryParser("name",
m_Analyzer).parse(a_Query);
            Hits hits = m_Searcher.search(query);
            return hits;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // lock.readLock().unlock();
        }
        return null;
    }
}

IndexTest.java
public class IndexTest extends Thread
{
    private boolean m_DoIndex = true;
    static MyIndexer m_IndexEntity;

    public IndexTest(boolean a_DoIndex)
    {
        m_DoIndex = a_DoIndex;
    }

    public static void main(String[] args) throws Exception
    {
        m_IndexEntity = new MyIndexer(new File(
                "C:/mytest/myindex"));

        for (int i = 0; i < 5; i++)
        {
            new IndexTest(true).start();
        }

        for (int i = 0; i < 100; i++)
        {
            new IndexTest(false).start();
        }

    }

    @Override
    public void run()
    {
        for (int i = 0; i < 50; i++)
        {
            try
            {
                if (m_DoIndex)
                {
                    String name = "Nick" + i;

                    System.out.println("Add and Indexing...");
                    m_IndexEntity.addAndIndex(name);
                    Thread.sleep(100);
                }
                else
                {
                    System.out.println("Searching...");
                    m_IndexEntity.search("name:Nick" + i);
                    Thread.sleep(20);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

-- 
View this message in context: 
http://www.nabble.com/modify-existing-non-indexed-field-tf1905726.html#a5249234
Sent from the Lucene - Java Users forum at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to