Luceneを使うNETによるデータ検索機能の実現
9050 ワード
1、索引の管理
2、検索
変換元:http://www.cnblogs.com/liusuqi/p/3671161.html
//
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