繁体   English   中英

如何在Lucene.Net的现有字段中添加数据

[英]how to add data in existing field in Lucene.Net

每次我调用index()方法都会覆盖该字段。 例如,我想在keywordHash字段中添加“ 1”,“ 2”,“ 3”。 但是,在我调用index()方法之后,将仅保存“ 3”。 如何将所有数据添加到字段中而不是覆盖它们? 在GetView()方法内部是我调用Index()方法的地方。

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);

    }
}

您同时调用了FSDirectory.GetDirectory(..., create: true)new IndexWriter(..., create: true) 传递true将清除所有现有索引,因此将删除先前已建立索引的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM