루씬 테스트
출처 : 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;
}
}