<?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>jak nie zadawać zapytań &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/jak-nie-zadawac-zapytan/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>Tue, 10 Nov 2020 08:59:05 +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>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>
