0

私は、約 500 のドキュメント (スキーマで定義された 30 のフィールド) を持つ solr Web サイトと、その solr Web サイトに http get 要求を送信する同じマシン上のac# クライアントを持っています。これらのログは、私の 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 からのクエリ時間は非常に長く、ほぼ同じ (1000 ミリ秒から 1050 ミリ秒の間) でした。同時に、対応する 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;
4

2 に答える 2

2

QTime は、Solr が検索を行う時間です。残りの時間は、格納されているフィールドのコンテンツをディスクから取得し、JSON フォームに生成するなど、応答を生成するために費やされます。

次のいくつかのことを調べます。

  • 独自のクエリを実行して応答を解析する代わりに、SolrNetライブラリを使用して Solr にアクセスする
  • デバッグ情報を送信しているかどうかを確認し、それをオフにします。返された JSON を見て、solrconfig.xml で構成するだけです。
  • 応答でこれらすべてのフィールドが本当に必要かどうかを確認する
  • 特定のフィールドが本当に大きいかどうか、CPU ではなくディスクがボトルネックになっていないかどうかを確認します。もしそうなら、(Solr 4で)そのフィールドを圧縮して保存することを宣言できます-これにより、ディスクからフィールドを取得する速度が向上します
于 2013-01-17T13:25:07.583 に答える
0

Solrサーバーへのアクセスに使用しているコードを追加していただきありがとうございます。tomcatログから明らかなように、Solrへのリクエストは非常に迅速に行われています。(Solrはクエリをキャッシュしているため、前述のようにQTimeは0です)。1000ミリ秒以上の時間は、Solrサーバーが応答するためのものではありません。その時間は、Solr応答をクライアントに転送して(この場合は同じサーバー上にあるため簡単です)、応答ストリームを読み取るために費やされています。

さらに、SolrNetクライアントを使用してC#からSolrにアクセスすることを検討することもできます。Solrにクエリを実行するためのより豊富なインターフェイスを提供し、クエリ結果をPOCOオブジェクトにマップします。

于 2013-01-17T13:16:58.880 に答える