<?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>indeksowanie &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/indeksowanie/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 11:47:31 +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>SolrCloud &#8211; tolerancja odczytu i zapisu</title>
		<link>https://solr.pl/2018/12/31/solrcloud-tolerancja-odczytu-i-zapisu/</link>
					<comments>https://solr.pl/2018/12/31/solrcloud-tolerancja-odczytu-i-zapisu/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 31 Dec 2018 11:47:02 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[indeksowanie]]></category>
		<category><![CDATA[replikacja]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[solrcloud]]></category>
		<category><![CDATA[tolerancja]]></category>
		<category><![CDATA[zapytania]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=770</guid>

					<description><![CDATA[SolrCloud, podobnie jak większość systemów rozproszonych podlega pewnym zasadom. Np. CAP mówi o tym, iż rozproszony system jest w stanie zapewnić dwie z trzech wymienionych funkcjonalności w tym samym czasie &#8211; dostępność, spójność, odporność na rozłączanie sieci. Oczywiście nie będziemy]]></description>
										<content:encoded><![CDATA[
<p>SolrCloud, podobnie jak większość systemów rozproszonych podlega pewnym zasadom. Np. <a href="https://en.wikipedia.org/wiki/CAP_theorem">CAP</a> mówi o tym, iż rozproszony system jest w stanie zapewnić dwie z trzech wymienionych funkcjonalności w tym samym czasie &#8211; dostępność, spójność, odporność na rozłączanie sieci.  Oczywiście nie będziemy rozmawiać o podstawach systemów rozproszonych, ale skupimy się jak możemy kontrolować tolerancję zapisu i odczytu w SolrCloud. <br></p>



<span id="more-770"></span>



<h2 class="wp-block-heading">Tolerancja zapisu</h2>



<p>Tolerancja zapisu to dość skomplikowany temat. Po pierwsze, wraz z wprowadzeniem Solr 7.0 dostaliśmy różne rodzaje replik. Mamy repliki typu NRT, które zapisują dane do loga transakcyjnego, a indeksowanie odbywa się na każdej z replik. Mamy repliki typu TLOG, gdzie nowe dane zapisywane są do loga transakcyjnego, a samo indeksowanie nie następuje i występuje tylko binarna replikacja. W końcu repliki typu PULL, gdzie Solr nie korzysta z loga transakcyjnego replikując segmenty od lidera.</p>



<p>Nie będziemy się dzisiaj jednak zajmować dokładną analizą, jak działają poszczególne typy replik i skupimy się na domyślnym typie, czyli replikach NRT. Repliki te były z nami od początku SolrCloud i na szczęście są dalej <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;" /></p>



<p>W przypadku replik NRT procedura indeksowania danych działa następująco &#8211; na początku lider przyjmuje dane, zapisuje je w logu transakcyjnym i wysyła do swoich replik (zakładamy, że wszystkie są typu NRT). Każda z replik zapisuje dane w logu transakcyjnym. W tym momencie nasze dane są już bezpieczne i Solr może zwrócić potwierdzenie przyjęcia danych. Oczywiście, gdzieś w między czasie, w zależności od konfiguracji tworzony jest odwrócony indeks. Co się stanie kiedy nie wszystkie shardy będą dostępne? Indeksowanie nie powiedzie się. Aby to przetestować wystarczy, że uruchomimy dwie instancje Solr następującymi komendami: </p>



<pre class="wp-block-code"><code class="">$ bin/solr start -c</code></pre>



<pre class="wp-block-code"><code class="">$ bin/solr start -z localhost:9983 -p 6983</code></pre>



<p>A następnie stworzymy kolekcję:</p>



<pre class="wp-block-code"><code class="">$ bin/solr create_collection -c test_index -shards 2 -replicationFactor 1</code></pre>



<p>Zabijemy jedną z instancji:</p>



<pre class="wp-block-code"><code class="">$ bin/solr stop -p 6983</code></pre>



<p>I spróbujemy zaindeksować dane:</p>



<pre class="wp-block-code"><code class="">$ curl -XPOST -H 'Content-type:application/json' 'localhost:8983/solr/test_index/update' -d '{
 "id" : 2,
 "name" : "Test document"
}'</code></pre>



<p>Oczywiście, tak jak mogliśmy się spodziewać Solr zwróci bład:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "status":503,
    "QTime":4011},
  "error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","org.apache.solr.common.SolrException"],
    "msg":"No registered leader was found after waiting for 4000ms , collection: test_index slice: shard2 saw state=DocCollection(test_index//collections/test_index/state.json/8)={\n  \"pullReplicas\":\"0\",\n  \"replicationFactor\":\"1\",\n  \"shards\":{\n    \"shard1\":{\n      \"range\":\"80000000-ffffffff\",\n      \"state\":\"active\",\n      \"replicas\":{\"core_node3\":{\n          \"core\":\"test_index_shard1_replica_n1\",\n          \"base_url\":\"http://192.168.1.11:8983/solr\",\n          \"node_name\":\"192.168.1.11:8983_solr\",\n          \"state\":\"active\",\n          \"type\":\"NRT\",\n          \"force_set_state\":\"false\",\n          \"leader\":\"true\"}}},\n    \"shard2\":{\n      \"range\":\"0-7fffffff\",\n      \"state\":\"active\",\n      \"replicas\":{\"core_node4\":{\n          \"core\":\"test_index_shard2_replica_n2\",\n          \"base_url\":\"http://192.168.1.11:6983/solr\",\n          \"node_name\":\"192.168.1.11:6983_solr\",\n          \"state\":\"down\",\n          \"type\":\"NRT\",\n          \"force_set_state\":\"false\",\n          \"leader\":\"true\"}}}},\n  \"router\":{\"name\":\"compositeId\"},\n  \"maxShardsPerNode\":\"-1\",\n  \"autoAddReplicas\":\"false\",\n  \"nrtReplicas\":\"1\",\n  \"tlogReplicas\":\"0\"} with live_nodes=[192.168.1.11:8983_solr]",
    "code":503}}</code></pre>



