<?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>zapytania &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/zapytania/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>6 grzechów głównych w kontekście zadawania zapytań</title>
		<link>https://solr.pl/2010/08/11/6-grzechow-glownych-w-kontekscie-zadawania-zapytan/</link>
					<comments>https://solr.pl/2010/08/11/6-grzechow-glownych-w-kontekscie-zadawania-zapytan/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Wed, 11 Aug 2010 13:16:08 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[facet]]></category>
		<category><![CDATA[facet.limit]]></category>
		<category><![CDATA[facet.offset]]></category>
		<category><![CDATA[jak nie zadawać zapytań]]></category>
		<category><![CDATA[jak zadawać zapytania]]></category>
		<category><![CDATA[poprawne zapytania]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[zapytania]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=22</guid>

					<description><![CDATA[W swojej dotychczasowej pracy związanej z Lucene i Solr spotkałem się z różnymi zapytaniami. O ile w przypadku Lucene programista z reguły wie co chce osiągnąć i zastanawia się nad optymalnym rozwiązaniem, o tyle w przypadku Solr już tak nie]]></description>
										<content:encoded><![CDATA[<p>W swojej dotychczasowej pracy związanej z Lucene i Solr spotkałem się z różnymi zapytaniami. O ile w przypadku Lucene programista z reguły wie co chce osiągnąć i zastanawia się nad optymalnym rozwiązaniem, o tyle w przypadku Solr już tak nie jest. Solr jest produktem z którego teoretycznie może skorzystać każdy, zarówno osoba nie znająca języka Java, taka, która nie posiada szerokiej i specjalistycznej wiedzy technicznej, jak również programista. Właśnie ze względu na to, że Solr jest produktem, który bardzo łatwo uruchomić i z niego skorzystać, wiele osób nie zadaje sobie trudu związanego z przeczytaniem dokumentacji, czy przejrzeniem listy dyskusyjnej użytkowników. Co za tym idzie, ludzie Ci, wcześniej czy później popełniają błędy &#8211; błędy wynikające z różnych braków &#8211; braku wiedzy na temat Solr, umiejętności, doświadczenia, czy ze zwykłego braku czasu i napiętych terminów. Chciałbym dzisiaj przedstawić kilka podstawowych błędów przy składaniu zapytań i jak ich uniknąć.</p>
<p><span id="more-22"></span></p>
<h3>1. Brak wykorzystania filtrów</h3>
<p>Jednym z podstawowych błędów jakie spotykam co jakiś czas jest brak wykorzystania filtrów, czyli prosto mówiąc brak wykorzystania parametru <em>fq </em>w zapytaniach. Pamiętajmy o tym, filtry to nasi przyjaciele <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;" /> Dzięki filtrom cache wykorzystywany jest bardziej optymalnie. Filtry nie wpływają na ważność dokumentu w kontekście zapytania (współczynnik <em>score</em>), a co za tym idzie, możemy wykonywać zawężania bez obawy o zmianę wartości <em>score</em> poszczególnych dokumentów (przydatne np. w sklepach e-commerce w przypadku zawężania grup produktów).</p>
<h3>2. Warunki logiczne i parametr q</h3>
<p>Kolejny z &#8222;grzechów&#8221; jakie spotykam dość często, dość mocno związany z poprzednim punktem. Nie jest to może błąd w dosłownym tego słowa znaczeniu, aczkolwiek, jest to obszar, gdzie prosta zmiana będzie miała spory wpływ na wydajność. Zakładając, że domyślnym operatorem logicznym jest <em>OR</em>, wyobraźmy sobie zapytanie w postaci <code>q=(java+wzorce+projektowe)+AND+kategoria:ksiazki+AND+promocja:true+AND+wydawnictwo:ABC</code>. Zapytanie to jest jak najbardziej poprawne z punktu widzenia logiki aplikacji, gdzie mamy dostać odpowiednią grupę wyników wyszukiwania. Co jednak, jeżeli chcemy, aby także optymalnie wykorzystywało cache Solr, a tym samym wykonywało się szybciej. Odpowiedź jest dość prosta &#8211; należy przenieść niektóre z warunków do filtrów. Zmieniając przedstawione zapytanie na<code> q=java+wzrce+projektowe&amp;fq=kategoria:ksiazki&amp;fq=promocja:true&amp;fq=wydawnictwo:ABC</code> Solr skorzysta z dwóch rodzajów cache &#8211; <em>queryDocumentCache </em>w celu pobrania dokumentów dla zapytania z parametru <em>q</em> oraz z <em>filterCache </em>dla każdego z filtrów. Zmiana zapytania w pokazany sposób pozwoliła na wykorzystanie dodatkowego cache oraz na uporządkowanie wpisów w <em>queryDocumentCache </em>(ze względu na skrócenie zapytania w parametrze <em>q</em>).</p>
<h3>3. Ogromne ilości facet query</h3>
<p>Kolejny &#8222;grzech&#8221; związany z obsługą grup dokumentów. Dość często, szczególnie, w przypadku aplikacji które mają dużą ilość parametrów pozwalających kategoryzować produkty spotykałem zapytania z dużą ilością parametrów <em>facet.query</em>. Zapytania te używane były do wyświetlania grup dokumentów &#8211; według ceny, lokalizacji, grup i tak dalej. Dobrym przykładem jest grupowanie po cenie, gdzie klient biznesowy może określać przedziały cenowe dla poszczególnych kategorii i na tym podstawie grupować produkty. Pamiętajmy, że dołożenie do zapytania 100, czy 200 razy parametru <em>facet.query</em> odbija się na wydajności i to czasami dość znacznie. Jeżeli interesuje nas szybka reakcja Solr nie możemy stosować takich zapytań. W takich wypadkach zawsze proponuję modyfikację struktury indeksu, czyli stworzenie odpowiednich przedziałów w importerze aplikacji i przekazywanie do Solr identyfikatorów tych przedziałów, które tłumaczy aplikacja. Pozwala to na zlikwidowanie dziesiątek, czy setek <em>facet.query</em> na rzecz jednego parametru facet, po odpowiednim polu (oczywiście w przykładzie z grupami zależnymi od kategorii mogą to być pola dynamiczne). Wiąże się z jeszcze jedną niedogodnością &#8211; wytłumaczeniem klientowi, dlaczego musi nacisnąć przycisk reindeksacji danych po zmianach przedziałów. Z reguły jednak testy wydajnościowe przy dużym obciążeniu i dużej różnorodności zapytań mówią same za siebie.</p>
<h3>4. Limity facetingu</h3>
<p>Problem pojawiający się na styku zapytań zadawanych do Solr, a logiki biznesowej jaką realizować ma aplikacja korzystająca z Solr. Przykładem tego &#8222;grzechu&#8221; jest prosta lista kategorii, którą klient chce mieć wyświetlaną w zależności od strony na jakiej znajduje się użytkownik. Kiedy kategorii jest mało nie mamy problemu, gorzej kiedy tych kategorii jest bardzo dużo. Bardzo często spotykałem się z podejściem ze strony programistów, aby pobierać wszystkie kategorie z Solr (z mocno zwiększonym w stosunku do domyślnego parametrem <em>facet.limit</em>) i dopiero w aplikacji zawężać te wyniki. Według mnie jest to podejście, które może generować problemy &#8211; po pierwsze faceting wymaga pamięci, po drugie czasu na przetworzenie i agregację wyników. Co więcej, pobranie wszystkich 50.000 kategorii wraz z licznościami może być bolesne dla Solr. Jeżeli zależy nam na szybkich zapytaniach, starajmy się korzystać z parametru facet.limit rozsądnie i ewentualnie tak budować aplikację, aby możliwe było stronicowanie wyników facetingu i korzystanie tym samym z parametru <em>facet.offset</em>. Jeżeli nie jest to możliwe, to przynajmniej skonfigurujmy tak kontener w którym działa Solr, aby miał wystarczającą ilość pamięci, aby obsłużyć równoległe zapytania i przygotujmy się, że zapytania z dużą wartością <em>facet.limit</em> mogą wykonywać się dłużej, niż inne.</p>
<h3>5. Pobieranie niepotrzebnych danych</h3>
<p>Bardzo często spotykanym problemem jest pobieranie wszystkich informacji, a nie tylko tych, które są nam potrzebne. Oczywiście problem nie dotyczy wdrożeń, gdzie Solr serwuje informacje takie jak na przykład identyfikator produktu i tylko identyfikator. Jednak, duża ilość wdrożeń z którą miałem do czynienia opierała się prawie w całości na Solr, a co za tym idzie indeks składał się z wielu pól z atrybutem <em>stored</em> ustawionym na wartość <em>true</em>. Programiści korzystający z Solr bardzo rzadko korzystali z parametru<em> fl</em> oraz możliwości ograniczania pól, które są zwracane odpowiedzi. W ekstremalnych przypadkach prowadziło to do problemów z ilością danych, jakie trzeba było przesyłać przez sieć.</p>
<h3>6. Wiele zapytań do uzyskania liczności grup dokumentów</h3>
<p>W niektórych wdrożeniach ważniejsze od standardowego wyszukiwania, gdzie użytkownik wpisuje frazę jaką chce znaleźć, jest przechodzenie do dokumentów za pomocą nawigacji, na przykład przy pomocy działów, kategorii, podkategorii i tak dalej. Bardzo często oprócz na przykład nazwa kategorii podaje się także informacje takie jak ilość dokumentów w tej kategorii, czyli np. produktów. Spotkałem się z przypadkami, gdzie ilości dokumentów w poszczególnych kategoriach były pobierane za pomocą oddzielnych zapytań. Skutek &#8211; wyświetlenie 100 kategorii na formatce skutkowało taką samą ilością zapytań do Solr. Nie róbmy tego &#8211; jeżeli trzeba zmodyfikujmy indeks Solr tak, aby możliwe było wykorzystanie mechanizmów facetingu. Może w danym momencie będzie to więcej pracy, ale na pewno w dłuższej perspektywie czasu się to opłaci.</p>
<h3>Kilka słów na koniec</h3>
<p>Należy pamiętać, że są to tylko przykłady, które uważam za dość powszechne, a przynajmniej na które dość często natknąłem się podczas pracy. Nie są to na pewno wszystkie błędy popełniane przy korzystaniu z Solr, jednak mam nadzieję, że przynajmniej w pewnym stopniu uwypuklają stronę w którą należy spoglądać generując zapytania do Solr, czy optymalizując już istniejące.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/08/11/6-grzechow-glownych-w-kontekscie-zadawania-zapytan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
