<?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>field &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/field/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>Sat, 14 Nov 2020 08:47:11 +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 6.5 i pola typu large &#8211; szybkie spojrzenie</title>
		<link>https://solr.pl/2017/05/01/solr-6-5-i-pola-typu-large-szybkie-spojrzenie/</link>
					<comments>https://solr.pl/2017/05/01/solr-6-5-i-pola-typu-large-szybkie-spojrzenie/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 01 May 2017 07:46:43 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[document]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=722</guid>

					<description><![CDATA[Jak wiadomo Solr posiada różne możliwości jeżeli chodzi o cachowanie danych &#8211; filterCache dla filtrów, queryResultCache dla wyników zapytań oraz documentCache do cachowania zapytań do szybkiego ich pobierania. Skupimy się dzisiaj na tym ostatnim i co możemy zrobić, aby wykorzystać]]></description>
										<content:encoded><![CDATA[<p>Jak wiadomo Solr posiada różne możliwości jeżeli chodzi o cachowanie danych &#8211; <em>filterCache</em> dla filtrów, <em>queryResultCache</em> dla wyników zapytań oraz <em>documentCache</em> do cachowania zapytań do szybkiego ich pobierania. Skupimy się dzisiaj na tym ostatnim i co możemy zrobić, aby wykorzystać go bardziej optymalnie.</p>
<p><span id="more-722"></span></p>
<h3>Problem</h3>
<p>Kiedy <em>documentCache</em> włączony jest w konfiguracji, po pobraniu dokumentu z Lucene jest on umieszczany w pamięci i trzymany tam do chwili usunięcia z <em>documentCache</em> (czy to przez wielkość cache lub commit). Taka operacja może być dosyć kosztowna &#8211; szczególnie dla dużych dokumentów. Możemy wyobrazić sobie dokumenty, które reprezentują treść strony uzyskanej przez skanowanie tekstu z książki. Problem polega na tym, że każdy wpis w <em>documentCache</em>, jeżeli nie jest ponownie użyty kwalifikuje się jako śmieć. Im więcej śmieci tym więcej pracy musi wykonać garbage collector, a tym samym Solr traci cykle procesora na ten proces zamiast na obsługę zapytań i indeksowanie danych. Może się to oczywiście wiązać z gorszą wydajnością. Na szczęście, zaczynając od Solr 6.5 jesteśmy sobie w stanie z tym poradzić, przynajmniej dla dużych pól typu <em>stored</em>.</p>
<h3>Oznaczenie pola jako large</h3>
<p>Zaczynając od Solr 6.5 dostaliśmy możliwość dodania dodatkowego atrybutu do definicji pola. W przypadku, kiedy nasze pole tekstowe ustawione jest jako <em>stored=&#8221;true&#8221;</em> oraz <em>multiValued=&#8221;false&#8221;</em> możemy dodać do niego atrybut <em>large</em> przyjmujący wartości <em>true</em> lub <em>false</em> (domyślnie <em>false</em>). Tak zdefiniowane pole nie będzie automatycznie umieszczane w <em>documentCache</em>, a umieszczana będzie jedynie referencja do niego z możliwością późniejszego załadowania.</p>
<h3>Sprawdźmy różnicę</h3>
<p>Ze względu na to, że jest to wpis typu <em>szybkie spojrzenie</em> nie będziemy wgłębiać się w kod i szczegóły, a jedynie sprawdzimy dwie kolekcje z tymi samymi danymi i polami. Struktura kolekcji składać się będzie z następujących pól:</p>
<ul>
<li><em>id</em> &#8211; identtyfikator dokumentu,</li>
<li><em>name</em> &#8211; nazwa dokumentu,</li>
<li><em>body</em> &#8211; treść dokumentu, która w założeniach może być bardzo duża.</li>
</ul>
<p>Jedna z kolekcji będzie miała ustawiony atrybut <em>large=&#8221;true&#8221;</em> dla pola <em>body</em>. Dodatkowo zaindeksujemy kilka dokumentów w celu sprawdzenia zachowania się Solr w przypadku obu konfiguracji.</p>
<p>Jeżeli mielibyście ochotę przeprowadzić ten sam test, poniżej przedstawiamy komendy użyte do jego przeprowadzenia (wszystkie pliki pochodzą z naszego konta na Github (<a href="https://github.com/solrpl/">https://github.com/solrpl/</a>). Test polegał będzie na stworzeniu kolekcji, zaindeksowaniu danych, zadaniu zapytania, zebraniu statystyk. Powtórzymy go dla każdej z kolekcji za każdym razem uruchamiają nową, pustą instancję Solr. Wykorzystane komendy wyglądają następująco:
</p>
<pre class="brush:xml">$ mkdir /tmp/solr
$ mkdir /tmp/solr/collection_with_large
$ mkdir /tmp/solr/collection_without_large
$ wget https://github.com/solrpl/blog/tree/master/posts/large_field/data.xml /tmp/solr/data.xml
$ wget https://github.com/solrpl/blog/tree/master/posts/large_field/collection_with_large/managed-schema /tmp/solr/collection_with_large/managed-schema
$ wget https://github.com/solrpl/blog/tree/master/posts/large_field/collection_with_large/solrconfig.xml /tmp/solr/collection_with_large/solrconfig.xml
$ wget https://github.com/solrpl/blog/tree/master/posts/large_field/collection_without_large/managed-schema /tmp/solr/collection_without_large/managed-schema
$ wget https://github.com/solrpl/blog/tree/master/posts/large_field/collection_without_large/solrconfig.xml /tmp/solr/collection_without_large/solrconfig.xml
$ bin/solr zk upconfig -z localhost:9983 -n config_with_large -d /tmp/collection_with_large
$ bin/solr create_collection -c collection_with_large -n config_with_large -shards 1 -replicationFactor 1
$ curl -XPOST 'localhost:8983/solr/collection_with_large/update?commit=true' -H 'Content-Type:application/xml' --data-binary @/tmp/solr/data.xml
$ curl 'localhost:8983/solr/collection_with_large/select?q=*:*'</pre>
<p>A teraz stwórzmy drugą kolekcję używają pobranych danych:
</p>
<pre class="brush:xml">$ bin/solr zk upconfig -z localhost:9983 -n config_without_large -d /tmp/collection_without_large
$ bin/solr create_collection -c collection_without_large -n config_without_large -shards 1 -replicationFactor 1
$ curl -XPOST 'localhost:8983/solr/collection_without_large/update?commit=true' -H 'Content-Type:application/xml' --data-binary @/tmp/solr/data.xml
$ curl 'localhost:8983/solr/collection_without_large/select?q=*:*'</pre>
<p>Sprawdźmy teraz, jak wygląda wykorzystanie <em>documentCache</em> oraz co można znaleźć w jego środku. Tak wygląda&nbsp;<em>documentCache</em> w przypadku kolekcji z polem <em>body</em> oznaczonym jako <em>large=&#8221;true&#8221;</em>:</p>
<p><a href="http://solr.pl/wp-content/uploads/2017/04/field_with_large.png"><img decoding="async" class="aligncenter wp-image-3945 size-medium" src="http://solr.pl/wp-content/uploads/2017/04/field_with_large-300x65.png" alt="" width="300" height="65"></a></p>
<p>A tak wygląda wykorzystanie <em>documentCache</em> z polem <em>body</em> bez oznaczenia jako <em>large=&#8221;true&#8221;</em>:</p>
<p><a href="http://solr.pl/wp-content/uploads/2017/04/field_without_large.png"><img decoding="async" class="aligncenter wp-image-3946 size-medium" src="http://solr.pl/wp-content/uploads/2017/04/field_without_large-300x70.png" alt="" width="300" height="70"></a></p>
<p>Jak łatwo zauważyć pole oznaczone jako <em>large=&#8221;true&#8221;</em> nie zostało dodane do <em>documentCache</em> bezpośrednio, a została dodana &#8222;leniwa&#8221; referencja, która może być wykorzystana w razie potrzeby. Pozwala to na zmniejszenie rozmiaru dokumentów umieszczonych w <em>documentCache</em>, a tym samym mniejsze obciążenie pamięci i mniej pracy dla garbage collectora, co powinno przełożyć się na trochę lepszą wydajność Solr.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2017/05/01/solr-6-5-i-pola-typu-large-szybkie-spojrzenie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 4.1: Kompresja pól typu stored</title>
		<link>https://solr.pl/2012/11/19/solr-4-1-kompresja-pol-typu-stored/</link>
					<comments>https://solr.pl/2012/11/19/solr-4-1-kompresja-pol-typu-stored/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 19 Nov 2012 22:39:23 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[kompresja]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=437</guid>

					<description><![CDATA[Pomimo tego, że wersja 4.0 Solr i Lucene jest jeszcze bardzo świeża stwierdziliśmy, że czas przyjrzeć się zmianom nadchodzącym w wersji 4.1. Jedną z tych zmian jest wprowadzenie kompresji dla pól typu stored, a tym samym zmniejszenie wielkości indeksu, kiedy]]></description>
										<content:encoded><![CDATA[<p>Pomimo tego, że wersja 4.0 Solr i Lucene jest jeszcze bardzo świeża stwierdziliśmy, że czas przyjrzeć się zmianom nadchodzącym w wersji 4.1. Jedną z tych zmian jest wprowadzenie kompresji dla pól typu stored, a tym samym zmniejszenie wielkości indeksu, kiedy korzystamy z przechowywania oryginalnej wartości pól. Zobaczmy więc, jak to działa.</p>
<p><span id="more-437"></span></p>
<h3>Trochę teorii</h3>
<p>W przypadku kiedy nasz indeks składa się z dużej ilości pól oznaczonych jako <em>stored</em> mogą one stanowić nawet większą część miejsca zajmowanego przez indeks. Skąd wiedzieć ile zajmują pola typu <em>stored</em> ? Wystarczy spojrzeć do katalogu z indeksem i policzyć ile zajmują pliki z rozszerzeniem&nbsp;.fdt. Pomimo tego, że duża ilość pól tego typu nie wpływa bezpośrednio na wydajność Solr, to jednak wielkość indeksu wpływa na to jak zachowuje się cache I/O, a tym samym, im większy indeks, tym bardziej prawdopodobne, że będziemy mieli dość dużo operacji odczytu, a tym samym nasze zapytania będą wykonywane wolniej. Do tego, ze względu na to, że musimy zapisać więcej danych &#8211; indeksowanie także będzie wolniejsze.</p>
<p>Wraz z Lucene 4.1 pola oznaczone jako <em>stored</em> będą kompresowane algorytmem LZ4 (<a href="http://code.google.com/p/lz4/">http://code.google.com/p/lz4/</a>), który powinien znacznie zmniejszyć wielkość indeksu, gdy korzystamy z dużej ilości tego typu pól, a jednocześnie nie powinien mocno obciążać maszyny podczas wykonywania kompresji.</p>
<h3>Dane testowe</h3>
<p>Do testów wykorzystaliśmy dane polskiej wikipedii z dnia 2012.11.10 zawierające artykuły (<a href="http://dumps.wikimedia.org/plwiki/20121110/plwiki-20121110-pages-articles.xml.bz2" target="_blank" rel="noopener noreferrer">http://dumps.wikimedia.org/plwiki/20121110/plwiki-20121110-pages-articles.xml.bz2</a>). Rozpakowany plik XML z danymi zajmował około 4.7GB.</p>
<h3>Struktura indeksu</h3>
<p>Następująca struktura indeksu została przygotowana, aby zaindeksować powyższe dane:
</p>
<pre class="brush:xml">&lt;field name="id" type="string"&nbsp; indexed="true" stored="true" required="true"/&gt;
&lt;field name="title" type="text" indexed="true" stored="true"/&gt;
&lt;field name="revision" type="int" indexed="true" stored="true"/&gt;
&lt;field name="user" type="string" indexed="true" stored="true"/&gt;
&lt;field name="userId" type="int" indexed="true" stored="true"/&gt;
&lt;field name="text" type="text" indexed="true" stored="true"/&gt;
&lt;field name="timestamp" type="date" indexed="true" stored="true"/&gt;
&lt;field name="_version_" type="long" indexed="true" stored="true"/&gt;</pre>
<h3>Konfiguracja DIH</h3>
<p>Konfiguracja DIH użyta do importu danych Wikipedii wyglądała następująco:
</p>
<pre class="brush:xml">&lt;dataConfig&gt;
 &lt;dataSource type="FileDataSource" encoding="UTF-8" /&gt;
 &lt;document&gt;
  &lt;entity name="page" processor="XPathEntityProcessor" stream="true" forEach="/mediawiki/page/" url="/home/data/wikipedia/plwiki-20121110-pages-articles.xml" transformer="RegexTransformer,DateFormatTransformer"&gt;
   &lt;field column="id" xpath="/mediawiki/page/id" /&gt;
   &lt;field column="title" xpath="/mediawiki/page/title" /&gt;
   &lt;field column="revision" xpath="/mediawiki/page/revision/id" /&gt;
   &lt;field column="user" xpath="/mediawiki/page/revision/contributor/username" /&gt;
   &lt;field column="userId" xpath="/mediawiki/page/revision/contributor/id" /&gt;
   &lt;field column="text" xpath="/mediawiki/page/revision/text" /&gt;
   &lt;field column="timestamp" xpath="/mediawiki/page/revision/timestamp" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" /&gt;
   &lt;field column="$skipDoc" regex="^#REDIRECT .*" replaceWith="true" sourceColName="text"/&gt;
  &lt;/entity&gt;
 &lt;/document&gt;
&lt;/dataConfig&gt;</pre>
<h3>Czas indeksowania</h3>
<p>Czas indeksowania był bardzo podobny w obu przypadkach dla tej samej liczby dokumentów, dokładnie było ich 1.301.394. W przypadku <strong>Solr 4.0</strong> czas indeksowania wyniósł <strong>14 minut i 33 sekundy</strong>, w przypadku <strong>Solr 4.1</strong> wyniósł <strong>14 minut i 43 sekundy</strong>. Zatem Solr 4.1 był minimalnie wolniejszy, a ze względu na to, że test był wykonywany na moim laptopie, można przyjąć iż wydajność indeksowania będzie podobna.</p>
<h3>Wielkość wynikowego indeksu</h3>
<p>Wielkość indeksu, czyli to co nas najbardziej interesuje. W przypadku <strong>Solr 4.0</strong> indeks, który powstał w wyniku zaindeksowania danych miał około <strong>5.1GB</strong>, czyli dokładnie <strong>5.464.809.863</strong> bajtów. W przypadku Solr 4.1 rozmiar indeksu wyniósł około <strong>3.24GB</strong>, czyli dokładnie <strong>3.480.457.399</strong> bajtów. Zatem porównyjąc indeks stworzony przez Solr 4.0 do indeksu stworzonego przez Solr 4.1 zyskaliśmy około <strong>35%</strong> miejsca na dysku.</p>
<h3>Podsumowanie</h3>
<p>Widać jak na dłoni, iż zysk z kompresowania pól oznaczonych jako <em>stored</em> jest duży. Pomimo tego, iż potrzebna jest dodatkowa moc procesora na kompresję i dekompresję danych, zysk polegający na zmniejszeniu obciążenia I/O będzie większy, niż strata cykli procesora. Nie dziwię się zatem, iż kompresja pól oznaczonych jako <em>stored</em> jest włączona domyślnie w Lucene 4.1, a zatem i w Solr 4.1. Jeżeli jednak chcielibyśmy wyłączyć to zachowanie, na chwilę obecną konieczna jest własna implementacja odpowiedniego codec&#8217;a, który nie korzysta z kompresji. Jednak aby skorzystać z własnego formatu indeksu nie musimy utrzymywać własnej wersji Lucene, co znów pokazuje potęgę codec&#8217;ów wprowadzonych wraz z Lucene 4.0.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2012/11/19/solr-4-1-kompresja-pol-typu-stored/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 3.6: CurrencyField</title>
		<link>https://solr.pl/2012/03/19/solr-3-6-currencyfield/</link>
					<comments>https://solr.pl/2012/03/19/solr-3-6-currencyfield/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 19 Mar 2012 22:26:31 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[currency]]></category>
		<category><![CDATA[currencyfield]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[pole]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[solr 3.6]]></category>
		<category><![CDATA[waluta]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=406</guid>

					<description><![CDATA[Solr 3.6 przyniesie ciekawą funkcjonalność w postaci obsługi walut. Ktoś mógłby zapytać: &#8222;Po co ? Przecież wystarczy typ zmiennoprzecinkowy i mamy obsługę walut&#8221;. Przyjrzyjmy się zatem co da nam solr.CurrencyField w Solr 3.6. Konfiguracja Zacznijmy od konfiguracji komponentu, która jest]]></description>
										<content:encoded><![CDATA[<p>Solr 3.6 przyniesie ciekawą funkcjonalność w postaci obsługi walut. Ktoś mógłby zapytać: &#8222;Po co ? Przecież wystarczy typ zmiennoprzecinkowy i mamy obsługę walut&#8221;. Przyjrzyjmy się zatem co da nam <em>solr.CurrencyField</em> w Solr 3.6.</p>
<p><span id="more-406"></span></p>
<h3>Konfiguracja</h3>
<p>Zacznijmy od konfiguracji komponentu, która jest standardowa jeżeli chodzi o Solr. Do pliku <em>schema.xml</em> dodajemy po prostu kolejny wpis, np. w takiej postaci:
</p>
<pre class="brush:xml">&lt;fieldType class="solr.CurrencyField" name="currencyField" defaultCurrency="USD" currencyConfig="currencyExchange.xml" /&gt;</pre>
<p>W powyższej konfiguracji typu pojawiają się dwa dodatkowe atrybutu, które określają zachowanie pól typu <em>currencyField</em>. Po pierwsze to parametr <em>defaultCurrency</em>, który określa domyślną walutę dla pola. Raz zdefiniowany określa w jakiej formie dane będą zapisywane w indeksie (zmiana wartości wymaga reindeksacji danych). Drugi atrybut, <em>currencyConfig</em> określa plik z kursami wymiany pomiędzy walutami. Warto pamiętać, iż parametr ten ma sens tylko dla domyślnego providera wymiany (<em>FileExchangeRateProvider</em>) dostarczanego z Solr. Przyjrzyjmy się zatem plikowi <em>currencyExchange.xml</em>:</p>
<h3>Plik definicji wymiany walut dla FileExchangeRateProvider</h3>
<p>Poniżej przedstawiam zawartość pliku <em>currencyExchange.xml</em> zawierającego przykładowe przeliczniki kursów walut dla domyślnego providera wymiany dostarczanego razem z Solr.
</p>
<pre class="brush:xml">&lt;currencyConfig version="1.0"&gt;
 &lt;rates&gt;
  &lt;rate from="USD" to="PLN" rate="3.1"/&gt;
  &lt;rate from="EUR" to="PLN" rate="2.5"/&gt;
  &lt;rate from="USD" to="EUR" rate="2.5"/&gt;
 &lt;/rates&gt;
&lt;/currencyConfig&gt;</pre>
<p>Jak widać plik ma dość prostą strukturę, podajemy walutę wejściową (<em>from</em>), walutę wyjściową (<em>to</em>) oraz przelicznik (<em>rate</em>). Nic prostszego <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3>Indeksowanie danych</h3>
<p>Aby poprawnie zaindeksować dane zawierając nasz zdefiniowany typ <em>currencyField</em> należy podać wartość, a następnie symbol waluty oddzielony przecinkiem. Na przykład:
</p>
<pre class="brush:xml">&lt;field name="price"&gt;21.99,EUR&lt;/field&gt;</pre>
<h3>Zadawanie zapytań</h3>
<p>Zadawanie zapytań wygląda analogicznie do indeksowania. Oprócz samej informacji o wartościach musimy także przekazać informację o walucie na jakiej Solr ma dokonywać operacji. Poniżej przykłady wykorzystujące filtrowanie po wartości oraz przedziale wartości:
</p>
<pre class="brush:xml">fq=price:29.99,PLN</pre>
<pre class="brush:xml">fq=price:[10.00 TO 29.99,EUR]</pre>
<p>Jak widać, po podaniu interesujących nas wartości dodajemy przecinek, a następnie podajemy oznaczenie waluty. Co więcej, możemy skorzystać z walut zdefiniowanych wcześniej w pliku wymiany. Oznacza to, że Solr może za nas dokonać automatycznej zamiany <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Pomimo możliwości automatycznej zmiany wyszukiwanej waluty wyniki zwracane są zawsze w tej zdefiniowanej jako domyślna i na razie nie ma możliwości zmiany tego zachowania.</p>
<h3>Własny provider wymiany walut</h3>
<p>Solr, oprócz domyślnego provider&#8217;a wymiany walut, umożliwia napisanie własnego. Aby to zrobić musimy stworzyć klasę implementującą interfejs <em>org.apache.solr.schema.ExchangeRateProvider</em> oraz podać naszą klasę w jako wartość atrybutu <em>providerClass</em> dla zdefiniowanego typu. Zakładając, iż mamy klasę <em>pl.solr.schema.DynamicRateExchangeProvider</em> implementującą w/w interfejs i chcemy z niej skorzystać, definicja typu mogłaby wyglądać następująco:
</p>
<pre class="brush:xml">&lt;fieldType class="solr.CurrencyField" name="currencyField" defaultCurrency="USD" providerClass="pl.solr.schema.DynamicRateExchangeProvider" /&gt;</pre>
<p>Osobiście bardzo podoba mi się ta możliwość, ponieważ zyskujemy możliwość dynamicznego pobierania kursów wymiany np. poprzez webservice.</p>
<h3>Co zostało do implementacji</h3>
<p>W chwili pisania i publikacji tego wpisu, pola typu <em>CurrencyField</em> nie są obsługiwane w przypadku facetingu po zakresach.</p>
<h3>Podsumowanie</h3>
<p>Moim zdaniem <em>CurrencyField</em> jest całkiem ciekawą funkcjonalnością uwalniającą nas od przeliczania waluty po stronie aplikacji. Zamiast tego, w Solr 3.6, otrzymamy narzędzie, które umożliwi nam wyszukiwanie z automatycznym przeliczaniem waluty po stronie Solr. Dodatkowo, jeżeli pokusimy się o implementację własnego mechanizmu dostarczania przeliczników wymiany możemy otrzymać całkiem fajny w użyciu mechanizm, który sam pobierze waluty z odpowiadającego nam źródła, sam będzie je dynamiczne przeliczał, a nam zostanie tylko zadawanie zapytań <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2012/03/19/solr-3-6-currencyfield/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Szybkie spojrzenie &#8211; FieldCollapsing</title>
		<link>https://solr.pl/2010/09/20/szybkie-spojrzenie-fieldcollapsing/</link>
					<comments>https://solr.pl/2010/09/20/szybkie-spojrzenie-fieldcollapsing/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 20 Sep 2010 04:27:07 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[collapsing]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[fieldcollapsing]]></category>
		<category><![CDATA[grouping]]></category>
		<category><![CDATA[grupowanie]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[lucene 4.0]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[solr 4.0]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=34</guid>

					<description><![CDATA[FieldCollapsing, czyli inaczej grupowanie wyników wyszukiwania &#8211; funkcjonalność nad którą developerzy Lucene/Solr pracowali już od dłuższego czasu trafiła właśnie do repozytorium projektu Solr. Postanowiłem się przyjrzeć, w jaki sposób działa ta funkcjonalność. Na początek mała informacja, FieldCollapsing dostępny jest tylko]]></description>
										<content:encoded><![CDATA[<p>FieldCollapsing, czyli inaczej grupowanie wyników wyszukiwania &#8211;  funkcjonalność nad którą developerzy Lucene/Solr pracowali już od  dłuższego czasu trafiła właśnie do repozytorium projektu Solr.  Postanowiłem się przyjrzeć, w jaki sposób działa ta funkcjonalność.</p>
<p><span id="more-34"></span></p>
<p>Na początek mała informacja, FieldCollapsing dostępny jest tylko w  wersji 4.0, czyli w wersji rozwojowej kodu projektu Solr i raczej mało  prawdopodobnym jest przeniesienie tej funkcjonalności do wersji 3.X.</p>
<h3><strong>FieldCollapsing, czyli co ?</strong></h3>
<p>Wyobraźmy sobie, iż nasz indeks zawiera informacje o firmach z  różnych miast. Chcemy pokazać  użytkownikowi po jednej (lub np. dwie,  czy trzy) firmie z każdego miasta, oczywiście firmie spełniającej  kryteria wyszukiwania. W jaki sposób tego dokonać &#8211; wykorzystać właśnie  mechanizm FieldCollapsing. Pozwala on na grupowanie zwróconych w wyników  wyszukiwania na podstawie zawartości pól. Wyniki wyszukiwania mogą być  zgrupowane do pojedynczego dokumentu, bądź stałej ich ilości.</p>
<h3><strong><strong>Parametry</strong></strong></h3>
<p>Podobnie, jak w przypadku większości funkcjonalności dostępnych w  Solr, tak samo zachowanie mechanizmu FieldCollapsing można konfigurować  szeregiem parametrów, oto one:</p>
<ul>
<li><em>group</em> &#8211; analogicznie do np. facetingu ustawienie tego parametru na wartość <em>true</em> włącza mechanizm FieldCollapsing. Wartość domyślna parametru to <em>false</em>.</li>
<li><em>group.field</em> &#8211; określenie na podstawie jakiego pola ma się odbywać grupowanie.</li>
<li><em>group.func</em> &#8211; określenie funkcji, na podstawie wyniku której będzie odbywać się grupowanie.</li>
<li><em>group.limit</em> &#8211; ilość wyników jaka ma być zwrócona w poszczególnych grupach. Domyślna wartość parametru to 1.</li>
<li><em>group.sort</em> &#8211; parametr określający w jaki sposób sortować dokumenty w ramach grup. Wartość domyślna, to wartość <em>score desc</em>.</li>
</ul>
<p>Warto podkreślić, iż parametr <em>rows</em> przekazywany do zapytania  będzie określał ilość grup jaka ma zostać zwrócona w wynikach  wyszukiwania, a nie ilość pojedynczych dokumentów. Zmienia się także  zachowanie parametru <em>sort</em>. Parametr ten będzie sortował grupy  wyników, a nie poszczególne dokumenty. Grupy będą sortowane na podstawie  zawartości pól pierwszych dokumentów tworzących grupy.</p>
<h3><strong>Wyniki wyszukiwania</strong></h3>
<p>Wyniki wyszukiwania różnią się od tych do których jesteśmy  przyzwyczajeni. Są one pogrupowane według parametrów, które  przekazaliśmy. Głównym elementem wyników wyszukiwania nie są już  poszczególne dokumenty, a grupy dokumentów. Dopiero w ramach grup  pokazywane są dokumenty (ich ilość definiuje parametr <em>group.limit</em>). Na przykład, zadając zapytanie:
</p>
<pre class="brush:xml">http://localhost:8983/solr/select/?q=*:*&amp;group=true&amp;group.field=inStock&amp;indent=true</pre>
<p>do indeksu, który powstał poprzez zaindeksowanie wszystkich dokumentów w formacie XML z katalogu <em>exampledocs</em> przykładowego wdrożenia dostarczanego z Solr, otrzymujemy następujący wynik:
</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;0&lt;/int&gt;
  &lt;lst name="params"&gt;
    &lt;str name="group.field"&gt;inStock&lt;/str&gt;
    &lt;str name="group"&gt;true&lt;/str&gt;
    &lt;str name="indent"&gt;true&lt;/str&gt;
    &lt;str name="q"&gt;*:*&lt;/str&gt;
  &lt;/lst&gt;
&lt;/lst&gt;
&lt;lst name="grouped"&gt;
  &lt;lst name="inStock"&gt;
    &lt;int name="matches"&gt;19&lt;/int&gt;
    &lt;arr name="groups"&gt;
     &lt;lst&gt;
        &lt;str name="groupValue"&gt;T&lt;/str&gt;
        &lt;result name="doclist" numFound="15" start="0"&gt;
          &lt;doc&gt;
            &lt;arr name="cat"&gt;&lt;str&gt;electronics&lt;/str&gt;&lt;str&gt;hard drive&lt;/str&gt;&lt;/arr&gt;
            &lt;arr name="features"&gt;&lt;str&gt;7200RPM, 8MB cache, IDE Ultra ATA-133&lt;/str&gt;&lt;str&gt;NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor&lt;/str&gt;&lt;/arr&gt;
            &lt;str name="id"&gt;SP2514N&lt;/str&gt;
            &lt;bool name="inStock"&gt;true&lt;/bool&gt;
            &lt;str name="manu"&gt;Samsung Electronics Co. Ltd.&lt;/str&gt;
            &lt;date name="manufacturedate_dt"&gt;2006-02-13T15:26:37Z&lt;/date&gt;
            &lt;str name="name"&gt;Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133&lt;/str&gt;
            &lt;int name="popularity"&gt;6&lt;/int&gt;
            &lt;float name="price"&gt;92.0&lt;/float&gt;
            &lt;str name="store"&gt;45.17614,-93.87341&lt;/str&gt;
            &lt;double name="store_0_d"&gt;45.17614&lt;/double&gt;
            &lt;double name="store_1_d"&gt;-93.87341&lt;/double&gt;
            &lt;str name="store_lat_lon"&gt;45.17614,-93.87341&lt;/str&gt;
          &lt;/doc&gt;
        &lt;/result&gt;
      &lt;/lst&gt;
      &lt;lst&gt;
        &lt;str name="groupValue"&gt;F&lt;/str&gt;
        &lt;result name="doclist" numFound="4" start="0"&gt;
          &lt;doc&gt;
            &lt;arr name="cat"&gt;&lt;str&gt;electronics&lt;/str&gt;&lt;str&gt;connector&lt;/str&gt;&lt;/arr&gt;
            &lt;arr name="features"&gt;&lt;str&gt;car power adapter, white&lt;/str&gt;&lt;/arr&gt;
            &lt;str name="id"&gt;F8V7067-APL-KIT&lt;/str&gt;
            &lt;bool name="inStock"&gt;false&lt;/bool&gt;
            &lt;str name="manu"&gt;Belkin&lt;/str&gt;
            &lt;date name="manufacturedate_dt"&gt;2005-08-01T16:30:25Z&lt;/date&gt;
            &lt;str name="name"&gt;Belkin Mobile Power Cord for iPod w/ Dock&lt;/str&gt;
            &lt;int name="popularity"&gt;1&lt;/int&gt;
            &lt;float name="price"&gt;19.95&lt;/float&gt;
            &lt;str name="store"&gt;45.17614,-93.87341&lt;/str&gt;
            &lt;double name="store_0_d"&gt;45.17614&lt;/double&gt;
            &lt;double name="store_1_d"&gt;-93.87341&lt;/double&gt;
            &lt;str name="store_lat_lon"&gt;45.17614,-93.87341&lt;/str&gt;
            &lt;float name="weight"&gt;4.0&lt;/float&gt;
          &lt;/doc&gt;
        &lt;/result&gt;
      &lt;/lst&gt;
    &lt;/arr&gt;
  &lt;/lst&gt;
&lt;/lst&gt;
&lt;/response&gt;</pre>
<h3><strong>Na koniec</strong></h3>
<p>Ciekawa funkcjonalność, która na pewno znajdzie zastosowania w  niektórych wdrożeniach. Należy jednak pamiętać, iż funkcjonalność ta  będzie jeszcze rozwijana. Jak na razie nie ma wsparcia m.in. dla  wyszukiwania rozproszonego<strong>, </strong>czy grupowania po polach  wielowartościowych. W tym momencie nie ma sensu przeprowadzanie też  testów wydajnościowych, po pierwsze ze względu na zmiany jakie zajdą w  samym mechanizmie, a po drugie ze względu na to, iż jest to mocno  rozwojowa wersja Lucene i Solr. Niemniej jednak, na pewno będę miał  opisywaną funkcjonalność na oku <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong><br />
</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/09/20/szybkie-spojrzenie-fieldcollapsing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