<p>W tym wypadku nie jesteśmy w stanie zrobić nic &#8211; nie chcemy, aby nasze dane wylądowały gdziekolwiek. Musimy czekać, aż Solr powróci do stanu używalności, albo sami go do niego doprowadzimy <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;" /></p>



<p>Co jednak w przypadku, kiedy mamy wiele replik i tylko niektóre z nich nie są dostępne? W tym wypadku zapis się powiedzie, a w najnowszych wersjach Solr poinformuje nas o stanie replikacji poprzez umieszczenie w odpowiedzi parametru <em>rf</em>, czyli replication factor. </p>



<p>Stwórzmy sobie zatem jeszcze jedną kolekcję, tym razem składającą się z jednego lidera i jego repliki:</p>



<pre class="wp-block-code"><code class="">$ bin/solr create_collection -c test_index_2 -shards 1 -replicationFactor 2</code></pre>



<p>Jeżeli spróbujemy zaindeksować dane takim samym poleceniem jak wcześniej (oczywiście zmieniając nazwę kolekcji) odpowiedź Solr w wersji 7.6.0 będzie wyglądała następująco:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "rf":2,
    "status":0,
    "QTime":316}}</code></pre>



<p>Jak widać parametr <em>rf</em> ustawiony został na wartość <em>2</em>, co mówi nam, że indeksowanie powiodło się zarówno na liderze, jak i jego replice. Jeżeli zatrzymalibyśmy instancję Solr działającą na porcie <em>6983</em> i spróbowali ponowić indeksowanie Solr poinformuje nas, iż tylko jedna replika danych została zapisana:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "rf":1,
    "status":0,
    "QTime":4}}</code></pre>



<p>We wcześniejszych wersjach Solr, aby otrzymać tą informację należało dodać parametr <em>min_rf</em> większy od 1 do żądania zawierającego indeksowanie, aby dostać informację, jaki poziom replikacji został osiągnięty przez Solr. </p>



<h2 class="wp-block-heading">Tolerancja odczytu</h2>



<p>W przypadku odczytu sprawy mają się trochę inaczej. Brak spójności danych, np. w przypadku braku jednego lub kliku shardów spowoduje, iż Solr zwróci błąd. Możemy to bardzo prosto pokazać &#8211; tworzymy dwie instancje Solr:</p>



<pre class="wp-block-code"><code class="">$ bin/solr start -c</code></pre>



