<?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>api &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/api/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:55:47 +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 7.2 &#8211; automatyczne rozmieszczanie replik korzystając z UTILIZENODE</title>
		<link>https://solr.pl/2018/01/02/solr-7-2-automatyczne-rozmieszczanie-replik-korzystajac-z-utilizenode/</link>
					<comments>https://solr.pl/2018/01/02/solr-7-2-automatyczne-rozmieszczanie-replik-korzystajac-z-utilizenode/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Tue, 02 Jan 2018 08:55:18 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[7.2]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[utilizenode]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=744</guid>

					<description><![CDATA[Wraz z premierą Solr 7.2 dostaliśmy nową opcję dostępną w ramach Collections API &#8211; możliwość zmuszenia Solr do relokacji replik na podstawie ustawień autoscalingu. Solr przygląda się replikom oraz ustawieniom autoscalingu, a następnie, w miarę możliwości automatycznie przydziela repliki do]]></description>
										<content:encoded><![CDATA[<p>Wraz z premierą Solr 7.2 dostaliśmy nową opcję dostępną w ramach Collections API &#8211; możliwość zmuszenia Solr do relokacji replik na podstawie ustawień autoscalingu. Solr <em>przygląda</em> się replikom oraz ustawieniom autoscalingu, a następnie, w miarę możliwości automatycznie przydziela repliki do zadanej instancji Solr. Brzmi bardzo fajnie w teorii, zobaczmy zatem, jak działa w praktyce.</p>
<p><span id="more-744"></span></p>
<h3>Autoscaling API w Solr</h3>
<p>Jeżeli nie wiesz co to jest Autoscaling API Solr pozwolę sobię na szybkie wprowadzenie. Jest to API pozwalające na ustawianie reguł dla klastra lub kolekcji, które mówią Solr jak mają być alokowane repliki w Solr. Chcemy wziąć pod uwagę wykorzystanie procesora danej instancji Solr &#8211; możemy to zrobić. Chcemy wziąć pod uwagę wyjorzystanie dysku na danej instancji &#8211; oczywiście możemy to zrobić. Najfajniejsze jest to, iż reguły mogą być definiowane zarówno dla całego klastra, jak również dla pojedynczych kolekcji w klastrze. Daje nam to całkiem dużą swobodę jeżeli chodzi o konfigurację.</p>
<p>Aczkolwiek, zdefiniowane reguły używane są tylko podczas przypisywania replik do instancji Solr. Oznacza to, że w momencie kiedy kolekcja została już stworzona Solr nie będzie korzystał z tych informacji podczas dodawania replik. Zmieniło się to wraz z wprowadzeniem Solr 7.2, gdzie dostaliśmy do dyspozycji komendę <em>UTILIZENODE</em>.</p>
<h3>Środowisko testowe</h3>
<p>Aby umożliwić proste odtworzenie testu zdecydowałem się na urucomienie banalnego środowiska testowego opartego o Solr 7.2 składającego się z dwóch instancji Solr. Pierwsza z nich uruchomiona została następującym poleceniem:
</p>
<pre>$ bin/solr start -c</pre>
<p>Drugą instancję Solr uruchamiamy następującym poleceniem:
</p>
<pre>$ bin/solr start -z localhost:9983 -p 6683</pre>
<p>Po uruchomieniu obu instancji tworzymy pojedynczą kolekcję nazwaną <em>test</em> zbudowaną z jednego lidera i trzech replik, wszystkie stworzone na pojedynczej instancji Solr. Nasz widok kolekcji wygląda następująco:</p>
<p><a href="https://solr.pl/wp-content/uploads/2017/12/cluster_before_load_balancing.png"><img decoding="async" class="aligncenter wp-image-4058" src="https://solr.pl/wp-content/uploads/2017/12/cluster_before_load_balancing-300x47.png" alt="" width="450" height="70"></a></p>
<p>A sam stan opisany odpowiednim plikiem JSON wygląda następująco:
</p>
<pre>{"test":{
    "pullReplicas":"0",
    "replicationFactor":"1",
    "router":{"name":"compositeId"},
    "maxShardsPerNode":"1",
    "autoAddReplicas":"false",
    "nrtReplicas":"1",
    "tlogReplicas":"0",
    "shards":{"shard1":{
        "range":"80000000-7fffffff",
        "state":"active",
        "replicas":{
          "core_node2":{
            "core":"test_shard1_replica_n1",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT",
            "leader":"true"},
          "core_node4":{
            "core":"test_shard1_replica_n3",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT"},
          "core_node6":{
            "core":"test_shard1_replica_n5",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT"},
          "core_node8":{
            "core":"test_shard1_replica_n7",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT"}}}}}}
</pre>
<p>Jak widać mamy potwierdzenie tego, iż wszystkie shardy zostały przypisane do tego samej instancji Solr &#8211; tej z <em>base_url</em> równą <em>http://192.168.1.15:8983/solr</em>.</p>
<p>Mamy zatem następującą sytuację:</p>
<ul>
<li>Mamy klaster Solr, który stowrzony jest z dwóch instancji Solr</li>
<li>W ramach klastra stworzona jest pojedyncza kolekcja</li>
<li>Nasza kolekcja zbudowana jest z czterech shardów &#8211; jednego lidera oraz trzech replik</li>
<li>Wszystkie shardy przypisane są do pojedynczej instancji Solr</li>
</ul>
<p>Podsumowując &#8211; nie korzystamy z wszystkich instancji Solr. Spróbujmy to zmienić korzystając z komendy <em>UTILIZENODE</em> wprowadzonej w Collections API w Solr 7.2.</p>
<h3>Korzystanie z UTILIZENODE w API kolekcji</h3>
<p>Aby zilustrować działanie Autoscaling API oraz <em>UTILIZENODE</em> w Collections API ustawimy pewne preferencje alokacji replik dla całego klastra. Przy pomocy następującego polecenia powiemy Solr, aby starał się minimalizować liczbę coreów na każdej instancji Solr dostępnej w klastrze:
</p>
<pre>$ curl -XPOST 'localhost:8983/api/cluster/autoscaling' -H 'Content-Type:application/json' -d '{
 "set-cluster-preferences" : [
  {"minimize": "cores"}
 ]
}'</pre>
<p>Powyższe polecenie ustawia właściwości dla klastra dotyczące preferencji umieszczania shardów. Mówi, że Solr ma minimalizować liczbę coreów na każdej instancji, a zatem dążyć do jak największego rozproszenia kolekcji. Zatem teraz, korzystając z polecenia <em>UTILIZENODE</em> z Collections API możemy zmusić Solr, aby druga, nieużywana instancja Solr zaczęła być wykorzystywana. Robimy to następującym poleceniem:
</p>
<pre>$ curl -XGET 'localhost:8983/solr/admin/collections?action=UTILIZENODE&amp;node=192.168.1.15:6683_solr'</pre>
<p>Parametr <em>node</em> jest konieczny ponieważ musimy powiedziec Solr, która instancja Solr powinna być brana pod uwagę podczas alokacji. Przetwarzanie polecenia, w zależności od wielkości replik może zająć dość długo, a w związku z tym, w systemie produkcyjnym sugerowane jest uruchamianie tej komendy w asynchronicznie. W naszym przypadku wykonanie będzie dość szybkie i skutkuje takimi zmianami w klastrze:</p>
<p><a href="https://solr.pl/wp-content/uploads/2017/12/cluster_after_load_balancing.png"><img decoding="async" class="aligncenter wp-image-4059" src="https://solr.pl/wp-content/uploads/2017/12/cluster_after_load_balancing-1024x144.png" alt="" width="450" height="63"></a></p>
<p>Plik JSON opisujący stan kolekcji, po zmianach, wygląda następująco:
</p>
<pre>{"test":{
    "pullReplicas":"0",
    "replicationFactor":"1",
    "shards":{"shard1":{
        "range":"80000000-7fffffff",
        "state":"active",
        "replicas":{
          "core_node6":{
            "core":"test_shard1_replica_n5",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT",
            "leader":"true"},
          "core_node8":{
            "core":"test_shard1_replica_n7",
            "base_url":"http://192.168.1.15:8983/solr",
            "node_name":"192.168.1.15:8983_solr",
            "state":"active",
            "type":"NRT"},
          "core_node10":{
            "core":"test_shard1_replica_n9",
            "base_url":"http://192.168.1.15:6683/solr",
            "node_name":"192.168.1.15:6683_solr",
            "state":"active",
            "type":"NRT"},
          "core_node12":{
            "core":"test_shard1_replica_n11",
            "base_url":"http://192.168.1.15:6683/solr",
            "node_name":"192.168.1.15:6683_solr",
            "state":"active",
            "type":"NRT"}}}},
    "router":{"name":"compositeId"},
    "maxShardsPerNode":"1",
    "autoAddReplicas":"false",
    "nrtReplicas":"1",
    "tlogReplicas":"0"}}</pre>
<p>Jak widać dwie repliki zostały przesunięte z instancji <em>192.168.1.15:8983_solr</em> do instancji <em>192.168.1.15:6683_solr</em>, czyli Solr zrobił dokładnie to co chcieliśmy.</p>
<h3>Podsumowanie</h3>
<p>Komenda <em>UTILIZENODE</em> z API kolekcji jest pewną formą automatyzacji zarządzania klastrem. Oczywiście podobny efekt uzyskamy korzystając z poleceń <em>ADDREPLICA</em> oraz <em>DELETEREPLICA</em> ale będzie to zarządzanie manualne i nie będzie brało pod uwagę ustawień klastra i kolekcji. Komenda <em>UTILIZENODE</em> daje nam pewność, iż wszystkie ustawienia, zarówno te dotyczące klastra, jak i te dotyczące kolekcji będą zachowane.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2018/01/02/solr-7-2-automatyczne-rozmieszczanie-replik-korzystajac-z-utilizenode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 5 &#8211; JSON API, część pierwsza</title>
		<link>https://solr.pl/2015/12/21/solr-5-json-api-czesc-pierwsza/</link>
					<comments>https://solr.pl/2015/12/21/solr-5-json-api-czesc-pierwsza/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 21 Dec 2015 21:25:17 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[5]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=678</guid>

					<description><![CDATA[Solr 5 wprowadził wiele zmian do świata Solr, zarówno w kwestii API, jak i samych funkcjonalności. Jedną z wprowadzonych nowości było wprowadzenie API opartego o JSON pozwalającego na zadawanie zapytań w sposób trochę bardziej przyjazny człowiekowi, przynajmniej porównując do długich]]></description>
										<content:encoded><![CDATA[<p>Solr 5 wprowadził wiele zmian do świata Solr, zarówno w kwestii API, jak i samych funkcjonalności. Jedną z wprowadzonych nowości było wprowadzenie API opartego o JSON pozwalającego na zadawanie zapytań w sposób trochę bardziej przyjazny człowiekowi, przynajmniej porównując do długich zapytań opartych o zapytania URI. W tym poście postaramy przybliżyć możliwości korzystania z tego API.</p>
<h2><span id="more-678"></span><br />
Zadawanie zapytań</h2>
<p>Jestem pewien, że wiesz jak zadaje się zapytania do Solr, tak jak jesteśmy przyzwyczajeni. Zatem, aby dostać dokumenty, które mają term <em>solr</em> w polu <em>_text_</em> moglibyśmy użyć następującej komendy:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/select?q=_text_:solr&amp;indent=true'
</pre>
<p>Gwoli wyjaśnienia &#8211; korzystam z jednego z przykładów dostarczonych wraz z Solr (<em>schemaless</em>), a zaindeksowane dane to dokumenty znajdujące się w katalogu <em>docs</em> dostarczanym razem z Solr.</p>
<p>Oczywiście, powyższe zapytanie można zadać także używając JSON API. Aby Solr zwrócił nam dokładnie te same wyniki wyszukiwania, które dostaliśmy w przypadku zapytania powyżej, skorzystalibyśmy z następującej komendy:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/query' -d '{
 "query":"_text_:solr"
}'
</pre>
<p>Przyjemne i proste &#8211; jak widać, wszystko co musimy zrobić, to przekazać obiekt JSON jako payload żądania, który będzie posiadał pole <em>query</em>, za pomocą którego przekazujemy nasze zapytanie. Taki obiekt wysłaliśmy do handlera <em>/query</em> ze względu, że skonfigurowany jest, aby domyślnie odpowiadać w formacie JSON. Oczywiście moglibyśmy skorzystać z handlera <em>/select</em>, ale wtedy odpowiedź zwrócona zostałaby w formacie XML.</p>
<p>Jeżeli chodzi o zadawanie zapytań, to zamiast przekazywania obiektu JSON, możemy przekazać standardowe parametry. Dokładnie tak, nie musimy przekazywać ich jako parametrów URI, ale w ciele żądania:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/query' -d 'q=_text_:solr'
</pre>
<p>Tym razem, nie mamy obiektu JSON. Standardowy parametr <em>q</em> został przekazany w ciele żądania i przesłany do handlera <em>/query</em>. Jeżeli chcemy przekazać więcej parametrów oddzielamy je znakiem <em>&amp;</em>.</p>
<h2>Stronnicowanie</h2>
<p>Oczywiście, korzystając z JSON API możemy także kontrolować stronicowanie. W tym celu korzystamy z dwóch parametrów &#8211; <em>limit</em> oraz <em>offset</em>. Pierwszy z nich, <em>limit</em> definiuje maksymalną liczbę dokumentów jaką Solr może zwrócić. Parametr <em>offset</em> odpowiedzialny jest za określenie od którego dokumentu wyniki wyszukiwania mają być pokazywane. Na przykład, aby dostać maksymalnie 20 dokumentów zaczynając od jedenastego wykorzystalibyśmy następujące zapytanie:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/query' -d '{
 "query":"_text_:solr",
 "limit":20,
 "offset":10
}'
</pre>
<h2>Sortowanie</h2>
<p>Kolejna rzecz to możliwość sortowania wyników wyszukiwania &#8211; oczywiście, także dostępna. Aby posortować nasze wyniki wyszukiwania na podstawie pola o nazwie <em>id</em> malejąco użylibyśmy następującego zapytania:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/query' -d '{
 "query":"_text_:solr",
 "sort":"id desc"
}'
</pre>
<p>Jak widać definicja sortowania jest taka sama, jak w przypadku sortowania w kiedy korzystamy z parametrów URI i parametru <em>sort</em>.</p>
<h2>Filtrowanie</h2>
<p>Na koniec zostawiliśmy sobie filtrowanie. Do filtrowania wykorzystujemy właściwość <em>filter</em> obiekty JSON przesyłanego w ciele żądania. Na przykład zapytanie zawężąjące wyniki wyszukiwania tylko do tych dokumentów, które mają wartość <em>text/html</em> w polu <em>content_type</em> wyglądałoby następująco:</p>
<pre class="brush:xml">curl -XGET 'localhost:8983/solr/gettingstarted/query' -d '{
 "query":"_text_:solr",
 "filter":"content_type:text/html"
}'
</pre>
<h2>Co dalej?</h2>
<p>Jak widać, JSON API w Solr jest bardzo przyjemne i proste w wykorzystaniu pozwalając nam na definiowanie zapytań z pewną strukturą. W następnym wpisie postaramy się przybliżyć kolejną możliwość JSON API, czyli faceting. Postaramy się pokazać różnice pomiędzy starą implementacją obecną w Solr już od bardzo dawna, a nową, wprowadzoną stosunkowo niedawno.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2015/12/21/solr-5-json-api-czesc-pierwsza/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 4.2: Schema API</title>
		<link>https://solr.pl/2013/05/20/solr-4-2-schema-api/</link>
					<comments>https://solr.pl/2013/05/20/solr-4-2-schema-api/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 20 May 2013 10:11:50 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[4.2]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[schema.xml]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=511</guid>

					<description><![CDATA[Wraz z premierą Solr 4.2 dostaliśmy możliwość wykorzystania protokołu HTTP do pobierania informacji o strukturze indeksu Solr. Oczywiście, jeżeli ktoś potrzebował takiej funkcjonalności przez Solr 4.2 mógł pobrać plik schema.xml za pomocą odpowiedniego zapytania, przetworzyć go i wydobyć szukane informacje.]]></description>
										<content:encoded><![CDATA[<p>Wraz z premierą Solr 4.2 dostaliśmy możliwość wykorzystania protokołu HTTP do pobierania informacji o strukturze indeksu Solr. Oczywiście, jeżeli ktoś potrzebował takiej funkcjonalności przez Solr 4.2 mógł pobrać plik <em>schema</em><em>.xml</em> za pomocą odpowiedniego zapytania, przetworzyć go i wydobyć szukane informacje. Wraz z premierą Solr 4.2 dostaliśmy jednak bardzo wygodne narzędzie za pomocą którego jesteśmy w stanie wydobyć interesujące nas informacje bez konieczności przetwarzania całego pliku <em>schema.xml</em>.</p>
<p><span id="more-511"></span></p>
<h3>Możliwości</h3>
<p>Przyjrzymy się zatem nowemu API.</p>
<h4>Zwracanie informacji w formacie XML</h4>
<p>Bardzo dużo użytkowników Solr przyzwyczajonych jest do tego, iż dane z Solr zwracane są domyślnie w formacie XML, co nie jest prawdą w przypadku opisywanego API, którego domyślny format zwracanych danych to JSON. Jeżeli chcemy, aby powyżej opisane informacje zwracane były w formacie XML należy do każdego z wymienionych zapytań dodać parametr <em>wt=xml</em>, na przykład:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes?wt=xml'</pre>
<h4>Pobieranie zdefiniowanych pól</h4>
<p>Zacznijmy od pobierania informacji na temat pól zdefiniowanych w indeksie. W tym celu udostępnione zostały dwie możliwości:</p>
<ol>
<li>Pobieranie informacji na temat wszystkich pól</li>
<li>Pobieranie informacji na temat konkretnego pola</li>
</ol>
<p>W pierwszym wypadku należy zadać następujące zapytanie:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/fields'</pre>
<p>W drugim przypadku wystarczy do powyższego zapytania dodać znak <em>/</em> oraz nazwę pola. Na przykład, aby pobrać dane na temat pola <em>author</em> należałoby wysłać następujące zapytanie:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/fields/author'</pre>
<p>Odpowiedź Solr na pierwsze zapytanie wygląda następująco:
</p>
<pre class="brush:plain">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":1},
&nbsp; "fields":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"_version_",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"long",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"author",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"text_general",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"cat",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"string",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "multiValued":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"category",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"text_general",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"id",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"string",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "multiValued":false,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "required":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "uniqueKey":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"url",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"text_general",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"weight",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"float",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true}]}</pre>
<p>Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:
</p>
<pre class="brush:plain">{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "field":{
    "name":"author",
    "type":"text_general",
    "indexed":true,
    "stored":true}}</pre>
<h4>Pobieranie zdefiniowanych pól dynamicznych</h4>
<p>Dokładnie tak samo, jak w powyższym przypadku wygląda sytuacja kiedy chcemy pobrać informacje na temat pól dynamicznych. Także i w tym przypadku mamy dwie możliwości:</p>
<ol>
<li>Pobranie informacji na temat wszystkich pól dynamicznych</li>
<li>Pobranie informacji na temat konkretnego wzorca pola dynamicznego</li>
</ol>
<p>W pierwszym wypadku należy zadać następujące zapytanie:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields'</pre>
<p>W drugim przypadku, podobnie jak wcześniej, dodajemy znak <em>/</em>, a następnie wzorzec:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/dynamicfields/random_*'</pre>
<p>Odpowiedź Solr na pierwsze zapytanie wygląda następująco:
</p>
<pre class="brush:plain">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":2},
&nbsp; "dynamicfields":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"*_coordinate",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"tdouble",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":false},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"ignored_*",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"ignored",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "multiValued":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"random_*",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"random"},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"*_p",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"location",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"*_c",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type":"currency",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "indexed":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "stored":true}]}</pre>
<p>Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:
</p>
<pre class="brush:plain">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":1},
&nbsp; "dynamicfield":{
&nbsp;&nbsp;&nbsp; "name":"random_*",
&nbsp;&nbsp;&nbsp; "type":"random"}}</pre>
<h4>Pobieranie typów pól</h4>
<p>Jak można się domyślać, podobnie jak w wyżej wymienionych przypadkach, tak samo w przypadku pobierania informacji na temat typów pól możemy dostać od Solr informacje na temat:</p>
<ol>
<li>Wszystkich typów pól zdefiniowanych w pliku <em>schema.xml</em></li>
<li>Pojedynczego zdefiniowanego typu</li>
</ol>
<p>W pierwszym wypadku należy zadać następujące zapytanie:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes'</pre>
<p>W drugim przypadku, na dokładnie takiej samej zasadzie dodajemy znak <em>/</em>, a następnie nazwę typu:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/fieldtypes/text_gl'</pre>
<p>Odpowiedź Solr na pierwsze zapytanie wygląda następująco:
</p>
<pre class="brush:plain">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":3},
&nbsp; "fieldTypes":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"alphaOnlySort",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TextField",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "sortMissingLast":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "omitNorms":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "analyzer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TokenizerChain",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "tokenizer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.KeywordTokenizerFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "filters":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.LowerCaseFilterFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TrimFilterFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.PatternReplaceFilterFactory",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "replace":"all",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "replacement":"",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "pattern":"([^a-z])"}]},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "fields":[],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dynamicFields":[]},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"boolean",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.BoolField",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "sortMissingLast":true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "fields":["inStock"],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dynamicFields":["*_bs",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*_b"]},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"text_gl",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TextField",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "positionIncrementGap":"100",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "analyzer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TokenizerChain",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "tokenizer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.StandardTokenizerFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "filters":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.LowerCaseFilterFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.StopFilterFactory",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "words":"lang/stopwords_gl.txt",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ignoreCase":"true",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "enablePositionIncrements":"true"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.GalicianStemFilterFactory"}]},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "fields":[],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dynamicFields":[]},
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name":"tlong",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TrieLongField",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "precisionStep":"8",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "positionIncrementGap":"0",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "fields":[],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dynamicFields":["*_tl"]}]}</pre>
<p>Natomiast odpowiedź na zapytanie dotyczące pojedynczego pola wygląda następująco:
</p>
<pre class="brush:plain">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":2},
&nbsp; "fieldType":{
&nbsp;&nbsp;&nbsp; "name":"text_gl",
&nbsp;&nbsp;&nbsp; "class":"solr.TextField",
&nbsp;&nbsp;&nbsp; "positionIncrementGap":"100",
&nbsp;&nbsp;&nbsp; "analyzer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.TokenizerChain",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "tokenizer":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.StandardTokenizerFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "filters":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.LowerCaseFilterFactory"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.StopFilterFactory",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "words":"lang/stopwords_gl.txt",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ignoreCase":"true",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "enablePositionIncrements":"true"},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "class":"solr.GalicianStemFilterFactory"}]},
&nbsp;&nbsp;&nbsp; "fields":[],
&nbsp;&nbsp;&nbsp; "dynamicFields":[]}}</pre>
<p>Jak widać ilość zwracanych informacji jest dość duż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>
<h4>Pobieranie informacji na temat sekcji copyField</h4>
<p>Dodatkowo za pomocą opisywanego API jesteśmy w stanie pobrać informacje na temat sekcji <em>copyField</em> poprzez wysłanie następującego zapytania:
</p>
<pre class="brush:bash">$curl 'http://localhost:8983/solr/collection1/schema/copyfields'</pre>
<p>Odpowiedź na powyższe zapytanie jest następująca:
</p>
<pre class="brush:plain">{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "copyfields":[{
      "source":"author",
      "dest":"text"},
    {
      "source":"cat",
      "dest":"text"},
    {
      "source":"content",
      "dest":"text"},
    {
      "source":"content_type",
      "dest":"text"},
    {
      "source":"description",
      "dest":"text"},
    {
      "source":"features",
      "dest":"text"},
    {
      "source":"author",
      "dest":"author_s",
      "destDynamicBase":"*_s"}]}</pre>
<h3>Przyszłość</h3>
<p>W Solr 4.3 opisywane API zostało usprawnione oraz jest przygotowywane do umożliwienia zmian w strukturze indeksu za pomocą protokołu HTTP. Możemy zatem spodziewać się, iż w jednej z kolejnych wersji serwera wyszukiwania Solr otrzymamy możliwość łatwej zmiany struktury indeksu, przynajmniej takich, które nie będą powodować konfliktów z już zaindeksowanymi danymi.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2013/05/20/solr-4-2-schema-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
