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();
    }
}
