<?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>zdjęcia &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/zdjecia/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 22:24: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>Prosta wyszukiwarka zdjęć</title>
		<link>https://solr.pl/2012/02/20/prosta-wyszukiwarka-zdjec/</link>
					<comments>https://solr.pl/2012/02/20/prosta-wyszukiwarka-zdjec/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 20 Feb 2012 22:24:17 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[exif]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[tika]]></category>
		<category><![CDATA[wyszukiwanie]]></category>
		<category><![CDATA[zdjęcia]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=400</guid>

					<description><![CDATA[Mieliśmy niedawno okazję pomocy przy tworzeniu niekomercyjnego projektu, którego częścią była wyszukiwarka. Jednym z założeń, trochę pobocznych, było wyszukiwanie zdjęć, aby korzystający mogli bardzo szybko dotrzeć do interesujących ich obrazów. Wyszukiwarka miała działać w oparciu o meta dane zapisane w]]></description>
										<content:encoded><![CDATA[<p>Mieliśmy niedawno okazję pomocy przy tworzeniu niekomercyjnego projektu, którego częścią była wyszukiwarka. Jednym z założeń, trochę pobocznych, było wyszukiwanie zdjęć, aby korzystający mogli bardzo szybko dotrzeć do interesujących ich obrazów. Wyszukiwarka miała działać w oparciu o meta dane zapisane w plikach JPEG, tak więc wybór był jasny &#8211; Apache Solr oraz Apache Tika.</p>
<p><span id="more-400"></span></p>
<h3>Założenia</h3>
<p>Założenia projektu były dość proste &#8211; aplikacja korzystająca z Solr miała móc wyszukiwać zdjęcia po tytule, autorze i innych danych zawartych w EXIF, takich jak przesłona, czas naświetlania, ogniskowa czy wartość ISO. Kolejnym założeniem było to, iż to Solr musi sobie poradzić z wyodrębnieniem tych danych z plików, które dostaje do indeksowania. To tyle jeżeli chodzi o założenia dotyczące wyszukiwania zdjęć.</p>
<h3>Struktura indeksu</h3>
<p>Struktura indeksu była bardzo prosta i zawierała jedynie najbardziej niezbędne pola. Sama definicja pól wygląda następująco:
</p>
<pre class="brush:xml">&lt;field name="id" type="string" indexed="true" stored="true" required="true" /&gt;
&lt;field name="name" type="text" indexed="true" stored="true" /&gt;
&lt;field name="author" type="text" indexed="true" stored="true" /&gt;
&lt;field name="iso" type="text" indexed="true" stored="true" multiValued="true" /&gt;
&lt;field name="iso_string" type="text" indexed="true" stored="true" multiValued="true" /&gt;
&lt;field name="aperture" type="double" indexed="true" stored="true" /&gt;
&lt;field name="exposure" type="string" indexed="true" stored="true" /&gt;
&lt;field name="exposure_time" type="double" indexed="true" stored="true" /&gt;
&lt;field name="focal" type="string" indexed="true" stored="true" /&gt;
&lt;field name="focal_35" type="string" indexed="true" stored="true" /&gt;
&lt;dynamicField name="ignored_*" type="string" indexed="false" stored="false" multiValued="true" /&gt;</pre>
<p>Pole dynamiczne zostało wprowadzone po to, aby umożliwić ignorowanie danych, które nas nie interesują. Dodatkowo, obecny był <em>copyField</em> kopiujący wartość z pola <em>iso</em> do pola <em>iso_string</em>.</p>
<h3>Konfiguracja Solr</h3>
<p>Poniżej przedstawiona została konfiguracja handlera w pliku solrconfig.xml:
</p>
<pre class="brush:xml">&lt;requestHandler name="/update/extract" class="solr.extraction.ExtractingRequestHandler"&gt;
 &lt;lst name="defaults"&gt;
  &lt;str name="uprefix"&gt;ignored_&lt;/str&gt;
  &lt;str name="lowernames"&gt;true&lt;/str&gt;
  &lt;str name="captureAttr"&gt;true&lt;/str&gt;
  &lt;str name="fmap.stream_name"&gt;name&lt;/str&gt;
  &lt;str name="fmap.artist"&gt;author&lt;/str&gt;
  &lt;str name="fmap.exif_isospeedratings"&gt;iso&lt;/str&gt;
  &lt;str name="fmap.exif_fnumber"&gt;aperture&lt;/str&gt;
  &lt;str name="fmap.exposure_time"&gt;exposure&lt;/str&gt;
  &lt;str name="fmap.exif_exposuretime"&gt;exposure_time&lt;/str&gt;
  &lt;str name="fmap.focal_length"&gt;focal&lt;/str&gt;
  &lt;str name="fmap.focal_length_35"&gt;focal_35&lt;/str&gt;
 &lt;/lst&gt;
&lt;/requestHandler&gt;</pre>
<p>Kilka słów wyjaśnienia konfiguracji. Parametr <em>uprefix</em> mówi o tym, jaki przedrostek nadać nazwom pól, które nie zostały wymienione w konfiguracji. W przypadku powyższej konfiguracji nazwy pól, które nie zostały wymienione zostaną poprzedzone słowem <em>ignored_</em>. Oznacza, to, że trafią do pola dynamicznego (patrz struktura indeksu) i nie zostaną zaindeksowane (<em>stored=&#8221;false&#8221;</em> oraz <em>indexed=&#8221;false&#8221;</em>). Parametr <em>lowername</em>s z wartością <em>true</em> powoduje sprowadzanie nazw pól do małych liter. Parametr <em>captureAttr </em>mówi natomiast o tym, iż mają być pobierane atrybuty pliku. Następne parametry to mapowanie pól zwracanych przez bibliotekę Tika do pól w indeksie. Np. parametr <em>fmap.exif_fnumber</em> o wartości <em>aperture</em> mówi o tym, żeby dane z atrybutu <em>exif_fnumber</em> zostały zapisane w polu <em>aperture</em> w indeksie.</p>
<h4>Dodatkowe, potrzebne biblioteki</h4>
<p>Aby powyższa zmiana zaczęła działać potrzebujemy jeszcze dodatkowych bibliotek (podobnie, jak w przypadku <a href="http://solr.pl/2012/01/23/identyfikacja-jezyka-dokumentu/" target="_blank" rel="noopener noreferrer">identyfikacji języka</a>). Z katalogu <em>dist</em>, który znajduje się w dystrybucji Solr kopiujemy plik <em>apache-solr-cell-3.5.0.jar</em> do np. katalogu <em>tikaDir</em>, który tworzymy na tym samym poziomie co katalog <em>webapps</em> w Solr. Oraz dodajemy następującą linię do pliku <em>solrconfig.xml</em>:
</p>
<pre class="brush:xml">&lt;lib dir="../tikaLib/" /&gt;</pre>
<p>Powyższa linia mówi Solr, aby wczytał wszystkie biblioteki z podanego katalogu. Następnie kopiujemy wszystkie biblioteki z katalogu <em>contrib/extraction/</em> (także z dystrybucji Solr) do poprzednio stworzonego katalogu <em>tikaDir</em>. Dodatkowe zmiany w pliku <em>solrconfig.xml</em> nie są już potrzebne.</p>
<h3>Indeksowanie danych</h3>
<p>Przyrost zdjęć, których meta dane należało zaindeksować, wynosił około 10 tysięcy tygodniowo. Zdjęcia były składowane we współdzielonej lokalizacji. Wybieraniem zdjęć do indeksowania zajmował się prosty skrypt powłoki, który dla każdego pliku, który został zakwalifikowany, jako nowy, uruchamiał następujące polecenie:
</p>
<pre class="brush:bash">curl 'http://solrmaster:8983/solr/photos/update/extract?literal.id=9926&amp;commit=true" -F "myfile=@Wisła_2011_10_10.JPG"</pre>
<p>Powyższe polecenie wysyła plik o nazwie <em>Wisła_2011_10_10.JPG</em> do handlera<em> /extract&nbsp;</em>i mówi aby wywołać polecenie <em>commit</em> po jego przetworzeniu. Do tego ustawiony zostaje unikalny klucz dla dokumentu (parametr <em>literal.id</em>), który powstanie po przetworzeniu wysyłanego pliku.</p>
<h3>Zapytania</h3>
<p>Oprócz standardowego filtrowania po autorze,&nbsp; czy innych atrybutach zdjęcia wymaganie odnośnie wyszukiwania było jedno &#8211; ma działać. Stwierdziliśmy, że jeżeli sami mielibyśmy korzystać z powstającej aplikacji, na pewno ważnymi polami byłby autor oraz nazwa pliku. Zapytania, które odpowiadały temu wymaganiu wyglądały mniej więcej, tak jak to poniższe:
</p>
<pre class="brush:xml">q=jan+kowalski+wisła&amp;qf=name^100+author^1000+iso+aperture+exposure_time+focal&amp;defType=dismax</pre>
<p>Jak widać zapytanie jest bardzo proste. Dwa pola, spośród obecnych w indeksie są promowane &#8211; nazwa zdjęcia oraz jego autor. Znaczenie tych pól zostało określone poprzez dodanie odpowiednich podbić na etapie zapytania. Reszcie przeszukiwanych pól nie określono podbicia, a zatem jego wartość wyniosła 1.</p>
<h3>Podsumowując</h3>
<p>Opisanie powyżej wdrożenie jest dość proste. Sama aplikacja działa i ma się dobrze, jak również działa wyszukiwanie. Następnymi krokami, jakie należałoby uczynić w przypadku aplikacji, która byłaby wykorzystywana w większym gronie użytkowników, to m.in. tunning JVM i samego Solr. Jednym z elementów poprawiania działania Solr byłoby na pewno strojenie jakości wyników wyszukiwania i wydajności samego rozwiązania. Ale to zostanie opisanie w przyszłości.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2012/02/20/prosta-wyszukiwarka-zdjec/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
