You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@lucenenet.apache.org by biarada com <bi...@gmail.com> on 2010/11/08 22:48:18 UTC

Lucene.Net Stress Error

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;
        }

Simultaneous Index Update and Search

Posted by Frank Yu <fr...@farpoint.com>.
Hi All,

I am using Lucene.Net 2.9.2 to index and search millions of records. Index
search works fine as long as there is no index update. Once there is an
index update, the CPU usage goes up very high (100%) that impacts the
searching. 

I have three instances of IndexSearcher in the SearcherList. The index
update will close the first one and add a new one. The search will always
use the last one in the list.  Does anyone have any suggestion why the CPU
is so high?

//check the first CDSearcher 
IndexReader oldReader = SearcherList.First.Value.GetIndexReader();
if (!oldReader.IsCurrent())
{
     IndexReader newReader = oldReader.Reopen();
     if (oldReader != newReader)
     {
         // close the first CDSearcher on the list
         SearcherList.First.Value.Close();
         oldReader.Close();
         SearcherList.RemoveFirst();                        
         SearcherList.AddLast(new IndexSearcher(newReader));
      }
}

Thanks,

Frank


RE: Lucene.Net Stress Error

Posted by Chris <La...@dcpromo.com>.
There is an interesting comment at the bottom of the Jguru site.   Does anyone know the answer?

The comment:
"Why delete/query is Y but query/delete is N?"

________________________________________
From: Ben Martz [benmartz@gmail.com]
Sent: Thursday, November 11, 2010 10:13 AM
To: lucene-net-user@lucene.apache.org
Subject: Re: Lucene.Net Stress Error

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:biarada.com@gmail.com]
> Sent: 09 November 2010 21:41
> To: lucene-net-user@lucene.apache.org
> 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<be...@gmail.com>
>
>> 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
> ---------------------------------------------------------
>

Re: Lucene.Net Stress Error

Posted by Ben Martz <be...@gmail.com>.
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:biarada.com@gmail.com]
> Sent: 09 November 2010 21:41
> To: lucene-net-user@lucene.apache.org
> 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<be...@gmail.com>
>
>> 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
> ---------------------------------------------------------
>

RE: Lucene.Net Stress Error

Posted by Moray McConnachie <mm...@oxford-analytica.com>.
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:biarada.com@gmail.com] 
Sent: 09 November 2010 21:41
To: lucene-net-user@lucene.apache.org
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 <be...@gmail.com>

> 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
---------------------------------------------------------


Re: Lucene.Net Stress Error

Posted by biarada com <bi...@gmail.com>.
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 <be...@gmail.com>

> 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;
>>         }
>>
>>

Re: Lucene.Net Stress Error

Posted by Ben Martz <be...@gmail.com>.
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;
>          }
>