<?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>sorting &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/sorting/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>Wed, 11 Nov 2020 08:12:42 +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>Sortowanie po wartościach funkcji w Solr (SOLR-1297)</title>
		<link>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/</link>
					<comments>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 28 Feb 2011 08:12:05 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[1.5]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[function sorting]]></category>
		<category><![CDATA[funkcje]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[SOLR-1297]]></category>
		<category><![CDATA[sorting]]></category>
		<category><![CDATA[sortowanie po funkcjach]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=203</guid>

					<description><![CDATA[Solr w wersji 3.1 i późniejszych otrzymał jakiś czas temu bardzo ciekawą funkcjonalność &#8211; sortowanie na podstawie wartości pomocą funkcji. Co nam to daje ? W zasadzie kilka ciekawych możliwości, o których poniżej. Na początek Pierwszy z przykładów, których przychodzi]]></description>
										<content:encoded><![CDATA[<p>Solr w wersji 3.1 i późniejszych otrzymał jakiś czas temu bardzo ciekawą funkcjonalność &#8211; sortowanie na podstawie wartości pomocą funkcji. Co nam to daje ? W zasadzie kilka ciekawych możliwości, o których poniżej.</p>
<p><span id="more-203"></span></p>
<h3>Na początek</h3>
<p>Pierwszy z przykładów, których przychodzi mi do głowy, być może ze względu na projekt nad którym  pracowałem jakiś czas temu, to sortowanie po odległości pomiędzy dwoma punktami. Do tej pory, aby zaimplementować taką funkcjonalność konieczne była zmiany w Solr (np. wdrożenie <em>LocalLucene </em>i <em>LocalSolr</em>). Korzystając z Solr 3.1 i późniejszych, możemy sortować wyniki wyszukiwania za pomocą wartości zwracanych przez zdefiniowane funkcje. Na przykład,w Solr mamy dostępną funkcję <em>dist</em> wyliczającą odległość pomiędzy dwoma punktami. Jeden z wariantów funkcji to funkcja przyjmująca pięć parametrów: algorytm i dwie pary punktów. Jeżeli, przy pomocy tej funkcji, chcielibyśmy posortować wyniki wyszukiwania rosnąco od punktu o długości i szerokości geograficznej 0,0, to wysyłając parametr <em>sort</em> w następującej postaci otrzymalibyśmy właśnie tak posortowane wyniki:
</p>
<pre class="brush:xml">...sort=dist(2, geo_x, geo_y, 0, 0) asc</pre>
<p>Podejrzewam, że najczęściej wykorzystywanymi wartościami pierwszego parametru będą:</p>
<ul>
<li><em>1</em> &#8211; kalkulacja odległości na podstawie metryki Manhattan</li>
<li><em>2</em> &#8211; kalkulacja odległości euklidesowej</li>
</ul>
<h3>Kilka słów o wydajności</h3>
<p>Wszystko pięknie, tylko jak to wygląda pod kątem wydajności ? Przeprowadziłem dwa proste testy.</p>
<p>Podczas pierwszego testu zaindeksowałem 200 tysięcy dokumentów składających się z czterech pól: identyfikatora (pole liczbowe), opis (pole typu <em>text</em>) oraz x i y (dwa pola liczbowe). Żeby nie zaciemniać wyników testu do sortowania wykorzystałem jedną z prostszych funkcji dostępnych obecnie w Solr &#8211; <em>sum</em> &#8211; sumującą dwa argumenty. Tak zdefiniowane sortowanie porównałem z sortowaniem domyślnym, czyli po wartości <em>score</em>. Poniżej tabela z wynikami:</p>
[table “11” not found /]<br />

<p>Kolejny test polegał na porównaniu sortowania po polu typu <em>string</em> do sortowania z wykorzystaniem funkcji. Przebieg testu był prawie identyczny, jak przebieg pierwszego testu &#8211; indeksacja 200.000 dokumentów (z dodatkowym polem: opis_sort<em> </em>typu <em>string</em>) oraz wykorzystanie funkcji <em>sum</em>. Poniżej tabela z wynikami:</p>
[table “12” not found /]<br />

<p>Na podstawie powyższego testu widać, iż sortowanie z wykorzystaniem funkcji jest zdecydowanie wolniejsze od domyślnego sortowania (czego można było się spodziewać). Sortowanie to jest także wolniejsze od sortowania po polu typu <em>string</em>, jednak tutaj różnica nie jest już tak znaczna, jak w poprzednim przypadku.</p>
<h3>Kilka słów na koniec</h3>
<p>Oczywiście powyższy test tylko prześlizguje się po temacie wydajności sortowania z wykorzystaniem funkcji w Solr, jednak pokazuje prostą zależność. Biorąc pod uwagę to, iż nie jest to sortowanie domyśle, a dające nam naprawdę duże możliwości konfiguracyjne wydaje mi się, że jest to funkcjonalność warta zapamiętania. Na pewno będzie sprawdzać się wtedy, kiedy wymagania mówią, iż musimy sortować po wartościach zmieniających się zarówno w zależności od zapytania, jak i od stanu indeksu &#8211; tak jak w przypadku sortowania po dystansie od podanego przez użytkownika punktu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Szybkie spojrzenie &#8211; IndexSorter</title>
		<link>https://solr.pl/2010/10/04/szybkie-spojrzenie-indexsorter/</link>
					<comments>https://solr.pl/2010/10/04/szybkie-spojrzenie-indexsorter/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 04 Oct 2010 05:38:44 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[index sorter]]></category>
		<category><![CDATA[indexsorter]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[sorting]]></category>
		<category><![CDATA[sortowanie]]></category>
		<category><![CDATA[sortowanie indeksu]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=38</guid>

					<description><![CDATA[Na konferencji Apache Lucene Eurocon 2010, która miała miejsce w maju tego roku, Andrzej Białecki w swojej prezentacji opowiadał o sposobach pozwalających uzyskać zadowalające efekty wyszukiwania korzystając z technik wcześniejszej terminacji wyszukiwania. Niestety narzędzia o których była mowa, nie były]]></description>
										<content:encoded><![CDATA[<p>Na konferencji Apache Lucene Eurocon 2010, która miała miejsce w maju  tego roku, Andrzej Białecki w swojej prezentacji opowiadał o sposobach  pozwalających uzyskać zadowalające efekty wyszukiwania korzystając z  technik wcześniejszej terminacji wyszukiwania. Niestety narzędzia o  których była mowa, nie były dostępne w Solr &#8211; to się jednak zmieniło.</p>
<p><span id="more-38"></span></p>
<p>W chwili obecnej, opisywane narzędzia dostępne są jedynie w branchu o nazwie <em>branch_3x</em> repozytorium SVN, jednak planowana jest migracja tych funkcjonalności także do wersji 4.x.</p>
<h3><strong>Ale o co chodzi ?</strong></h3>
<p>Korzystając z technik kończenia wyszukiwania po z góry ustalonym czasie,  nie oglądając się na ilość wyników wyszukiwania, trafiamy w pewnym  momencie na problem jakości wyników wyszukiwania. Zamiast otrzymywania  najlepszych, w kontekście danego wyszukiwania, wyników otrzymujemy je w  sposób losowy. Oznacza to, że nie jesteśmy w stanie zapewnić, iż  użytkownik korzystający z systemu dostanie najlepiej dopasowane wyniki.  Oczywiście dalej mówimy o sytuacji, kiedy kończymy wyszukiwanie po z  góry ustalonym czasie i nie dajemy Solr możliwości zebrania wszystkich  dokumentów pasujących do zapytania.</p>
<h3><strong>Po co mi to ?</strong></h3>
<p>Kiedy kończenie wyszukiwania po z góry ustalonym czasie może być  przydatne ? Istnieje wiele zastosowań takiego wyszukiwania. Wyobraźmy  sobie, że nasze wdrożenie składa się z wielu oddzielnych shardów, które  operują na dużej ilości danych każdy. W przypadku zadania zapytania,  każdy z shardów musi być odpytany o odpowiednie dokumenty, następnie  wszystkie wyniki muszą być złożone razem i wyświetlone użytkownikowi  końcowemu (oczywiście nie musi być to człowiek, może być to aplikacja).  Co jednak, jeżeli każdy z shardów potrzebuje bardzo długiego czasu na  przetworzenie wszystkich wyników wyszukiwania, a nas interesują np.  tylko te dodane w ostatnim czasie (np. w ostatnim tygodniu). Tutaj  właśnie mamy możliwość wcześniejszego zakończenia wyszukiwanie &#8211;  zakładając, że bardziej interesują nas dokumenty dodane poprzedniego  dnia, niż dwa tygodnie wcześniej.</p>
<h3><strong>Jak to zrealizować ?</strong></h3>
<p>Powyższy przykład pokazuje, przypadek kiedy możemy zastosować  wyszukiwanie zakończone po określonym z góry czasie. Jednak  zastanawiając się dalej trafiamy na pewien problem &#8211; aby posortować  wyniki wyszukiwania Solr musi pobrać je wszystkie. Czyli stosując w  zapytaniu parametr <em>sort=added+desc</em>, aby uzyskać poprawnie posortowane  dokumenty i tak każdy z shardów musiałby zwrócić wszystkie wyniki  wyszukiwania (oczywiście wszystkie w rozumieniu pojedynczego indeksu),  czyli nici z wcześniejszego zakończenia wyszukiwania ? Nie do końca.  Tutaj właśnie z pomocą przychodzi nam narzędzie IndexSorter, które do  tej pory dostępne było tylko w projekcie Nutch, a od niedawna dostępne  jest także w Lucene i Solr. Dzięki temu narzędziu możemy posortować  wstępnie indeks według odpowiadającego nam parametru. Zatem sortując  indeks malejąco po dacie dodania dokumentu, Solr pobierałby najpierw  dokumenty, które zostały dodanie najpóźniej, a tym samym mielibyśmy  możliwość zakończenia wyszukiwania po z góry ustalonym czasie.</p>
<h3><strong>Korzystanie z IndexSorter</strong></h3>
<p>Co zrobić, aby skorzystać z narzędzia IndexSorter ? Prawdę  powiedziawszy, nie jest to nic skomplikowanego. Należy jednak pamiętać,  że w momencie publikacji tego wpisu narzędzie to dostępne jest tylko w  branchu o nazwie <em>branch_3x</em>. Aby posortować indeks na podstawie  jakiegoś pola należy wywołać następującą komendę z linii poleceń  (oczywiście pamiętając o odpowiednim umiejscowieniu biblioteki  <em>lucene-misc-3.1.jar</em> z klasą IndexSorter &#8211; po wybudowaniu projektu  znajdziemy ją w katalogu <em>lucene/build/contrib/misc</em>):
</p>
<pre class="brush:bash">java IndexSorter KATALOG_ŹRÓDŁOWY KATALOG_DOCELOWY NAZWA_POLA</pre>
<p>Poszczególne parametry oznaczają:</p>
<ul>
<li><em>KATALOG_ŹRÓDŁOWY </em>&#8211; katalog z indeksem który chcemy posortować,</li>
<li><em>KATALOG_DOCELOWY</em> &#8211; katalog, gdzie zostanie zapisany posortowany indeks,</li>
<li><em>NAZWA_POLA </em>&#8211; pole, po jakim zostanie posortowany indeks.</li>
</ul>
<p>Jeżeli wszystko przebiegło poprawnie to na ekranie powinniśmy dostać informację w stylu:
</p>
<pre class="brush:bash">IndexSorter: done, 896 total milliseconds</pre>
<h3><strong>Na koniec</strong></h3>
<p>Moim zdaniem Lucene i Solr dostały właśnie bardzo ciekawą funkcjonalność, która może być wykorzystana wszędzie tam, gdzie <strong> </strong>ilość  danych jest bardzo duża, czas odpowiedzi nie może przekroczyć pewnej  granicy, a wyniki poza pierwszymi (pierwszych 100, czy 1000) nie są  znaczące. Wszystkich bardziej zainteresowanych tematem sortowania  indeksu oraz technikami dzielenia indeksu zapraszam do obejrzenia  slajdów z prezentacji pod tytułem &#8222;<em>Munching and Crunching: Lucene Index  Post-Processing</em>&#8221; (<a href="http://lucene-eurocon.org/slides/Munching-&amp;-crunching-Lucene-index-post-processing-and-applications_Andrzej-Bialecki.pdf" target="_blank" rel="noopener noreferrer">slajdy</a>) prowadzonej Andrzeja Białeckiego na  konferencji Lucene Eurocon 2010, który omawiał te tematy.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/10/04/szybkie-spojrzenie-indexsorter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
