Luceneを使うNETによるデータ検索機能の実現

9050 ワード

1、索引の管理
//             
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir), new NativeFSLockFactory());
//            
bool isExist = IndexReader.IndexExists(directory);
if (isExist)
{
    if (IndexWriter.IsLocked(directory))
    {
        IndexWriter.Unlock(directory);
    }
}
//     
PanGuAnalyzer analyzer = new PanGuAnalyzer();
//     
IndexWriter writer = new IndexWriter(directory, analyzer, !isExist, IndexWriter.MaxFieldLength.UNLIMITED);
//        
while (IndexDataQueue.Count > 0)
{
    Document document = new Document();
//               ,          、  、            (  、  、  )
    BaseDataMode mode = IndexDataQueue.Dequeue();
    switch (mode.Type)
    {
        case OperationType.Insert:
            {
                foreach (KeyValuePair<string, string> kv in mode.Content)
                {
                    //  kv.Key           ,kv.Value           。
                    document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
                }
                writer.AddDocument(document);
            }; break;
        case OperationType.Update:
        {
            //      
            MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);
            Query query = parser.Parse(mode.Content["id"]);
            writer.DeleteDocuments(query);
            foreach (KeyValuePair<string, string> kv in mode.Content)
            {
                document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
            }
            writer.AddDocument(document);
        }; break;
        case OperationType.Delete:
        {
            MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);
            Query query = parser.Parse(mode.Content["id"]);
            writer.DeleteDocuments(query);
        }; break;
        default: { }; break;
    }
}
//    
writer.Commit();
//  
writer.Optimize();
//    
writer.Close();
directory.Close();

2、検索
//             
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDir), new NativeFSLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
//          OR  
BooleanQuery queryOr = new BooleanQuery();
foreach (string word in SplitContent.SplitByPanGu(keyword))
{
    foreach (KeyValuePair<string, string> kv in Mode.Content)
    {
        TermQuery query = new TermQuery(new Term(kv.Key, word));
        //       Or  
        queryOr.Add(query, BooleanClause.Occur.SHOULD);
    }
}
//             
//1000          ,             ,         
TopDocs tds = searcher.Search(queryOr, null, 1000);
ScoreDoc[] docs = tds.scoreDocs;
for (int i = 0; i < docs.Length; i++)
{
    int docId = docs[i].doc;
    Document doc = searcher.Doc(docId);
string content = doc.Get("        ");
}

変換元:http://www.cnblogs.com/liusuqi/p/3671161.html