Lucene .Net在Parallel.ForEach循环中使用<eof>解析查询时出现异常

时间:2017-02-13 10:34:26

标签: c# .net lucene lucene.net

我有一个解析查询来查找带有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> ...

"*" ...

1 个答案:

答案 0 :(得分:1)

QueryParser 线程安全。您可以在每次迭代中构造一个新的,但它们非常轻量级。

另外,我怀疑你对QueryParser.Escape的使用是否符合你的意图。这将逃避所有QueryParser语法。因此,如果你传递它,比如说fieldToSearch:"my text",它将会转义引号和冒号等,经过分析,你最终可能得到一个类似于defaultField:fieldtosearch defaultField:my defaultField:text的查询。