I haven't been able to find a comprehensive list of thread-safe methods on the
web although this matrix (http://www.jguru.com/faq/view.jsp?EID=913302) may be
useful. The only object that is consistently called out as NOT thread-safe is
QueryParser.
Section 11.2, "Threads and concurrency, in the second edition of Lucene in
Action (http://www.manning.com/hatcher3/) may be of interest to you. I generally
recommend that anyone getting started with Lucene on any platform should read this
very useful book since it answers most common questions about using Lucene.
http://wiki.apache.org/lucene-java/LuceneFAQ#Is_the_QueryParser_thread-safe.3F
http://wiki.apache.org/lucene-java/LuceneFAQ#Is_the_IndexSearcher_thread-safe.3F
http://plusplus.wordpress.com/2007/07/26/starting-lucene/
I hope this helps.
Cheers,
Ben
Moray McConnachie wrote:
Does anyone know of a guide somewhere summarising what is safe to reuse
between threads and what is not?
Thanks,
Moray
-------------------------------------
Moray McConnachie
Director of IT +44 1865 261 600
Oxford Analytica http://www.oxan.com
-----Original Message-----
From: biarada com [mailto:[email protected]]
Sent: 09 November 2010 21:41
To: [email protected]
Subject: Re: Lucene.Net Stress Error
I think you are right. BiaradaCacheManager.GetSiteProductQueryParser();
is static class. I convert it to dynamic version. I will see the result
in an hour.
Thanks,
2010/11/8 Ben Martz<[email protected]>
Is your code written in a thread-safe manner? I am immediately
suspicious when I see something like:
QueryParser parser = BiaradaCacheManager.GetSiteProductQueryParser();
What type of functionality are your various BiaradaCacheManager
methods providing in terms of object reuse?
Just an idea since I've done extensive multi-thread stress testing on
my product and never encountered such an issue.
Cheers,
Ben
biarada com wrote:
Hi,
I am using lucene for my site, however in these days my site get very
popular. when request amount get 10 or above in a second, some case
(I dont know when it is happenig ) the lucene parser get the
following error. But when I try to execute lucene again it works
fine. could you help me why it happens.
Regards,
Yilmaz Saridemir.
Error:
Cannot parse '(lcd tv) AND HasExpired:0 AND SortByPrice:{0000000 TO
0084699}': Encountered " ")" ") "" at line 1, column 11.
Was expecting one of:
<EOF>
<AND> ...
<OR> ...
<NOT> ...
"+" ...
"-" ...
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<FUZZY_SLOP> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
My code :
public SearchResponseInfoWcf SearchWcf(int productId)
{
SearchResponseInfoWcf info = new SearchResponseInfoWcf();
try
{
MultiSearcher allSearcher =
BiaradaCacheManager.GetAllMultiSearcher();
QueryParser parser =
BiaradaCacheManager.GetSiteProductQueryParser();
Query query = parser.Parse(productId.ToString());
TopDocs docs = allSearcher.Search(query, 1);
if (docs.scoreDocs.Length> 0)
{
Dictionary<int, ProductInfoWcf> products = new
Dictionary<int, ProductInfoWcf>();
Document doc =
allSearcher.Doc(docs.scoreDocs[0].doc);
ProductInfoWcf p = LoadProductInfo(products, doc,
docs.scoreDocs[0].score);
BiaradaDataManager.FillProductInfoData(products,
productId.ToString());
info.ProductIdInfo = p;
string[] matchs = GetMatchedProducts(doc);
if (matchs.Length> 0)
{
if (matchs[0] != "" || matchs.Length> 1)
{
BooleanQuery matchedAllQuery = new
BooleanQuery();
for (int i = 0; i< matchs.Length; i++)
{
if (matchs[i].Length> 0)
{
Query matchedQuery = new
WildcardQuery(new Term("MatcheId", "*," + matchs[i] + ",*")); //#1
matchedAllQuery.Add(matchedQuery,
BooleanClause.Occur.SHOULD);
}
}
//Query hasExpiredQuery = new
WildcardQuery(new Term("HasExpired", "0")); //#1
//matchedAllQuery.Add(hasExpiredQuery,
BooleanClause.Occur.MUST);
//Query matchedQuery = parser.Parse( "("
+
sb.ToString() + ") AND HasExpired:0 ");
BooleanQuery filterBoolenQuery = new
BooleanQuery();
filterBoolenQuery.Add(new TermQuery(new
Term("HasExpired", "0")), BooleanClause.Occur.MUST);
filterBoolenQuery.Add(new TermQuery(new
Term("SortByPrice", WcfConfigManager.MinPrice)),
BooleanClause.Occur.MUST_NOT);
Filter filter = new
QueryWrapperFilter(filterBoolenQuery);
Sort matchSort = new
Sort(GetSortField(SortingTypes.PriceAsc));
//Console.WriteLine(DateTime.Now.Millisecond);
MultiSearcher searcher =
BiaradaCacheManager.GetMultiSearcher();
TopDocs matchedDocs =
searcher.Search(matchedAllQuery, filter,
ConfigManager.MaxMatchedProductCount, matchSort);
//Console.WriteLine(DateTime.Now.Millisecond);
StringBuilder sbMatched = new
StringBuilder();
sbMatched.Append("0");
for (int i = 0; i<
matchedDocs.totalHits&& i< ConfigManager.MaxMatchedProductCount;
i++)
{
Document docMatched =
searcher.Doc(matchedDocs.scoreDocs[i].doc);
ProductInfoWcf pMatched =
LoadProductInfo(info.ReletedInfos, docMatched,
matchedDocs.scoreDocs[i].score);
sbMatched.Append(",");
sbMatched.Append(pMatched.ProductId);
}
BiaradaDataManager.FillProductInfoData(info.ReletedInfos,
sbMatched.ToString());
}
}
}
}
catch (Exception _e)
{
}
int hasError = 0;
if (info.SearchInfos == null)
{
info.SearchInfos = new Dictionary<int,
ProductInfoWcf>();
hasError = 1;
}
if (info.AdvInfos == null)
{
info.AdvInfos = new Dictionary<int,
ProductInfoWcf>();
hasError += 2;
}
if (info.ProductIdInfo== null)
{
info.ProductIdInfo = new ProductInfoWcf();
hasError += 4;
}
else if (info.ProductIdInfo.Name == null)
{
info.ProductIdInfo.Name = "biarada";
hasError += 8;
}
if (info.ReletedInfos== null)
{
info.ReletedInfos = new Dictionary<int,
ProductInfoWcf>();
hasError += 16;
}
if (hasError> 0)
{
}
return info;
}
---------------------------------------------------------
Disclaimer
This message and any attachments are confidential and/or privileged. If this
has been sent to you in error, please do not use, retain or disclose them, and
contact the sender as soon as possible.
Oxford Analytica Ltd
Registered in England: No. 1196703
5 Alfred Street, Oxford
United Kingdom, OX1 4EH
---------------------------------------------------------