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

本文关键字:字段 添加 数据 Lucene Net | 更新日期: 2023-09-27 17:57:47

每次调用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);
    }
}

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

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