我有一个解析查询来查找带有lucene.net的单词以及文件操作,并且在顺序操作中查询解析器工作正常,当我使用Parallel.Foreach循环执行相同操作时,我得到解析器异常。 在两者的代码示例下面。
工作代码:
#region - Non Parallel Execution -
using (var input = File.OpenText(file.FullName))
{
using (var swFile = new StreamWriter(decryptingFilename))
{
while ((line = input.ReadLine()) != null)
{
totalEncryptedContact++;
query = queryParser.Parse(line.Trim());
TopDocs resultDocs = searcher.Search(query, 1);
if (resultDocs.ScoreDocs.Count() > 0)
{
hits = resultDocs.ScoreDocs[0];
var documentFromSearcher = searcher.Doc(hits.Doc);
string msisdn = documentFromSearcher.Get("MSISDN");
if (!string.IsNullOrWhiteSpace(msisdn))
{
swFile.WriteLine(msisdn);
totalDecryptedContact++;
}
}
}
}
}
#endregion - Non Parallel Execution -
并行的异常代码:
using (var swFile = new StreamWriter(decryptingFilename))
{
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Parallel.ForEach(File.ReadLines(file.FullName), options, newline =>
{
totalEncryptedContact++;
query = queryParser.Parse(QueryParser.Escape(newline.Trim()));
TopDocs resultDocs = searcher.Search(query, 1);
if (resultDocs.ScoreDocs.Count() > 0)
{
hits = resultDocs.ScoreDocs[0];
var documentFromSearcher = searcher.Doc(hits.Doc);
string msisdn = documentFromSearcher.Get("MSISDN");
if (!string.IsNullOrWhiteSpace(msisdn))
{
swFile.WriteLine(msisdn);
totalDecryptedContact++;
}
}
});
}
例外: Lucene.Net.dll中出现“Lucene.Net.QueryParsers.ParseException”类型的异常但未在用户代码中处理
附加信息:无法解析'7465':在第1行第4列遇到“”。
期待其中一个:
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<FUZZY_SLOP> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
":" ...
":" ...
":" ...
":" ...
":" ...
":" ...
":" ...
":" ...
<TERM> ...
"*" ...
答案 0 :(得分:1)
QueryParser
不线程安全。您可以在每次迭代中构造一个新的,但它们非常轻量级。
另外,我怀疑你对QueryParser.Escape
的使用是否符合你的意图。这将逃避所有QueryParser语法。因此,如果你传递它,比如说fieldToSearch:"my text"
,它将会转义引号和冒号等,经过分析,你最终可能得到一个类似于defaultField:fieldtosearch defaultField:my defaultField:text
的查询。