客户端的响应时间比tomcat中的QTime长得多

时间:2013-01-17 03:23:44

标签: c# solr

我有一个solr网站,大约有500个文档(架构中定义了30个文件),同一台机器上的c#客户端 会向该solr网站发送http get请求。 这些日志由我的c#客户端记录:

01-16 23:54:49,301 [107] INFO LogHelper - requst time too long: 1054, solr time: 1003
01-16 23:54:49,847 [63] INFO LogHelper - requst time too long: 1068, solr time: 1021
01-16 23:57:17,813 [108] INFO LogHelper - requst time too long: 1051, solr time: 1027
01-16 23:57:18,313 [111] INFO LogHelper - requst time too long: 1031, solr time: 1007
and so on…

你可以看到,来自solr的查询时间太长而且每个类似(1000ms到1050ms之间)。同时,tomcat中对应的日志:

2013-1-16 23:54:49 org.apache.solr.core.SolrCore execute
Info: [suit1] webapp=/vanclsearchV2 path=/select/ params={fl=id,typeid,createtime,vprice,sprice,price,totalassesscount,totalsalescount,productcode,productname,stylecode,tag,vpricesku,spricesku,pricesku,userrate,assesscount,lstphotos,mainphotos,salesflag,isduanma,detailsalescount,productplusstyleinfo&sort=createtime+desc&start=0&q=*:*&wt=json&fq=ancestorsid:(28976+OR+28978)&fq=typeid:(1)&rows=30} hits=43 status=0 QTime=0 
2013-1-16 23:54:49 org.apache.solr.core.SolrCore execute
Info: [suit1] webapp=/vanclsearchV2 path=/select/ params={fl=id,typeid,createtime,vprice,sprice,price,totalassesscount,totalsalescount,productcode,productname,stylecode,tag,vpricesku,spricesku,pricesku,userrate,assesscount,lstphotos,mainphotos,salesflag,isduanma,detailsalescount,productplusstyleinfo&sort=createtime+desc&start=0&q=*:*&wt=json&fq=ancestorsid:(28976+OR+28978)&fq=typeid:(1)&rows=30} hits=43 status=0 QTime=0
2013-1-16 23:57:17 org.apache.solr.core.SolrCore execute
Info: [suit1] webapp=/vanclsearchV2 path=/select/ params={fl=id,typeid,createtime,vprice,sprice,price,totalassesscount,totalsalescount,productcode,productname,stylecode,tag,vpricesku,spricesku,pricesku,userrate,assesscount,lstphotos,mainphotos,salesflag,isduanma,detailsalescount,productplusstyleinfo&sort=createtime+desc&start=0&q=*:*&wt=json&fq=ancestorsid:(27547+OR+27614)&rows=30} hits=9 status=0 QTime=0 
2013-1-16 23:57:18 org.apache.solr.core.SolrCore execute
Info: [suit1] webapp=/vanclsearchV2 path=/select/ params={fl=id,typeid,createtime,vprice,sprice,price,totalassesscount,totalsalescount,productcode,productname,stylecode,tag,vpricesku,spricesku,pricesku,userrate,assesscount,lstphotos,mainphotos,salesflag,isduanma,detailsalescount,productplusstyleinfo&sort=createtime+desc&start=0&q=*:*&wt=json&fq=ancestorsid:(27547+OR+27614)&rows=30} hits=9 status=0 QTime=0

每个奇怪的,所有的QTime都是零!任何人都可以解释这种情况,以及如何解决这个问题?

string QUERY_TEMPLATE = ConfigurationManager.AppSettings["solr-select-url"] + "/select/?fl={0}&q={1}{2}&start={3}&rows={4}&sort={5}&wt=json";

WebRequest request = HttpWebRequest.Create(string.Format(QUERY_TEMPLATE,
                                                requestInfo.BrowserType==BrowserTypeEnum.Style?STYLE_FIELDS:COLOR_FIELDS,
                                                string.IsNullOrWhiteSpace(requestInfo.KeyWord) ? "*:*" : requestInfo.KeyWord,
                                                filterQuery,
                                                (requestInfo.Page - 1) * requestInfo.RowsCount,
                                                requestInfo.RowsCount,
                                                sortFiled)
                                            );
request.Method="GET";

string resultString=null;

Stopwatch solrWatch = new Stopwatch();
solrWatch.Start();
using (WebResponse response = request.GetResponse())
{
    using (Stream stream = response.GetResponseStream())
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            resultString = reader.ReadToEnd();
        }
    }
}
solrWatch.Stop();
solrTime = solrWatch.ElapsedMilliseconds;

2 个答案:

答案 0 :(得分:2)

QTime是Solr进行搜索的时间。剩下的时间是通过生成响应来完成的,包括从磁盘中获取存储的字段内容并将它们生成为JSON格式。

我会研究以下几件事:

  • 使用SolrNet库访问Solr而不是自己进行查询并解析响应
  • 检查您是否正在发送调试信息并将其关闭;只需查看返回的JSON并在solrconfig.xml中配置它
  • 检查您是否确实需要回复所有这些字段
  • 检查是否有任何特定字段非常大,是否由磁盘而不是CPU瓶颈;如果是这样,你可以(在Solr 4中)声明该字段存储为压缩 - 这可以加速从磁盘中获取字段

答案 1 :(得分:0)

感谢您添加用于访问Solr服务器的代码。从您的tomcat日志中可以看出,对Solr的请求发生得很快。 (Solr正在缓存查询,因此你注意到QTime为0)。您的1000+毫秒时间不是Solr服务器响应您的。这段时间用于将Solr响应传回给您的客户端(在这种情况下是微不足道的,因为它在同一台服务器上)并读取响应流。

此外,您可能需要考虑使用SolrNet客户端从C#访问Solr。它为查询Solr提供了更丰富的界面,并将查询结果映射到POCO对象。