2013-02-06 53 views
0

每次我調用方法時,index()方法都會覆蓋該字段。例如,我想在keywordHash字段中添加「1」,「2」,「3」。但是在我調用index()方法之後,只會保存「3」。如何將所有數據添加到字段而不是覆蓋它?在GetView()方法中,我稱之爲Index()方法。如何在Lucene.Net中的現有字段中添加數據

public virtual string GetView(TokenStream tokenStream, out int numberOfTokens, string filePath, string encryptedPath, string password, string fileName) 
{ 
    StringBuilder sb = new StringBuilder(); 

    Token token = tokenStream.Next(); 

    numberOfTokens = 0; 

    FileEncryption fileEnc = new FileEncryption(); 


    while (token != null) 
    { 
     numberOfTokens++; 
     sb.Append("[" + token.TermText() + " = " + GetTokenView(token) + "]" + System.Environment.NewLine); 
     fileEnc.Index(GetTokenView(token), filePath, encryptedPath, password, fileName); 
     token = tokenStream.Next(); 


    } 

    return sb.ToString(); 

} 

public void Index(string strHash, string filePath, string encryptedPath, string password, string fileName) 
{ 
    string indexFileLocation = @"C:\Index"; 
    Lucene.Net.Store.Directory dir = 
     Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, true); 

    //create an analyzer to process the text 
    Lucene.Net.Analysis.Analyzer analyzer = new 
    Lucene.Net.Analysis.Standard.StandardAnalyzer(); 

    //create the index writer with the directory and analyzer defined. 
    Lucene.Net.Index.IndexWriter indexWriter = new 
    Lucene.Net.Index.IndexWriter(dir, analyzer, 
     /*true to create a new index*/ true); 

    //create a document, add in a single field 
    Lucene.Net.Documents.Document doc = new 
    Lucene.Net.Documents.Document(); 

    doc.Add(new Field("keywordHash", strHash, Field.Store.YES, Field.Index.TOKENIZED)); 
    doc.Add(new Field("keywordPath", filePath, Field.Store.YES, Field.Index.NO)); 
    doc.Add(new Field("keywordEncPath", encryptedPath, Field.Store.YES, Field.Index.NO)); 
    doc.Add(new Field("keywordPassword", password, Field.Store.YES, Field.Index.TOKENIZED)); 
    //doc.Add(new Field("keywordEncryptedFile", encryptedFile, Field.Store.YES, Field.Index.ANALYZED)); 
    doc.Add(new Field("keywordFileName", fileName, Field.Store.YES, Field.Index.NO)); 


    //write the document to the index 
    indexWriter.AddDocument(doc); 

    //optimize and close the writer 
    indexWriter.Optimize(); 
    indexWriter.Close(); 


} 


public void LuceneSearch() 
{ 
    HashAlg hashAlg = new HashAlg(); 
    string keywordLower = tbSearchEnc.Text.ToLower(); 
    string keywordHash; 

    if(rbMD5Search.Checked == true) 
    { 
     keywordHash = hashAlg.GenerateHashMD5(keywordLower); 
    } 
    else 
    { 
     keywordHash = hashAlg.GenerateHashSHA1(keywordLower); 
    } 

    string indexFileLocation = @"C:\Index"; 
    Lucene.Net.Store.Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, false); 
    Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(indexFileLocation); 
    //create an index searcher that will perform the search 
    //Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(dir); 

    //build a query object 
    Lucene.Net.Index.Term searchTerm = new Lucene.Net.Index.Term("keywordHash", keywordHash); 
    Lucene.Net.Search.Query query = new Lucene.Net.Search.TermQuery(searchTerm); 

    //execute the query 
    Lucene.Net.Search.Hits hits = searcher.Search(query); 

    //iterate over the results. 
    for (int i = 0; i < hits.Length(); i++) 
    { 
     Document doc = hits.Doc(i); 
     string hashValue = doc.Get("keywordHash"); 
     string path = doc.Get("keywordPath"); 
     string encPath = doc.Get("keywordEncPath"); 
     string fileName = doc.Get("keywordFileName"); 

     listBoxSearch.Items.Add(encPath); 
     Console.WriteLine(hashValue + " " + path + " " + encPath + " " + fileName); 

    } 
} 

回答

0

你叫FSDirectory.GetDirectory(..., create: true)new IndexWriter(..., create: true)。通過true將清除任何現有索引,因此您以前索引的文檔將被刪除。

+0

實際上這個代碼已經過時了,我搜索一種方法來替換這裏的「next」:http://stackoverflow.com/q/22907008/185593 – serhio

相關問題