package lia.analysis.i18n;

import java.io.IOException;

import lia.analysis.AnalyzerUtils;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;


public class KoreanDemo
{
    private static final String FIELD_CONTENT = "content";
    private static final String[] contents = 
    {
        "¿£Áø¹ÚÁö¼º(¸ÇÃ¼½ºÅÍ À¯³ªÀÌÆ¼µå)ÀÌ ÁÖ¸» ÇÁ¸®¹Ì¾î¸®±×¸¦ À§ÇØ º¥Ä¡¸¦ ÁöÅ°¸ç ÀçÃæÀüÀÇ ½Ã°£À» °¡Á³´Ù.", 
        "¹ÚÁö¼º Àº 27ÀÏ »õº®(ÇÑ±¹½Ã°£) È¨ÀÎ ¿Ãµå Æ®·¡Æ÷µå¿¡¼­ ¹ú¾îÁø ¹Ù³Ý°úÀÇ Ä®¸µÄÅ 3¶ó¿îµå °æ±â¿¡ °áÀåÇß´Ù. ±³Ã¼¸â¹ö·Î ÀÌ¸§À» ¿Ã·ÈÁö¸¸ ¸ÇÀ¯ÀÇ ¾Ë·º½º ÆÛ°Å½¼ °¨µ¶Àº ¹ÚÁö¼ºÀ» ¾Æ²¼´Ù.", 
        "ÀÌ³¯ ¸ÇÀ¯´Â ¸®¾Ï ¹Ð·¯, Å°¾î·± ¸®Ã³µå½¼, ÁÖ¼¼Æä ·Î½Ã, ½Ç¹ð ¿¡¹æÅ©½º ºí·¹ÀÌÅ©ÀÇ ¸±·¹ÀÌ ÃàÆ÷·Î 4-1 ½Â¸®¸¦ °ÅµÎ°í 16°­¿¡ ¾ÈÂøÇß´Ù."
    };
    private static final String phrase = "°æ±â";
    private static Analyzer analyzer = null;

    /**
     * DOCUMENT ME!
     * 
     * @param args DOCUMENT ME!
     * @throws IOException DOCUMENT ME!
     * @throws ParseException DOCUMENT ME!
     */
    public static void main(String[] args)
            throws IOException, ParseException
    {
        Directory directory = makeIndex();
        analysis();
        search(directory);
        directory.close();
    }

    /**
     * DOCUMENT ME!
     * 
     * @return DOCUMENT ME! 
     */
    private static Analyzer getAnalyzer()
    {
        if (analyzer == null)
        {
            analyzer = new StandardAnalyzer();
            // analyzer = new CJKAnalyzer();
        }

        return analyzer;
    }

    /**
     * DOCUMENT ME!
     * 
     * @throws IOException DOCUMENT ME!
     */
    private static void analysis()
            throws IOException
    {
        AnalyzerUtils.displayTokens(getAnalyzer(), phrase);
    }

    /**
     * DOCUMENT ME!
     * 
     * @return DOCUMENT ME! 
     * @throws IOException DOCUMENT ME!
     */
    private static Directory makeIndex()
            throws IOException
    {
        Directory directory = new RAMDirectory();
        Analyzer analyzer = getAnalyzer();
        System.out.println(
                "Indexing using " + analyzer.getClass().getName());
        IndexWriter writer = new IndexWriter(directory, analyzer, 
                                             true);
        for (int i = 0; i < contents.length; i++)
        {
            Document doc = new Document();
            doc.add(new Field(FIELD_CONTENT, contents[i], true, true, 
                              true));
            writer.addDocument(doc);
        }

        writer.close();
        return directory;
    }

    /**
     * DOCUMENT ME!
     * 
     * @param directory DOCUMENT ME!
     * @throws IOException DOCUMENT ME!
     * @throws ParseException DOCUMENT ME!
     */
    private static void search(Directory directory)
            throws IOException, ParseException
    {
        IndexSearcher searcher = new IndexSearcher(directory);
        QueryParser parser = new QueryParser( FIELD_CONTENT, getAnalyzer() );
        System.out.println(
                " analyzer = " + 
                getAnalyzer().getClass().getName());
        System.out.println("phrase = " + phrase);
		Query query = parser.parse( phrase );
        // Query query = QueryParser.parse(phrase, FIELD_CONTENT, 
        //                                getAnalyzer());
        System.out.println("query = " + query);
        Hits hits = searcher.search(query);
        for (int i = 0; i < hits.length(); i++)
        {
            System.out.println(
                    "doc = " + hits.doc(i).get(FIELD_CONTENT));
        }

        searcher.close();
    }
}
