Correct, that's the way we use it. On 1/12/10, Simone Chiaretta <simone.chiare...@gmail.com> wrote: > OK, so I can create the query parser each time, using the analyzer I created > at the search engine startup? Correct? > Simone > > On Tue, Jan 12, 2010 at 12:28 AM, Jokin Cuadrado <joki...@gmail.com> wrote: > >> The queryparser it's not thread safe, so you must use a new one in >> every request, however, is very lightweight, because the bigger >> complexity comes from the underlying analyzer, and this one it's >> thread safe. >> >> On 1/12/10, Simone Chiaretta <simone.chiare...@gmail.com> wrote: >> > 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" >> > >> >> >> -- >> Jokin >> > > > > -- > 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" >
-- Jokin