[英]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.