<pre class="wp-block-code"><code class="">$ bin/solr start -z localhost:9983 -p 6983</code></pre>



<p>Następnie tworzymy prostą kolekcję:</p>



<pre class="wp-block-code"><code class="">$ bin/solr create_collection -c test -shards 2 -replicationFactor 1</code></pre>



<p>A teraz zatrzymujemy jedną z instancji:</p>



<pre class="wp-block-code"><code class="">$ bin/solr stop -p 6983</code></pre>



<p>I teraz wystarczy zadać proste zapytanie:</p>



<pre class="wp-block-code"><code class="">http://localhost:8983/solr/test/select?q=*:*</code></pre>



<p>W odpowiedzi zamiast pustej listy dokumentów dostaniemy błąd:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "status":503,
    "QTime":6,
    "params":{
      "q":"*:*"}},
  "error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","org.apache.solr.common.SolrException"],
    "msg":"no servers hosting shard: shard2",
    "code":503}}</code></pre>



<p>Czasami jednak chcielibyśmy zaprezentować wyniki wyszukiwania pomimo braku części informacji. Nie jest to oczywiście idealna sytuacja, ale czasem lepiej pokazać mniej danych, niż nie pokazać nic, oczywiście jeżeli zdajemy sobie sprawę co robimy. W tym celu przychodzą nam z pomocą dwa parametry: <em>shards.tolerant</em> oraz <em>shards.info</em>. Oba powinny zostać ustawione na wartość <em>true</em>, czyli nasze zapytanie przyjmie następującą formę:</p>



<pre class="wp-block-code"><code class="">http://localhost:8983/solr/test/select?q=*:*&amp;shards.tolerant=true&amp;shards.info=true</code></pre>



<p>Tym razem Solr nie zwróci już błędu, a nagłówek odpowiedzi będzie wyglądał następująco:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "zkConnected":true,
    "partialResults":true,
    "status":0,
    "QTime":45,
    "params":{
      "q":"*:*",
      "shards.tolerant":"true",
      "shards.info":"true"}},
  "shards.info":{
    "":{
      "error":"org.apache.solr.common.SolrException: no servers hosting shard: ",
      "trace":"org.apache.solr.common.SolrException: no servers hosting shard: \n\tat org.apache.solr.handler.component.HttpShardHandler.lambda$submit$0(HttpShardHandler.java:165)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat com.codahale.metrics.InstrumentedExecutorService$InstrumentedRunnable.run(InstrumentedExecutorService.java:176)\n\tat org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:209)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat java.lang.Thread.run(Thread.java:748)\n",
      "time":0},
    "http://192.168.1.11:8983/solr/test_shard1_replica_n1/":{
      "numFound":0,
      "maxScore":0.0,
      "shardAddress":"http://192.168.1.11:8983/solr/test_shard1_replica_n1/",
      "time":18}},
  "response":{"numFound":0,"start":0,"maxScore":0.0,"docs":[]
  }}</code></pre>



