<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>paging &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/paging-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://solr.pl</link>
	<description>All things to be found - Blog related to Apache Solr &#38; Lucene projects - https://solr.apache.org</description>
	<lastBuildDate>Thu, 12 Nov 2020 14:03:35 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Solr 4.7 &#8211; wydajne stronicowanie</title>
		<link>https://solr.pl/2014/03/10/solr-4-7-wydajne-stronicowanie/</link>
					<comments>https://solr.pl/2014/03/10/solr-4-7-wydajne-stronicowanie/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 10 Mar 2014 14:03:07 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[deep paging]]></category>
		<category><![CDATA[paging]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=587</guid>

					<description><![CDATA[Dawno, dawno temu, opisywaliśmy problem tzw. głębokiego stronicowania. W skrócie &#8211; im dalszą stronę wyników chcemy pobrać, tym wolniejsze będzie zapytanie. Dzieje się tak ze względu na konieczność przygotowania danych w kolejce. Niestety, nie było w Solr dobrego rozwiązania tego]]></description>
										<content:encoded><![CDATA[<p>Dawno, dawno temu, opisywaliśmy problem tzw. <a href="http://solr.pl/2011/07/18/problem-glebokiego-stonicowania/">głębokiego stronicowania</a>. W skrócie &#8211; im dalszą stronę wyników chcemy pobrać, tym wolniejsze będzie zapytanie. Dzieje się tak ze względu na konieczność przygotowania danych w kolejce. Niestety, nie było w Solr dobrego rozwiązania tego problemu &#8211; aż do premiery Solr 4.7. Wraz z niedawno wypuszczoną wersją dostaliśmy możliwość skorzystania z kursora i znaczącego poprawienia wydajności głębokiego stronicowania.</p>
<p><span id="more-587"></span></p>
<h2>Problem</h2>
<p>Problem głębokiego stronicowania jest całkiem prosty do zdefiniowania. Aby zwrócić wyniki wyszukiwania, Solr musi przygotować odpowiednią strukturę w pamięci i zwrócić jej część. Sytuacja jest prosta w przypadku pierwszej strony wyszukiwania, jednak komplikuje się dalej. Aby zwrócić stronę numer 10.000 (gdzie mamy 20 wyników na stronę) Solr musi przygotować strukturę zawierającą minimum 200.000 dokumentów (10.000 * 20). Można sobie wyobrazić, iż nie tylko zabiera to czas, ale także znaczne ilości pamięci.</p>
<p>Na szczęście, wraz z premierą Solr 4.7 sytuacja się zmieniła &#8211; wprowadzono pojęcie kursora. Kursor jest logiczną strukturą, która nie wymaga przechowywania stanu po stronie serwera. Kursor zawiera informacje na temat sortowania i ostatniego dokumentu w zwróconych wynikach wyszukiwania, dzięki temu Solr nie musi za każdym razem budować całej struktury od początku. Skutkuje to bardzo dużym wzrostem wydajności zapytań korzystających z kursora i głębokiego stronicowania.</p>
<h2>Działanie</h2>
<p>Zasada działania jest dość prosta. Aby Solr mógł skorzystać z nowej funkcjonalności, w pierwszym zapytaniu przekazujemy parametr <em>cursorMark=*</em>. W odpowiedzi, oprócz wyników wyszukiwania zostanie zwrócony identyfikator kursora, który przekazujemy w ramach następnych zapytań<em></em>. Spójrzmy na przykład.</p>
<h3>Zapytanie</h3>
<p>Na początek zadajemy proste zapytanie:
</p>
<pre class="brush:bash">curl 'localhost:8983/solr/select?q=*:*&amp;rows=1&amp;sort=score+desc,id+asc&amp;cursorMark=*'</pre>
<p>Warto spojrzeć na cztery rzeczy. Po pierwsze &#8211; albo pomijamy parametr <em>start</em>, albo ustawiamy parametr <em>start</em> na <em>0</em>. Parametr <em>rows</em> może przyjmować wartości jakich potrzebujemy. Oczywiście przekazaliśmy parametr <em>cursorMark=*</em>, aby skorzystać z kursora. Ostatnią rzeczą jaką zrobiliśmy, to zdefiniowanie sortowania. Aby uniknąć problemów z sortowaniem, nasze sortowanie musi zawierać sortowanie po identyfikatorze &#8211; z tego względu musieliśmy nadpisać domyślne sortowanie przekazując do Solr parametr <em>sort=score+desc,id+asc</em>.</p>
<h3>Wyniki wyszukiwania</h3>
<p>Nasze zapytanie zwraca następujący wynik wyszukiwania:
</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;response&gt;
 &lt;lst name="responseHeader"&gt;
  &lt;int name="status"&gt;0&lt;/int&gt;
  &lt;int name="QTime"&gt;33&lt;/int&gt;
  &lt;lst name="params"&gt;
   &lt;str name="sort"&gt;score desc,id asc&lt;/str&gt;
   &lt;str name="start"&gt;0&lt;/str&gt;
   &lt;str name="q"&gt;*:*&lt;/str&gt;
   &lt;str name="cursorMark"&gt;*&lt;/str&gt;
   &lt;str name="rows"&gt;1&lt;/str&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
&lt;result name="response" numFound="32" start="0"&gt;
 &lt;doc&gt;
  &lt;str name="id"&gt;0579B002&lt;/str&gt;
  &lt;str name="name"&gt;Canon PIXMA MP500 All-In-One Photo Printer&lt;/str&gt;
  &lt;str name="manu"&gt;Canon Inc.&lt;/str&gt;
  &lt;str name="manu_id_s"&gt;canon&lt;/str&gt;
  &lt;arr name="cat"&gt;
   &lt;str&gt;electronics&lt;/str&gt;
   &lt;str&gt;multifunction printer&lt;/str&gt;
   &lt;str&gt;printer&lt;/str&gt;
   &lt;str&gt;scanner&lt;/str&gt;
   &lt;str&gt;copier&lt;/str&gt;
  &lt;/arr&gt;
  &lt;arr name="features"&gt;
   &lt;str&gt;Multifunction ink-jet color photo printer&lt;/str&gt;
   &lt;str&gt;Flatbed scanner, optical scan resolution of 1,200 x 2,400 dpi&lt;/str&gt;
   &lt;str&gt;2.5" color LCD preview screen&lt;/str&gt;
   &lt;str&gt;Duplex Copying&lt;/str&gt;
   &lt;str&gt;Printing speed up to 29ppm black, 19ppm color&lt;/str&gt;
   &lt;str&gt;Hi-Speed USB&lt;/str&gt;
   &lt;str&gt;memory card: CompactFlash, Micro Drive, SmartMedia, Memory Stick, Memory Stick Pro, SD Card, and MultiMediaCard&lt;/str&gt;
  &lt;/arr&gt;
  &lt;float name="weight"&gt;352.0&lt;/float&gt;
  &lt;float name="price"&gt;179.99&lt;/float&gt;
  &lt;str name="price_c"&gt;179.99,USD&lt;/str&gt;
  &lt;int name="popularity"&gt;6&lt;/int&gt;
  &lt;bool name="inStock"&gt;true&lt;/bool&gt;
  &lt;str name="store"&gt;45.19214,-93.89941&lt;/str&gt;
  &lt;long name="_version_"&gt;1461375031699308544&lt;/long&gt;&lt;/doc&gt;
 &lt;/result&gt;
 &lt;str name="nextCursorMark"&gt;AoIIP4AAACgwNTc5QjAwMg==&lt;/str&gt;
&lt;/response&gt;</pre>
<p>Jak widzimy, oprócz standardowych informacji, Solr zwrócił także identyfikator kursora &#8211; <em>nextCursorMark</em>. Teraz, aby pobrać kolejne wyniki wyszukiwania musimy uwzględnić go w naszym zapytaniu korzystając z <em>cursorMark</em><em></em>.</p>
<h3>Kolejne zapytanie</h3>
<p>Zatem nasze kolejne zapytanie wyglądać będzie następująco:
</p>
<pre class="brush:bash">curl 'localhost:8983/solr/select?q=*:*&amp;rows=1&amp;sort=score+desc,id+asc&amp;cursorMark=AoIIP4AAACgwNTc5QjAwMg=='</pre>
<p>Wynik tego zapytania będzie następujący:
</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;response&gt;
 &lt;lst name="responseHeader"&gt;
  &lt;int name="status"&gt;0&lt;/int&gt;
  &lt;int name="QTime"&gt;2&lt;/int&gt;
  &lt;lst name="params"&gt;
   &lt;str name="sort"&gt;score desc,id asc&lt;/str&gt;
   &lt;str name="indent"&gt;true&lt;/str&gt;
   &lt;str name="q"&gt;*:*&lt;/str&gt;
   &lt;str name="cursorMark"&gt;AoIIP4AAACgwNTc5QjAwMg==&lt;/str&gt;
   &lt;str name="rows"&gt;1&lt;/str&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
&lt;result name="response" numFound="32" start="0"&gt;
 &lt;doc&gt;
  &lt;str name="id"&gt;100-435805&lt;/str&gt;
  &lt;str name="name"&gt;ATI Radeon X1900 XTX 512 MB PCIE Video Card&lt;/str&gt;
  &lt;str name="manu"&gt;ATI Technologies&lt;/str&gt;
  &lt;str name="manu_id_s"&gt;ati&lt;/str&gt;
  &lt;arr name="cat"&gt;
   &lt;str&gt;electronics&lt;/str&gt;
   &lt;str&gt;graphics card&lt;/str&gt;
  &lt;/arr&gt;
  &lt;arr name="features"&gt;
   &lt;str&gt;ATI RADEON X1900 GPU/VPU clocked at 650MHz&lt;/str&gt;
   &lt;str&gt;512MB GDDR3 SDRAM clocked at 1.55GHz&lt;/str&gt;
   &lt;str&gt;PCI Express x16&lt;/str&gt;
   &lt;str&gt;dual DVI, HDTV, svideo, composite out&lt;/str&gt;
   &lt;str&gt;OpenGL 2.0, DirectX 9.0&lt;/str&gt;
  &lt;/arr&gt;
  &lt;float name="weight"&gt;48.0&lt;/float&gt;
  &lt;float name="price"&gt;649.99&lt;/float&gt;
  &lt;str name="price_c"&gt;649.99,USD&lt;/str&gt;
  &lt;int name="popularity"&gt;7&lt;/int&gt;
  &lt;bool name="inStock"&gt;false&lt;/bool&gt;
  &lt;date name="manufacturedate_dt"&gt;2006-02-13T00:00:00Z&lt;/date&gt;
  &lt;str name="store"&gt;40.7143,-74.006&lt;/str&gt;
  &lt;long name="_version_"&gt;1461375031846109184&lt;/long&gt;&lt;/doc&gt;
 &lt;/result&gt;
 &lt;str name="nextCursorMark"&gt;AoIIP4AAACoxMDAtNDM1ODA1&lt;/str&gt;
&lt;/response&gt;</pre>
<p>Jak widzimy Solr znów zwrócił informacje o kursorze &#8211; tym razem innym, niż poprzednio.<em></em></p>
<h3>Wszystkie kolejne zapytania</h3>
<p>Dalsza logika jest prosta, korzystamy z parametru <em>cursorMark</em> używając wartości zwróconej przez Solr wraz z poprzednim wynikiem wyszukiwania. Zatem nasze kolejne zapytanie wyglądałoby następująco:
</p>
<pre class="brush:bash">curl 'localhost:8983/solr/select?q=*:*&amp;rows=1&amp;sort=score+desc,id+asc&amp;cursorMark=AoIIP4AAACoxMDAtNDM1ODA1'</pre>
<h2>Podsumowanie</h2>
<p>Proste API, ogromny zysk wydajności w przypadku głębokiego stronicowania, brak konieczności zadawania zapytania do tej samej instancji Solr. Tak w skrócie można byłoby podsumować nowe możliwości stronicowania wprowadzone w Solr 4.7. Aby ponownie nie wynajdować koła, stwierdziłem, że daruje sobie testy wydajnościowe, szczególnie, że dość dokładne testy przeprowadził Chris Hostetter we swoim wpisie dostępnym pod adresem: <a href="http://searchhub.org/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/">http://searchhub.org/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2014/03/10/solr-4-7-wydajne-stronicowanie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
