프로그램 자료/Lucene

루씬 테스트

motolies 2015. 6. 9. 18:16

출처 : http://scblood.egloos.com/4808640

       http://scblood.egloos.com/4809069

       http://scblood.egloos.com/4809098

       http://scblood.egloos.com/4809132


.net 한글 형태소 분석기 : http://www.sysnet.pe.kr/2/0/1500




인덱스 생성

static Lucene.Net.Store.Directory GetDirectory()

{

    return new SimpleFSDirectory(new DirectoryInfo(@"D:\SampleIndex"));

}

static Analyzer GetAnalyzer()

{

    //return new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

    return new WhitespaceAnalyzer();

}

static void BuildIndex()

{

    SqlConnection con = new SqlConnection("server=(local);uid=id;pwd=pwd&;database=database;");

    con.Open();

    SqlCommand com = new SqlCommand();

    com.Connection = con;

    com.CommandText = "select ComID, FullName, FullNameEn, Name, NameEn from COM_Info";

 

    SqlDataReader dr = com.ExecuteReader();

           

    using (var directory = GetDirectory())

    using (var analyzer = GetAnalyzer())

    using (var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))

    {

        writer.DeleteAll();

 

        while (dr.Read())

        {

            Document doc = new Document();

            doc.Add(new NumericField("ComID", Field.Store.YES, true).SetIntValue((int)dr["ComID"]));

            doc.Add(new Field("FullName", (string)dr["FullName"], Field.Store.YES, Field.Index.ANALYZED));

            doc.Add(new Field("FullNameEn", (string)dr["FullNameEn"], Field.Store.YES, Field.Index.ANALYZED));

            doc.Add(new Field("Name", (string)dr["Name"], Field.Store.YES, Field.Index.ANALYZED));

            doc.Add(new Field("NameEn", (string)dr["NameEn"], Field.Store.YES, Field.Index.ANALYZED));

            writer.AddDocument(doc);

        }

    }

}

 

인덱스 검색

static List<string> Search(string keywords, int limit, out int count)

{

    using (var directory = GetDirectory())

    using (var searcher = new IndexSearcher(directory))

    {

 

        var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "FullName", GetAnalyzer());

        parser.AllowLeadingWildcard = true; //와일드카드 사용유무

 

        //조합형으로 AND OR 등을 사용해서 만들 있다.

        string searchParam = "FullName:*" + keywords + "*";

 

        var query = parser.Parse(searchParam);

        var sort = new Sort(new SortField("FullName", SortField.STRING), SortField.FIELD_SCORE);

 

        var collector = TopFieldCollector.Create(sort, limit, false, true, true, true);

        searcher.Search(query, collector);

 

        var docs = collector.TopDocs().ScoreDocs;

        count = docs.Length;

 

        var rtnList = new List<string>();

 

        foreach (ScoreDoc d in docs)

        {

            Document doc = searcher.Doc(d.Doc);

            string fullName = doc.Get("FullName");

            rtnList.Add(fullName);

        }

        return rtnList;

    }

}