<p>Jak widać, działa to tak jakbyśmy chcieli. Nie dostaliśmy od Solr błędu, a odpowiedź. Dodatkowo widzimy, iż zwrócone są częściowe rezultaty (<em>partialResults</em> ustawione na <em>true</em>), co pozwala nam lub naszej aplikacji na stwierdzenie, że coś jest nie tak. Oprócz tego opcja <em>shards.info=true</em> pozwoliła Solr zwrócić informacje których shardów brakuje. <br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2018/12/31/solrcloud-tolerancja-odczytu-i-zapisu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 4.0: Aktualizacja pól dokumentów</title>
		<link>https://solr.pl/2012/07/09/solr-4-0-aktualizacja-pol-dokumentow/</link>
					<comments>https://solr.pl/2012/07/09/solr-4-0-aktualizacja-pol-dokumentow/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 09 Jul 2012 21:34:50 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[indeksowanie]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=427</guid>

					<description><![CDATA[Solr i Lucene 4.0 powoli zaczynają pojawiać się na horyzoncie i w związku z tym postanowiłem opisać kolejną funkcjonalność, która może okazać się przydatna wielu użytkownikom Solr &#8211; częściowa aktualizacja dokumentów. Wersja Solr W celu przetestowania funkcjonalności o której mowa]]></description>
										<content:encoded><![CDATA[<p>Solr i Lucene 4.0 powoli zaczynają pojawiać się na horyzoncie i w związku z tym postanowiłem opisać kolejną funkcjonalność, która może okazać się przydatna wielu użytkownikom Solr &#8211; częściowa aktualizacja dokumentów.</p>
<p><span id="more-427"></span></p>
<h3>Wersja Solr</h3>
<p>W celu przetestowania funkcjonalności o której mowa we wpisie, skorzystałem z nadchodzącej dużymi krokami <strong>Apache Solr 4.0 alpha</strong>.</p>
<h3>Założenia</h3>
<p>Załóżmy, że potrzebujemy aktualizować jedno z pól w indeksie, ale tak, aby nie przesyłać ponownie całego dokumentu. Np. niech to będzie cena produktu, która aktualizowana jest kilkukrotnie w ciągu dnia. Nie chcemy, za każdym razem gdy zmieni się cena, aktualizować całego dokumentu, ponieważ każdy dokument to tak naprawdę nie tylko meta dane, ale także pliki binarne przetwarzane przez Tika, a tym samym takie indeksowanie jest dość czasochłonne. Co możemy w takim wypadku zrobić ? O tym za chwilę, zacznijmy od struktury indeksu.</p>
<h3>Struktura indeksu</h3>
<p>Struktura indeksu, jest bardzo prosta, zawiera pola odpowiadające za identyfikator produktu (<em>id</em>), jego nazwę (<em>title</em>), cenę (<em>price</em>) oraz opis (<em>description</em>). Fragment pliku <em>schema.xml</em> wygląda następująco:
</p>
<pre class="brush:xml">&lt;fields&gt;
  &lt;field name="id" type="string" indexed="true" stored="true" required="true" /&gt;
  &lt;field name="name" type="text_general" indexed="true" stored="true"/&gt;
  &lt;field name="price" type="float" indexed="true" stored="true" /&gt;
  &lt;field name="description" type="text_general" indexed="true" stored="true" /&gt;
  &lt;field name="_version_" type="long" indexed="true" stored="true"/&gt;
&lt;/fields&gt;</pre>
<p>Warto zauważyć dwie rzeczy: po pierwsze wszystkie pola oznaczone są jako <em>stored=&#8221;true&#8221;</em>. Dlaczego tak ? O tym trochę później. Druga rzecz to pole o nazwie <em>_version_</em>, które używane jest używane wewnętrznie przez Solr i jest konieczne.</p>
<h3>Zawartość indeksu</h3>
<p>Do testów zaindeksowałem jeden przykładowy dokument, który po zadaniu zapytania <em>q=*:*</em> prezentował się następująco:
</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="indent"&gt;true&lt;/str&gt;
    &lt;str name="q"&gt;*:*&lt;/str&gt;
  &lt;/lst&gt;
&lt;/lst&gt;
&lt;result name="response" numFound="1" start="0"&gt;
  &lt;doc&gt;
    &lt;str name="id"&gt;1&lt;/str&gt;
    &lt;str name="name"&gt;Test 1&lt;/str&gt;
    &lt;float name="price"&gt;479.95&lt;/float&gt;
    &lt;str name="description"&gt;Description 1&lt;/str&gt;
    &lt;long name="_version_"&gt;1406418192301031424&lt;/long&gt;
  &lt;/doc&gt;
&lt;/result&gt;
&lt;/response&gt;</pre>
<h3>Częściowa aktualizacja</h3>
<p>Aby zaktualizować cenę dokumentu, należy do Solr wysłać następujące polecenie:
</p>
<pre class="brush:bash">curl 'localhost:8983/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"1","price":{"set":100}}]'</pre>
<p>Powyższe polecenie mówi, że w dokumencie o polu <em>id </em>równym <em>1</em> należy zmienić pole <em>price</em> i ustawić je na wartość <em>100</em>. Jak wygląda nasze zapytanie <em>q=*:*</em> po wysłaniu powyższego zapytania ? Wynik tego zapytania wygląda następująco:
</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="indent"&gt;true&lt;/str&gt;
    &lt;str name="q"&gt;*:*&lt;/str&gt;
  &lt;/lst&gt;
&lt;/lst&gt;
&lt;result name="response" numFound="1" start="0"&gt;
  &lt;doc&gt;
    &lt;str name="id"&gt;1&lt;/str&gt;
    &lt;str name="name"&gt;Test 1&lt;/str&gt;
    &lt;float name="price"&gt;100.0&lt;/float&gt;
    &lt;str name="description"&gt;Description 1&lt;/str&gt;
    &lt;long name="_version_"&gt;1406418399028838400&lt;/long&gt;
  &lt;/doc&gt;
&lt;/result&gt;
&lt;/response&gt;</pre>
<p>Jak widać pole <em>price</em> zostało uaktualnione. Zmieniła się także wartość pola <em>_version_</em>. Czyli dokładnie to, o co nam chodziło.</p>
<h3>Co oprócz aktualizacji ?</h3>
<p>Oprócz aktualizacji wartości pól w dokumentach funkcjonalność ta pozwala także na inne operacje, takie jak np. dodawanie wartości do pól wielowartościowych. Dla zainteresowanych polecam testy z komendą <em>add</em> (w odróżnieniu do przykładowego wykorzystania komendy <em>set</em>). Jak widać, nowa funkcjonalność Solr nie ogranicza się zaledwie do aktualizacji wartości pól, ale pozwala na trochę więcej operacji na dokumencie.</p>
<h3>Rzeczy o których należy pamiętać</h3>
<p>Wróćmy do struktury indeksu. Jak napisałem wcześniej, wszystkie pola w dokumencie ustawione są jako <em>stored=&#8221;true&#8221;</em>. Dzieje się tak dlatego, że tak naprawdę pojedyncze pole w indeksie nie jest uaktualniane, a uaktualniany jest cały dokument. Solr stosuje sztuczkę i pobiera pola, które oznaczone są jako <em>stored=&#8221;true&#8221;</em>, usuwa dokument, a następnie dodaje go ponownie, nanosząc na pobrane wartości zmiany, które kazaliśmy zrobić. Tylko tyle i aż tyle.</p>
<h3>Podsumowanie</h3>
<p>Obecna w Solr 4.0 funkcjonalność aktualizacji pól dokumentów nie aktualizuje pól w indeksie, a usuwa istniejący dokument indeksując w jego miejsce uaktualniony. Wszystko dzieje się po stronie Solr, a zatem jesteśmy zwolnieni z obowiązku martwienia się o aktualizację pojedynczego (bądź wielu) pól w dokumentach znajdujących się w indeksie. Oczywiście, musimy pogodzić się z większym indeksem, ze względu na to, że pola dokumentów muszą być przechowywane w oryginalnej postaci, bo inaczej Solr nie będzie w stanie ich odczytać. Zyskujemy zatem czas potrzebny na przetworzenie dokumentu i przesłanie go przez sieć, należy jednak pamiętać, iż cały proces indeksacji zostanie wykonany na nowo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2012/07/09/solr-4-0-aktualizacja-pol-dokumentow/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kiedy należy commitować ?</title>
		<link>https://solr.pl/2011/06/27/kiedy-nalezy-commitowac/</link>
					<comments>https://solr.pl/2011/06/27/kiedy-nalezy-commitowac/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 27 Jun 2011 17:49:03 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[commit]]></category>
		<category><![CDATA[dane]]></category>
		<category><![CDATA[indeksowanie]]></category>
		<category><![CDATA[indexing]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[udostępnianie]]></category>
		<category><![CDATA[udostępnianie danych]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=250</guid>

					<description><![CDATA[Pytanie jakie ostatnio sobie zadałem, wydaje się jednym z tych na które odpowiedź powinna być szybka i bezproblemowa. Tak więc, kiedy należy wysyłać polecenie commit do Solr (lub Lucene) ? Pomimo prostoty pytania, odpowiedź nie jest moim zdaniem jednoznaczna. Aby]]></description>
										<content:encoded><![CDATA[<p>Pytanie jakie ostatnio sobie zadałem, wydaje się jednym z tych na które odpowiedź powinna być szybka i bezproblemowa. Tak więc, kiedy należy wysyłać polecenie <em>commit</em> do Solr (lub Lucene) ? Pomimo prostoty pytania, odpowiedź nie jest moim zdaniem jednoznaczna.</p>
<p><span id="more-250"></span></p>
<p>Aby odpowiedzieć sobie na pytanie, kiedy należy wysyłać polecenie <em>commit</em>, należy przyjrzeć się kilku różnym wariantom indeksowania danych oraz jak szybko chcemy te dane udostępniać. Przyglądając się typowym wdrożeniom, którymi miałem do czynienia, można wyróżnić następujące kategorie:</p>
<h3>Dane mogą być udostępnione jedynie po całkowitej aktualizacji indeksu</h3>
<p>Sytuacja teoretycznie i praktycznie bardzo prosta. Commitujemy dopiero kiedy skończą się dokumenty do zaindeksowania.</p>
<h3>Dane mogą być udostępniane partiami, bez konieczności czekania na pełną aktualizację indeksu</h3>
<p>Tutaj mamy trzy możliwości:</p>
<ol>
<li>Jeżeli nie ma znaczenia czy dane będą udostępnianie partiami, czy nie możemy wysyłać polecenie <em>commit</em> dopiero po przesłaniu ostatniego dokuementu.</li>
<li>Jeżeli chcemy udostępniać dane partiami, nasza aplikacja może wysłać polecenie <em>commit</em> co pewien czas.</li>
<li>Jeżeli nie chcemy wysyłać polecenia <em>commit</em> z aplikacji, możemy powiedzieć, aby Solr robił to za nas, czyli po prostu skorzystać z mechanizmu <em>autocommit</em>.</li>
</ol>
<h3>Dane muszą być zaindeksowane najszybciej jak to możliwe</h3>
<p>Jeżeli dane mają być indeksowane najszybciej jak to jest możliwe (pomijając w tym momencie temat sposobu indeksowania) należy wysyłać polecenie <em>commit</em> dopiero po przesłaniu wszystkich danych. <em>Commit </em>jest dość kosztowny pod względem wydajności i dlatego, w omawianym przypadku, powinien być stosowany jedynie na samym końcu procesu indeksacji.</p>
<h3>Ważne jest, aby dane były publikowane jak najszybciej</h3>
<p>Jest to chyba najtrudniejszy z wymienionych przypadków. Wszystko zależy od tego, jak szybko chcemy mieć dane widoczne na slave&#8217;ach. Na przykład w przypadku systemu CMS, kiedy użytkownik zapisuje edytowaną stronę, chcielibyśmy, aby jej zaktualizowana zawartość dostępna była od razu &#8211; wtedy <em>commit</em> po każdym dokumencie i szybka replikacja jest wskazana.W przypadku dodawania artykułów do sklepu internetowego, można pokusić się o pewne opóźnienie. Takie przypadki można mnożyć w nieskończoność. Należy jednak pamiętać o odpowiednim przygotowaniu zapytań rozgrzewających, aby Solr był przygotowany do obciążenia zapytaniami oraz o tym, aby nie replikować indeksów co 30 sekund, ponieważ może to być przyczyną problemów wydajnościowych.</p>
<p>Osoby zainteresowane bardzo częstą aktualizacją indeksu powinny obserwować to co się dzieje w Lucene i Solr odnośnie NRT (near real time).</p>
<h3>Optymalizacja</h3>
<p>Warto pamiętać też o optymalizacji indeksu. Jeżeli wysyłamy polecenie <em>commit</em> tylko raz, na zakończenie indeksowania warto zastanowić się, czy zamiast <em>commit</em> nie wysyłać <em>optimize</em>. Nasze slave&#8217;y dostaną wtedy zoptymalizowaną wersję indeksu z najnowszymi danymi. Należy jednak pamiętać, iż optymalizacja indeksu jest dłuższa, niż commit.</p>
<h3>Niebezpieczeństwa</h3>
<p>Warto pamiętać, iż odwlekanie operacji <em>commit</em> w nieskończoność wiąże się z niebezpieczeństwem utraty danych, które nie zostały fizycznie zapisane do plików indeksu. Oczywiście nic się z danymi nie stanie, jeżeli Solr zostanie poprawnie wyłączony, natomiast w przypadku awarii maszyny może się zdarzyć sytuacja, kiedy dane które indeksowaliśmy zostaną stracone.</p>
<h3>Podsumowanie</h3>
<p>Jak widać, nie ma jasnej odpowiedzi kiedy należy wysyłać polecenie <em>commit</em> ponieważ zależy to od sytuacji i indywidualnych potrzeb. Należy jednak pamiętać, iż czynności, jakie wykonywane są przez Lucene/Solr po wysłaniu polecenia <em>commit</em> są mocno zasobożerne. Nie korzystajmy z tego polecenia często ponieważ może się okazać, iż zamiast indeksować dane Lucene/Solr spędza większość czasu na przetwarzaniu polecenia <em>commit</em>.</p>
<p>&nbsp;</p>
<p>&nbsp;
</p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 281px; width: 1px; height: 1px; overflow: hidden;">Pomijając temat samego sposobu indeksowania</div>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/06/27/kiedy-nalezy-commitowac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>5 grzechów podczas projektowania indeksu Solr</title>
		<link>https://solr.pl/2010/08/30/5-grzechow-podczas-projektowania-indeksu-solr/</link>
					<comments>https://solr.pl/2010/08/30/5-grzechow-podczas-projektowania-indeksu-solr/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 30 Aug 2010 13:04:31 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[atrybut]]></category>
		<category><![CDATA[atrybuty]]></category>
		<category><![CDATA[błędy]]></category>
		<category><![CDATA[inddex]]></category>
		<category><![CDATA[indeks]]></category>
		<category><![CDATA[indeksowanie]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[schema.xml]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[struktura]]></category>
		<category><![CDATA[struktura indeksu]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=28</guid>

					<description><![CDATA[Zgodnie z obietnicą złożoną we wpisie na temat pliku schema.xml prezentujemy dzisiaj wpis dotyczący najczęściej popełnianych błędów podczas projektowania indeksu Solr, czyli podczas tworzenia i modyfikowania pliku schema.xml dla naszego wdrożenia. Zapraszam do dalszej lektury. Każdy z nas wie co]]></description>
										<content:encoded><![CDATA[<p>Zgodnie z obietnicą złożoną we wpisie na temat pliku <em>schema.xml</em> prezentujemy dzisiaj wpis dotyczący najczęściej popełnianych błędów  podczas projektowania indeksu Solr, czyli podczas tworzenia i  modyfikowania pliku <em>schema.xml</em> dla naszego wdrożenia. Zapraszam do dalszej lektury.</p>
<p><span id="more-28"></span></p>
<p>Każdy z nas wie co to jest plik<em> schema.xml</em> i do czego służy  (jeżeli nie, to zapraszam do lektury wpisu znajdującego się pod adresem:  <a href="http://solr.pl/2010/08/16/co-to-jest-schema/" target="_blank" rel="noopener noreferrer">http://solr.pl/2010/08/16/co-to-jest-schema/</a>). Jakie błędy najczęściej  popełniamy tworząc lub uaktualniając ten plik ? Ja osobiście spotkałem  się z następującymi:</p>
<h3><strong>1. Śmietnik w konfiguracji </strong></h3>
<p>Pierwsza zasada jaką wyznaję to trzymanie pliku <em>schema.xml</em> w  najprostszej z możliwych postaci. Wiąże się z tym jedna bardzo ważna  sprawa &#8211; plik ten nie powinien być synonimem chaosu. Jednym słowem, nie  trzymajmy tak niepotrzebnych komentarzy, niepotrzebnych typów, pól i tak  dalej. Porządek w strukturze indeksu ułatwia nam nie tylko utrzymywanie  tego pliku i jego modyfikacje, ale przede wszystkim upewnia nas, że nie  indeksujemy informacji, które są zbędne z punktu widzenia aplikacji  wykorzystującej Solr.</p>
<h3><strong>2. Kosmetyczne zmiany domyślnej konfiguracji</strong></h3>
<p>Ile z osób, które wykorzystuje Solr w swojej codziennej pracy brało domyślny plik <em>schema</em>.<em>xml</em> dostarczany w przykładowym wdrożeniu Solr i tylko nieznacznie  modyfikowało jego zawartość &#8211; na przykład zmieniając tylko nazwy pól ?  Sam powinienem podnieść rękę, bo sam kiedyś tak zrobiłem. Jest to dość  duży błąd według mnie. Ktoś może się zapytać dlaczego. Czy na pewno  robiąc wyszukiwanie w treściach napisanych w języku polskim potrzebujemy  na przykład angielskiego stemmingu ? Wydaje mi się, że jednak nie  potrzebujemy. Czy na pewno we wszystkich przypadkach potrzebujemy  przechowywać informacje o wektorach termów ?</p>
<h3><strong>3. Brak uaktualnień </strong></h3>
<p>Czasami zdarza mi się trafić na wdrożenia, gdzie wraz z uaktualnieniami wersji Solr nie uaktualnia się pliku <em>schema.xml</em>.  Jeżeli jest to świadoma decyzja, podyktowana np. kosztowną, bądź wręcz  niemożliwą ponowną indeksacją wszystkich danych, to rozumiem sytuację.  Są jednak przypadki kiedy uaktualnienie przyniosłoby same korzyści, a  środki jakie trzeba by było przeznaczyć na takie uaktualnienie są  minimalne (np. mało kosztowna reindeksacja, bądź niewielkie zmiany w  aplikacji). Nie bójmy się uaktualniać pliku <em>schema.xml</em> &#8211; czy chodzi to o aktualizację pól, aktualizację typów, czy dodanie nowszych rzeczy. Dobrym przykładem jest  tutaj migracja z Solr 1.3 na wersję 1.4 wprowadzającą duże zmiany  związane z typami liczbowymi, gdzie migracja na nowe typy skutkowała  naprawdę dużym wzrostem wydajności zapytań z nich korzystających (np.  zapytań wykorzystujących przedziały wartości).&nbsp; <strong><br />
</strong></p>
<h3><strong>4. &#8222;A może kiedyś się przyda&#8221;</strong></h3>
<p>Dodawanie nowych typów, nieusuwanie już niepotrzebnych, tak samo w przypadku pól, czy definicji <em>copyField</em>.  Wiem, to się kiedyś może jeszcze przydać, ale pamiętajmy, że każdy typ  to dodatkowa pamięć potrzebna Solr, każde pole to miejsce w indeksie,  tak samo jak każdy <em>copyField</em>. Moja drobna rada &#8211; jeżeli  przestajesz wykorzystywać typ, pole, czy cokolwiek innego co masz w  pliku konfiguracyjnym (nie tylko w <em>schema.xml</em>) po prostu usuń  to z tego pliku. Stosując tą zasadę przez cały cykl życia aplikacji  korzystającej z Solr będziesz zawsze mieć pewność, że indeks jest w  optymalnym stanie, a po kilku miesiącach od wdrożenia nie trzeba się  będzie zastanawiać i przekopywać przez kod aplikacji, aby sprawdzić czy  na pewno dane pole, czy typ jest wykorzystywany.</p>
<h3><strong>5. Atrybuty, atrybuty i jeszcze raz atrybuty</strong></h3>
<p>Przechowywanie  oryginalnych wartości, dodanie wektora termów i jego właściwości to  tylko przykłady, które mogą spowodować, mamy większy, niż wymaga tego  aplikacja, index. Większy index, mniejsza wydajność, przynajmniej w  niektórych wypadkach (np. w przypadku indeksowania). Warto więc  zastanowić się, czy na pewno potrzebujemy tych wszystkich informacji,  które każemy Solr wyliczać i przechowywać. Usunięcie niektórych,  oczywiście niepotrzebnych z naszego punktu widzenia informacji, może nas  miło zaskoczyć. Czasami warto spróbować <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>
<p>Zapraszam do komentowania, ponieważ chętnie poczytam, na co jeszcze powinno się zwracać uwagę przy modyfikacji pliku <em>schema.xml</em>.</p>
<p>Na koniec, warto wspomnieć o artykule &#8222;<em>The Seven Deadly Sins of Solr</em>&#8221; opublikowanym na stronach LucidImagination pod adresem: <a href="http://www.lucidimagination.com/blog/2010/01/21/the-seven-deadly-sins-of-solr/" target="_blank" rel="noopener noreferrer">http://www.lucidimagination.com/blog/2010/01/21/the-seven-deadly-sins-of-solr/</a>. Opisuje on złe praktyki w trakcie pracy z Solr i zahacza także o temat plików konfiguracyjnych. Moim zdaniem ciekawa lektura. Polecam.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/08/30/5-grzechow-podczas-projektowania-indeksu-solr/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
