<?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>baza danych &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/baza-danych/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 07:59: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>Data Import Handler – usuwanie danych z indeksu</title>
		<link>https://solr.pl/2011/01/03/data-import-handler-usuwanie-danych-z-indeksu/</link>
					<comments>https://solr.pl/2011/01/03/data-import-handler-usuwanie-danych-z-indeksu/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 03 Jan 2011 07:58:02 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[baza danych]]></category>
		<category><![CDATA[data import handler]]></category>
		<category><![CDATA[dih]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[integracja]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=171</guid>

					<description><![CDATA[Usuwanie danych z indeksu przy wykorzystaniu indeksowania przyrostowego w DIH jest na wiki SOLR potraktowane szczątkowo, jako coś, co działa analogicznie do aktualizacji rekordów. Podobnie we wcześniejszym artykule użyłem tego skrótu, tym bardziej, że podany przeze mnie przykład z indeksowaniem]]></description>
										<content:encoded><![CDATA[<p>Usuwanie danych z indeksu przy wykorzystaniu indeksowania przyrostowego w DIH jest na wiki SOLR potraktowane szczątkowo, jako coś, co działa analogicznie do aktualizacji rekordów. Podobnie we wcześniejszym artykule użyłem tego skrótu, tym bardziej, że podany przeze mnie przykład z indeksowaniem zasobów wikipedii nie potrzebował usuwania danych.</p>
<p><span id="more-171"></span></p>
<p>Mając pod ręką przykładowe dane z albumami i wykonawcami postanowiłem pokazać mój sposób postępowania w takich wypadkach. Dla uproszczenia i przejrzystości zakładam, że po pierwszym zaimportowaniu, danych może tylko ubywać.</p>
<h2>Dane testowe</h2>
<p>Moje dane testowe mieszczą się bazie PostgreSQL w tabeli zdefiniowanej następująco:</p>
<pre>Table "public.albums"
Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------
id     | integer | not null default nextval('albums_id_seq'::regclass)
name   | text    | not null
author | text    | not null
Indexes:
"albums_pk" PRIMARY KEY, btree (id)</pre>
<p>W tabeli znajduje się 825661 rekordów.</p>
<h2>Instalacja testowa</h2>
<p>Do testów użyłem instancji SOLR posiadającej następującą charakterystykę:</p>
<p>Definicja w schema.xml:</p>
<pre class="brush:xml">&lt;fields&gt;
&lt;field name="id" type="string" indexed="true" stored="true" required="true" /&gt;
&lt;field name="album" type="text" indexed="true" stored="true" multiValued="true"/&gt;
&lt;field name="author" type="text" indexed="true" stored="true" multiValued="true"/&gt;
&lt;/fields&gt;
&lt;uniqueKey&gt;id&lt;/uniqueKey&gt;
&lt;defaultSearchField&gt;album&lt;/defaultSearchField&gt;</pre>
<p>Definicja DIH w solrconfig.xml:</p>
<pre class="brush:xml">&lt;requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"&gt;
&lt;lst name="defaults"&gt;
&lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
&lt;/lst&gt;
&lt;/requestHandler&gt;</pre>
<p>I plik DIH db-data-config.xml:</p>
<pre class="brush:xml">&lt;dataConfig&gt;
&lt;dataSource driver="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/shardtest" user="solr" password="secret" /&gt;
&lt;document&gt;
&lt;entity name="album" query="SELECT * from albums"&gt;
&lt;field column="id" name="id" /&gt;
&lt;field column="name" name="album" /&gt;
&lt;field column="author" name="author" /&gt;
&lt;/entity&gt;
&lt;/document&gt;
&lt;/dataConfig&gt;</pre>
<p>Przed naszym testem zaimportowałem wszystkie dane z tabeli <em>albums</em>.</p>
<h2>Usuwanie danych</h2>
<p>Patrząc na tabelę widać, że gdy usuniemy rekord, ginie on bez śladu i jedynym sposobem aktualizacji naszego indeksu byłoby porównanie identyfikatorów dokumentów w indeksie z identyfikatorami w bazie i wyrzucenie tych, które w bazie już nie istnieją. Wolne i niewygodne. Innym sposobem jest dodatnie kolumny <em>deleted_at</em>: zamiast kasowania fizycznie rekordu, uzupełniamy tylko tę kolumnę. DIH może wtedy pobrać wszystkie rekordy z ustawioną datą późniejszą od ostatniego indeksowania. Wadą tego rozwiązania może by konieczność modyfikacji aplikacji by uwzględniały tak „skasowane” rekordy.</p>
<p>Ja zastosuje inne rozwiązanie, przeźroczyste dla aplikacji. Tworzymy nową tabelę:</p>
<pre class="brush:sql">CREATE TABLE deletes
(
id serial NOT NULL,
deleted_id bigint,
deleted_at timestamp without time zone NOT NULL,
CONSTRAINT deletes_pk PRIMARY KEY (id)
);</pre>
<p>Do tej tabeli automagicznie będziemy dopisywać identyfikatory tych elementów, które zostały usunięte z tabeli <em>albums</em> oraz informacje kiedy zostały usunięte.</p>
<p>Teraz dodamy jeszcze funkcję:</p>
<pre class="brush:sql">CREATE OR REPLACE FUNCTION insert_after_delete()
RETURNS trigger AS
$BODY$BEGIN
IF tg_op = 'DELETE' THEN
INSERT INTO deletes(deleted_id, deleted_at)
VALUES (old.id, now());
RETURN old;
END IF;
END$BODY$
LANGUAGE plpgsql VOLATILE;</pre>
<p>oraz trigger:</p>
<pre class="brush:sql">CREATE TRIGGER deleted_trg
BEFORE DELETE
ON albums
FOR EACH ROW
EXECUTE PROCEDURE insert_after_delete();</pre>
<h2>Sprawdzamy działanie</h2>
<p>Zgodnie z planem, każdy usunięty wpis w tabeli <em>albums</em> powinien skutkować uzupełnieniem tabeli<br /><em>deletes</em>. Sprawdźmy więc. Usuwamy parę rekordów:</p>
<pre class="brush:sql">=&gt; DELETE FROM albums where id &lt; 37;
DELETE 2
=&gt; SELECT * from deletes;
id | deleted_id |         deleted_at
----+------------+----------------------------
26 |         35 | 2010-12-23 13:53:18.034612
27 |         36 | 2010-12-23 13:53:18.034612
(2 rows)</pre>
<p>Czyli baza działa.</p>
<p>Uzupełniamy plik konfiguracyjny DIH tak, by <em>entity</em> było zdefiniowane następująco:</p>
<pre class="brush:xml">&lt;entity name="album" query="SELECT * from albums"
  deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at &gt; '$'{dataimporter.last_index_time}'"&gt;</pre>
<p>Dzięki temu przy imporcie przyrostowym DIH użyje atrybutu <em>deletedPkQuery</em> by pobrać identyfikatory tych dokumentów, które należy usunąć.</p>
<p>Sprytny czytelnik pewnie zacznie się zastanawiać, czy na pewno potrzebna jest nam kolumna z datą usunięcia rekordu. Przecież możemy usunąć wszystkie rekordy znalezione w tabeli <em>deleted</em> a następnie skasować zawartość tej tabeli. Teoretycznie to prawda, ale w przypadku problemu z serwerem indeksującym SOLR w naszym wypadku łatwo zastąpić go innym – jego stopień synchronizacji z bazą nie jest bardzo istotny – po prostu za następnym importem przyrostowym nastąpi synchronizacja z bazą. W opcji z kasowaniem zawartości <em>deletes</em> takie możliwości nie ma.</p>
<p>Wykonujemy teraz import przyrostowy wywołując adres: <em>/solr/dataimport?command=delta-import</em><br />W logach powinna pojawić się linia podobna do tej:<br /><em>INFO: {delete=[35, 36],optimize=} 0 2</em><br />Co oznacza, że DIH poprawnie usunął z indeksu te dokumenty, które usunęliśmy wcześniej z bazy.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/01/03/data-import-handler-usuwanie-danych-z-indeksu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Data Import Handler – sharding</title>
		<link>https://solr.pl/2010/12/27/data-import-handler-sharding/</link>
					<comments>https://solr.pl/2010/12/27/data-import-handler-sharding/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 27 Dec 2010 07:57:08 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[baza danych]]></category>
		<category><![CDATA[data import handler]]></category>
		<category><![CDATA[dih]]></category>
		<category><![CDATA[integracja]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=169</guid>

					<description><![CDATA[Nasza czytelniczka (pozdrawiamy!) zgłosiła się do nas z problemem dotyczącym współpracy DIH z shardingiem. Wiki projektu SOLR pokazuje moim zdaniem rozwiązanie tej kwestii, ale czyni to trochę na około i przy okazji. Co to jest sharding? Sharding oznacza podział danych]]></description>
										<content:encoded><![CDATA[<p>Nasza czytelniczka (pozdrawiamy!) zgłosiła się do nas z problemem dotyczącym współpracy DIH z shardingiem. Wiki projektu SOLR pokazuje moim zdaniem rozwiązanie tej kwestii, ale czyni to trochę na około i przy okazji.</p>
<p><span id="more-169"></span></p>
<h2>Co to jest sharding?</h2>
<p>Sharding oznacza podział danych na kilka części oraz przechowywanie i obróbkę tych danych niezależnie. Dodatkowa logika w ramach aplikacji pozwala na wybranie odpowiedniej części zbioru danych i/lub łączenie wyników z poszczególnych źródeł. W przypadku DIH i shardingu możemy mieć do czynienia z następującym przypadkiem:</p>
<ul>
<li>sharding po stronie źródło danych – 	czyli wiele lokalizacji / tabel zawierających poszczególne części 	zbioru danych</li>
<li>sharding po stronie SOLR – czyli 	podzielenie danych ze źródła na wiele niezależnych instancji 	SOLR</li>
<li>oba powyższe jednocześnie</li>
</ul>
<p>W opisywanym przypadku mamy jeden zbiór danych i chcemy stworzyć wiele zbiorów (tzw. shardów) po stronie SOLR.</p>
<h2>Kiedy stosować sharding?</h2>
<p>Bardzo ważna kwestia: <strong>po co?</strong> W moim mniemaniu sharding bywa zbyt często nadużywany generując mnóstwo dodatkowych komplikacji i ograniczeń. Główny powód to duży wolumen danych, które<strong> </strong>powodują, że indeks SOLR <strong>nie mieści się w obrębie jednej maszyny</strong>. Jeśli tak nie jest – często oznacza to, że sharding jest zbędny. Kolejny powód to wydajność. Jednak sharding może tutaj pomóc tylko wtedy, gdy inne optymalizacje zawiodą a zapytania są na tyle skomplikowane, że sam narzut shardingu (przekazania zapytania do poszczególnych shardów i łączenie ich odpowiedzi) jest mniejszy niż zysk możliwy do uzyskania.</p>
<h2>Dane testowe</h2>
<p>Zakładamy jednak, że sharding jest nam potrzebny. W przykładzie poniżej użyłem danych z musicbrainz tworząc prostą tabelę postgresową:
</p>
<pre>Table "public.albums"</pre>
<pre> Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------</pre>
<pre> id     | integer | not null default nextval('albums_id_seq'::regclass)</pre>
<pre> name   | text    | not null</pre>
<pre> author | text    | not null</pre>
<pre>Indexes:</pre>
<pre>"albums_pk" PRIMARY KEY, btree (id)</pre>
<p>W tabeli znajduje się 825661 rekordów. Podkreślam tutaj, że zarówno struktura jak i ilość danych jest na tyle małe, że praktyczna przydatność shardingu jest tu pomijalna.</p>
<h2>Instalacja testowa</h2>
<p>Do testów użyjemy trzech instancji SOLR. Wszystkie instancje są identyczne, różnica jest związana tylko z numerem portów (8983, 7872, 6761) – testy będą wykonywane na jednej fizycznej maszynie.</p>
<p>Definicja w schema.xml:
</p>
<pre class="brush:xml">&lt;fields&gt;
 &lt;field name="id" type="string" indexed="true" stored="true" required="true" /&gt;
 &lt;field name="album" type="text" indexed="true" stored="true" multiValued="true"/&gt;
 &lt;field name="author" type="text" indexed="true" stored="true" multiValued="true"/&gt;
&lt;/fields&gt;
&lt;uniqueKey&gt;id&lt;/uniqueKey&gt;
&lt;defaultSearchField&gt;album&lt;/defaultSearchField&gt;</pre>
<p>Definicja DIH w solrconfig.xml:
</p>
<pre class="brush:xml">&lt;requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"&gt;
 &lt;lst name="defaults"&gt;
  &lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
 &lt;/lst&gt;
&lt;/requestHandler&gt;</pre>
<p>I plik DIH db-data-config.xml:
</p>
<pre class="brush:xml">&lt;dataConfig&gt;
 &lt;dataSource driver="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/shardtest" user="solr" password="secret" /&gt;
 &lt;document&gt;
  &lt;entity name="album" query="SELECT * from albums"&gt;
   &lt;field column="id" name="id" /&gt;
   &lt;field column="name" name="album" /&gt;
   &lt;field column="author" name="author" /&gt;
  &lt;/entity&gt;
 &lt;/document&gt;
&lt;/dataConfig&gt;</pre>
<p>W tym momencie każda instancja jest w stanie dokonać pełnego importu danych.</p>
<h2>Zestawiamy sharding</h2>
<p>Naszym celem jest takie zmodyfikowanie konfiguracji DIH by każda instancja indeksowała tylko „swoją” część danych. Najprościej zrobić to modyfikując zapytanie pobierające dane np w ten sposób:</p>
<p>SELECT * from albums where id % LICZBA_INSTANCJI = NUMER_INSTANCJI</p>
<p>gdzie:</p>
<ul>
<li>LICZBA_INSTANCJI 	– liczba serwerów SOLR przechowujących unikalne części zbioru 	danych</li>
<li>NUMER_INSTANCJI – 	numer instancji (liczony od zera)</li>
</ul>
<p>takie zapytanie nie gwarantuje nam dokładnie i idealnie równego podziału ale spełnia dwa konieczne warunki:</p>
<ul>
<li>dany rekord 	trafi zawsze na konkretną i <strong>zawszę tę samą</strong> instancję</li>
<li>pojedynczy 	rekord trafi zawsze na tylko <strong>jedną</strong> instancję</li>
</ul>
<p>czyli  db-data-config.xml  na każdej maszynie różni się teraz zapytaniem i wygląda na poszczególnych instancjach następująco:</p>
<ul>
<li>SELECT * from albums where id % 3 = 0</li>
<li>SELECT * from albums where id % 3 = 1</li>
<li>SELECT * from albums where id % 3 = 2</li>
</ul>
<h2>Sprawdzamy działanie</h2>
<p>Po uruchomieniu wszystkich instancji SOLR na każdej wywołujemy adres:</p>
<p><em>/solr/dataimport?command=full-import</em></p>
<p>Po zakończeniu pracy DIH i wywołaniu:</p>
<p><em> /solr/dataimport?command=status</em></p>
<p>dostajemy w odpowiedzi od instancji odpowiednio:</p>
<ul>
<li>Added/Updated: 	275220 documents.</li>
<li>Added/Updated: 	275221 documents.</li>
<li>Added/Updated: 	275220 documents.</li>
</ul>
<p>Wykonując prostą operację dodawania widzimy, że we wszystkich instancjach łącznie mamy 825661 dokumentów, czyli tyle ile powinno tam być <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;" /><br />
Wykonajmy jeszcze zapytanie o wszystkie dokumenty, z wykorzystaniem shardingu wywołując na dowolnej instancji:</p>
<p><em>/solr/select/?q=*:*&amp;shards=localhost:6761/solr,localhost:7872/solr,localhost:8983/solr</em></p>
<p>Wynik:  825661.</p>
<p>To działa! <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/2010/12/27/data-import-handler-sharding/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Data Import Handler – import danych z baz SQL (cz. 1)</title>
		<link>https://solr.pl/2010/10/11/data-import-handler-import-danych-z-baz-sql-cz-1/</link>
					<comments>https://solr.pl/2010/10/11/data-import-handler-import-danych-z-baz-sql-cz-1/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 11 Oct 2010 04:54:16 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[baza danych]]></category>
		<category><![CDATA[data import handler]]></category>
		<category><![CDATA[dih]]></category>
		<category><![CDATA[import]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=40</guid>

					<description><![CDATA[W artykule o sposobach importu danych (http://solr.pl/2010/09/06/solr-importowanie-danych/) wspomniałem o Data Import Handler (DIH). Podstawową zaletą tego sposobu importowania jest brak konieczności tworzenia dodatkowego oprogramowania oraz szybka integracja ze źródłem danych. Ta druga zaleta wymaga jednak wprawy i praktyki. W tym]]></description>
										<content:encoded><![CDATA[<p>W artykule o sposobach importu danych (<a href="../2010/09/06/solr-importowanie-danych/">http://solr.pl/2010/09/06/solr-importowanie-danych/</a>) wspomniałem o <strong>Data Import Handler</strong> (DIH). Podstawową zaletą tego sposobu importowania jest brak konieczności tworzenia dodatkowego oprogramowania oraz szybka integracja ze źródłem danych. Ta druga zaleta wymaga jednak wprawy i praktyki. W tym wpisie przedstawię podstawy integracji DIH ze źródłem danych SQL.</p>
<p><span id="more-40"></span></p>
<p>W przykładach użyta została baza PostgeSQL zawierająca dane polskiej wikipedii. Testowa instancja solr została zdefiniowana jako rdzeń „wikipedia” i dostępna była pod adresem:</p>
<p><a href="http://localhost:8983/solr/wikipedia/admin/">http://localhost:8983/solr/wikipedia/admin/</a></p>
<p><strong>Konfiguracja solrconfig.xml</strong></p>
<p>Konfiguracja sprowadza się do dodania dodatkowego requestHandlera. Parametr: <em>config</em> określa plik konfiguracyjny, w którym znajduje się definicja źródła danych.
</p>
<pre class="brush:xml"> &lt;requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"&gt;
&nbsp; &lt;lst name="defaults"&gt;
&nbsp;&nbsp; &lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
&nbsp; &lt;/lst&gt;
&lt;/requestHandler&gt;</pre>
<p>Dzięki takiej definicji zyskujemy możliwość wywoływania adresu HTTP obsługującego import:</p>
<ul>
<li><em>/dataimport</em> &#8211; w celu uzyskania 	aktualnego statusu</li>
<li><em>/dataimport?command=reload-config</em> – w celu ponownego odczytania konfiguracji</li>
<li><em>/dataimport?command=full-import</em> – 	w celu zlecenia rozpoczęcia pełnego indeksowania  danych</li>
<li><em>/dataimport?command=delta-import</em> – 	w celu zlecenia rozpoczęcia indeksowania przyrostowego</li>
</ul>
<p>(dla mojej konfiguracji pełen adres to: http://localhost:8983/solr/wikipedia/dataimport)</p>
<p>Powyżej widzimy dwie możliwości importowania danych: import pełny i przyrostowy.</p>
<p><strong>Pełny import</strong> danych polega na każdorazowym wczytaniu wszystkich danych, które powinny znaleźć się w indeksie, podczas gdy <strong>import przyrostowy</strong> oznacza tylko dodanie i aktualizację w indeksie tych danych, które zmieniły się od ostatniego indeksowania. Pełny import zwykle trwa znacznie dłużej stąd prosty wniosek: jeśli czas pełnego indeksowania nie jest dla nas problemem – prawdopodobnie nie warto zawracać sobie głowy konfiguracją indeksowania przyrostowego, zwłaszcza, że nakłada ono&nbsp; dodatkowe wymagania na strukturę źródła danych.</p>
<p>Warto zaznaczyć, że pełny import domyślnie rozpoczyna się od usunięcia istniejącego indeksu.  Istnieje możliwość uniknięcia takiego zachowania poprzez dodanie  parametru: <em>clean=false</em>.</p>
<p><strong>Konfiguracja źródła danych</strong></p>
<p>Konfiguracja polega na zdefiniowaniu zapytań pozwalających solr na pobieranie danych do indeksowania i zawiera się w pliku określonym przy definicji handlera (u nas:  db-data-config.xml) W tym wpisie zaczniemy od zdefiniowania pełnego importu. Następnie, w kolejnej części artykułu rozbudujemy go o możliwość importowania przyrostowego.</p>
<p><strong>Pełny import</strong>
</p>
<pre class="brush:xml">&lt;dataConfig&gt;
&nbsp; &lt;dataSource driver="org.postgresql.Driver"
&nbsp; &nbsp;&nbsp; url="jdbc:postgresql://localhost:5432/wikipedia"
&nbsp;&nbsp;&nbsp;&nbsp; user="wikipedia"
&nbsp;&nbsp;&nbsp;&nbsp; password="secret" /&gt;
&nbsp; &lt;document&gt;
&nbsp;&nbsp;&nbsp; &lt;entity name="page" query="SELECT page_id, page_title from page"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="page_id" name="id" /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="page_title" name="name" /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entity name="revision" query="select rev_id from revision where rev_page=${page.page_id}"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entity name="pagecontent" query="select old_text from pagecontent where old_id=${revision.rev_id}"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="old_text" name="text" /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entity&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entity&gt;
&nbsp;&nbsp; &lt;/entity&gt;
&nbsp; &lt;/document&gt;
&lt;/dataConfig&gt;</pre>
<p>Jak widzimy definicja źródła składa się z opisu sposobu połączenia do baz danych oraz opisu indeksowanego dokumentu. Import następuje zgodnie z następującym algorytmem:</p>
<ol>
<li>Usuwany jest stary indeks (jeśli 	nie użyto parametru <em>clean=false</em>)</li>
<li>Solr po wywołaniu komendy 	indeksowania nawiązuje połączenie do bazy danych.</li>
<li>Definiowany jest kursor bazodanowy 	wykorzystujący zapytanie określone w argumencie „<em>query</em>” w 	głównej encji</li>
<li>Pobierana jest porcja danych</li>
<li>Dla każdego pobranego rekordu 	definiowane są zmienne postaci <em>&lt;nazwa encji&gt;.&lt;zwracana 	kolumna&gt;</em>, dzięki czemu do zwróconych wartości można odwołać 	się w encjach zagnieżdżonych</li>
<li>Wykonywane są zapytania z encji 	zagnieżdżonych</li>
<li>Encja może zawierać definicje 	pól. Dzięki temu Solr jest w stanie określić mapowanie kolumny 	z wyniku na pole dokumentu zdefiniowane w <em>schema.xml</em></li>
<li>Dokument stworzony dzięki 	wartościom zwróconych przez zapytania jest dodawany do indeksu</li>
<li>Jeśli kursor posiada kolejne 	wyniki następuje skok do punktu 4.</li>
<li>Następuje zapisanie danych do 	pliku dataimport.properties, dane zostają zatwierdzone (<em>commit</em>) i 	wykonywana jest optymalizacja indeksu</li>
</ol>
<p>Po uruchomieniu solr i wejściu na stronę:<a href="http://localhost:8983/solr/wikipedia/dataimport"> http://localhost:8983/solr/wikipedia/dataimport</a> pojawiła sie odpowiedź:
</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;response&gt;
&nbsp; &lt;lst name="responseHeader"&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="status"&gt;0&lt;/int&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="QTime"&gt;0&lt;/int&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;lst name="initArgs"&gt;
&nbsp;&nbsp;&nbsp; &lt;lst name="defaults"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;/lst&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;str name="status"&gt;idle&lt;/str&gt;
&nbsp; &lt;str name="importResponse"/&gt;
&nbsp; &lt;lst name="statusMessages"/&gt;
&nbsp; &lt;str name="WARNING"&gt;This response format is experimental.  It is likely to change in the future.&lt;/str&gt;
&lt;/response&gt;</pre>
<p>Uwagę zwraca wpis: status: idle. Oznacza to, że nasz importer jest gotowy do pracy. W innym przypadku (np. Błąd poprawności XML konfiguracyjnego) dostaniemy opis wyjątku. Niestety na tym etapie nie są wykrywane jeszcze błędy związane np. z niewłaściwą definicją połączenia do bazy lub braku sterownika JDBC.</p>
<p>Wchodzimy więc na stronę:<a href="http://localhost:8983/solr/wikipedia/dataimport?command=full-import"> http://localhost:8983/solr/wikipedia/dataimport?command=full-import</a></p>
<p>To co powinniśmy otrzymać, to podobny jak wyżej XML. Jednak po ponownym wejściu na stronę:<a href="http://localhost:8983/solr/wikipedia/dataimport"> http://localhost:8983/solr/wikipedia/dataimport</a> dostajemy już inny wynik.
</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;response&gt;
&nbsp; &lt;lst name="responseHeader"&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="status"&gt;0&lt;/int&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="QTime"&gt;0&lt;/int&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;lst name="initArgs"&gt;
&nbsp;&nbsp;&nbsp; &lt;lst name="defaults"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;/lst&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;str name="status"&gt;busy&lt;/str&gt;
&nbsp; &lt;str name="importResponse"&gt;A command is still running...&lt;/str&gt;
&nbsp; &lt;lst name="statusMessages"&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Time Elapsed"&gt;0:1:15.460&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Requests made to DataSource"&gt;39547&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Rows Fetched"&gt;59319&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Documents Processed"&gt;19772&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Documents Skipped"&gt;0&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Full Dump Started"&gt;2010-10-03 14:28:00&lt;/str&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;str name="WARNING"&gt;This response format is experimental.  It is likely to change in the future.&lt;/str&gt;
&lt;/response&gt;</pre>
<p>Czyli importer pracuje.</p>
<p>Po pewnym czasie, zależnym od ilości indeksowanych danych i szybkości komputera otrzymamy:
</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;response&gt;
&nbsp; &lt;lst name="responseHeader"&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="status"&gt;0&lt;/int&gt;
&nbsp;&nbsp;&nbsp; &lt;int name="QTime"&gt;0&lt;/int&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;lst name="initArgs"&gt;
&nbsp;&nbsp;&nbsp; &lt;lst name="defaults"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="config"&gt;db-data-config.xml&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;/lst&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;str name="status"&gt;idle&lt;/str&gt;
&nbsp; &lt;str name="importResponse"/&gt;
&nbsp; &lt;lst name="statusMessages"&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Requests made to DataSource"&gt;2118645&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Rows Fetched"&gt;3177966&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Documents Skipped"&gt;0&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Full Dump Started"&gt;2010-10-03 14:28:00&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name=""&gt;Indexing completed. Added/Updated: 1059322 documents. Deleted 0 documents.&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Committed"&gt;2010-10-03 14:55:20&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Optimized"&gt;2010-10-03 14:55:20&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Total Documents Processed"&gt;1059322&lt;/str&gt;
&nbsp;&nbsp;&nbsp; &lt;str name="Time taken "&gt;0:27:20.325&lt;/str&gt;
&nbsp; &lt;/lst&gt;
&nbsp; &lt;str name="WARNING"&gt;This response format is experimental.  It is likely to change in the future.&lt;/str&gt;
&lt;/response&gt;</pre>
<p>Jak widzimy indeksacja zakończyła się sukcesem.</p>
<p>W kolejnym odcinku spróbujemy dodać możliwość importowania przyrostowego.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/10/11/data-import-handler-import-danych-z-baz-sql-cz-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
