I'm trying to go live with our search engine implementation based on
Lucene.net.
Unfortunately we have to keep it inside our appdomain in the web application
to make it work in shared hosting scenario.

But we are getting quite a few problems, so I was wondering if there are
some issues with concurrent access:
1 - is the QueryParser thread safe? Can I make it one at the beginning of
the times and reuse it in all my queries? or do I've to create one each
time?
I'm asking because I'm getting strange errors like:

ystem.InvalidOperationException: Collection was modified; enumeration
operation may not execute.     at
System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()     at
Lucene.Net.QueryParsers.QueryParser.Jj_add_error_token(Int32 kind, Int32
pos)     at Lucene.Net.QueryParsers.QueryParser.Jj_scan_token(Int32 kind)
at Lucene.Net.QueryParsers.QueryParser.Jj_3_1()     at
Lucene.Net.QueryParsers.QueryParser.Jj_rescan_token()     at
Lucene.Net.QueryParsers.QueryParser.GenerateParseException()     at
Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind)     at
Lucene.Net.QueryParsers.QueryParser.Clause(String field)     at
Lucene.Net.QueryParsers.QueryParser.Query(String field)     at
Lucene.Net.QueryParsers.QueryParser.Parse(String query)     at
Subtext.Framework.Services.SearchEngine.SearchEngineService.Search(String
queryString, Int32 max, Int32 blogId, Int32 entryId)

Which looks to me like a threading issue.

I also got this one:

Lucene.Net.QueryParsers.QueryParser+LookaheadSuccess: Error in the
application.
at Lucene.Net.QueryParsers.QueryParser.Jj_scan_token(Int32 kind)     at
Lucene.Net.QueryParsers.QueryParser.Jj_3R_2()     at
Lucene.Net.QueryParsers.QueryParser.Jj_3R_2()     at
Lucene.Net.QueryParsers.QueryParser.Jj_rescan_token()     at
Lucene.Net.QueryParsers.QueryParser.Jj_3_1()     at
Lucene.Net.QueryParsers.QueryParser.GenerateParseException()     at
Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind)     at
Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind)     at
Lucene.Net.QueryParsers.QueryParser.Term(String field)     at
Lucene.Net.QueryParsers.QueryParser.Clause(String field)     at
Lucene.Net.QueryParsers.QueryParser.Clause(String field)     at
Lucene.Net.QueryParsers.QueryParser.Query(String field)     at
Lucene.Net.QueryParsers.QueryParser.Query(String field)     at
Lucene.Net.QueryParsers.QueryParser.Parse(String query)     at
Lucene.Net.QueryParsers.QueryParser.Parse(String query)     at
Subtext.Framework.Services.SearchEngine.SearchEngineService.Search(String
queryString, Int32 max, Int32 blogId, Int32 entryId)

And this one:

Lucene.Net.QueryParsers.ParseException: Cannot parse 'what is css
url': Encountered
"what is css url" at line 1, column 0. Was expecting one of:     <NOT>
...     "+"
...     "-" ...     "(" ...     "*" ...     <QUOTED> ...     <TERM> ...
<PREFIXTERM> ...     <WILDTERM> ...     "[" ...     "{" ...
<NUMBER> ...
at Lucene.Net.QueryParsers.QueryParser.Parse(String query)

Which is fine if I really added an invalid character in the query, but "what
is css url" looks to me like it's a valid query.

What I'm doing is, to avoid creating a new query parser for each query, to
"cache" the same as variable inside the singleton class that holds the
search engine.
Is this a good approach? or a bad one? (I guess bad since this all seem to
be threading issues).
Is creating a new query parser for each query a performance problem?

Thank you
Simone

-- 
Simone Chiaretta
Microsoft MVP ASP.NET - ASPInsider
Blog: http://codeclimber.net.nz
RSS: http://feeds2.feedburner.com/codeclimber
twitter: @simonech

Any sufficiently advanced technology is indistinguishable from magic
"Life is short, play hard"

Reply via email to