<?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>filtrowanie &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/filtrowanie/feed/" rel="self" type="application/rss+xml" />
	<link>https://solr.pl</link>
	<description>All things to be found - Blog related to Apache Solr &#38; Lucene projects - https://solr.apache.org</description>
	<lastBuildDate>Wed, 11 Nov 2020 18:45:51 +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 filtry: PatternReplaceCharFilter</title>
		<link>https://solr.pl/2011/05/09/solr-filtry-patternreplacecharfilter/</link>
					<comments>https://solr.pl/2011/05/09/solr-filtry-patternreplacecharfilter/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 09 May 2011 17:45:06 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[filtr]]></category>
		<category><![CDATA[filtrowanie]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[schema.xml]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[tokenizer]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=240</guid>

					<description><![CDATA[Kontynuując przeglad filtrów dostępnych w Solr dziś przyglądamy się pracy PatternReplaceCharFilter. Jak łatwo się domyślić zadaniem filtra jest zamiana w strumieniu wejściowym tych fragmentów, które pasują do danego wyrażenia regularnego. Dostępne są następujące parametry: pattern (wymagany) – wartość, która zostanie]]></description>
										<content:encoded><![CDATA[<p>Kontynuując przeglad filtrów dostępnych w Solr dziś przyglądamy się pracy PatternReplaceCharFilter.</p>
<p>Jak łatwo się domyślić zadaniem filtra jest zamiana w strumieniu wejściowym tych fragmentów, które pasują do danego wyrażenia regularnego.</p>
<p><span id="more-240"></span></p>
<p>Dostępne są następujące parametry:</p>
<ul>
<li><em>pattern</em> (wymagany) – wartość, która zostanie zamieniona 	(wyrażenie regularne)</li>
<li><em>replacement</em> (domyślnie: &#8222;&#8221;) &#8211; wartość, którą 	zostanie zastąpiony dopasowany do wyrażenia regularnego fragment</li>
<li><em>blockDelimiters</em></li>
<li><em>maxBlockChars</em> (domyślnie: 10000, większe od 0) – bufor używany przy porówaniu</li>
</ul>
<h2>Przykłady wykorzystania</h2>
<p>Wykorzystanie filtru sprowadza się do dodania jego definicji w definicji typu pola w schema.xml np.:
</p>
<pre class="brush:xml">&lt;fieldType name="textCharNorm" class="solr.TextField"&gt;
  &lt;analyzer&gt;
    &lt;charFilter class="solr.PatternReplaceCharFilterFactory" …/&gt;
    &lt;charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/&gt;
    &lt;tokenizer class="solr.WhitespaceTokenizerFactory"/&gt;
  &lt;/analyzer&gt;
&lt;/fieldType&gt;</pre>
<p>Poniżej przykładowe definicje dla różnych przypadków.</p>
<h3>Wycinanie fragmentów tekstu</h3>
<p>To najprostszy przypadek. Należy tylko podać w atrybucie pattern to co chcemy wyciąć i już. Przykład:
</p>
<pre class="brush:xml">&lt;charFilter class="solr.PatternReplaceCharFilterFactory" pattern="#TAG" /&gt;</pre>
<p>co spowoduje pomijanie w treści danych elementów: &#8222;#TAG&#8221;</p>
<h3>Zamiana fragmentów tekstu</h3>
<p>Przypadek podobny do tego wyżej, natomiast chcemy zamienić tekst na inny.
</p>
<pre class="brush:xml">&lt;charFilter class="solr.PatternReplaceCharFilterFactory" pattern="#TAG" replacement="[CENZORED]"/&gt;</pre>
<h3>Zamiana wzorców</h3>
<p>Powyższe przypadki były trywialne. To, co stanowi o sile tego filtru to obsługa wyrażeń regularnych. (Używasz wyrażeń regularnych, prawda?) Poniższy przykład jest prosty – ukrywa  wszystkie liczby (zamieniając je na gwiazdki). Radzi sobie również z liczbami oddzielonymi myślnikami, traktując je jako pojedyncze liczby.
</p>
<pre class="brush:xml">&lt;charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\\d+-*\\d+)+" replacement="*"/&gt;</pre>
<h3>Manipulacja tekstem</h3>
<p>Tekst zastępujący nie musi być prostym tekstem. Obsługiwane są tzw. odwołania wsteczne, które pozwalają na odwołanie się do fragmentów dopasowanego wzorca. Po szczegóły odsyłam do dokumentacji wyrażeń regularnych. W poniższym przykładzie wszystkie zwielokrotnione znaki zastępowane są znakiem pojedynczym.
</p>
<pre class="brush:xml">&lt;charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(.)\\1" replacement="$1"/&gt;</pre>
<h2>Parametry zaawansowane</h2>
<p>Do tej pory nie wspomniałem o parametrach: <em>blockDelimiters</em> i <em>maxBlockChars</em>. Jak wynika ze źródeł filtra, są one związane ze sposobem jego implementacji. <em>CharFilter</em> z założenia operuje na pojedynczych znakach, natomiast dopasowanie wzorca wymaga wczytania do wewnętrznego bufora większej liczby znaków. <em>MaxBlockChars</em> pozwala na okreśłenie rozmiaru tego bufora. W zasadzie nie musisz się tym martwić, jeśli wzorzec, który zdefiniowałeś, nie powoduje dopasowania większego kawałka tekstu (większy oznacza tu powyżej 10tys znaków). <em>BlockDelimiters</em> pozwala dodatkowo zoptymalizować wypełnianie tego bufora. Może być używany, jeśli informacja w analizowanym polu jest w jakiś sposób podzielona na sekcje (np. jest to CSV, zdania itp.). Jest to tekst, który informuje skaner, że zaczyna się nowa sekcja, w związku z tym, ew fragmenty dopasowania z poprzedniej sekcji już się nie przydadzą.</p>
<h2>Ograniczenia</h2>
<p>Ważnym ograniczeniem filtra jest to, że w bezpośredni sposób manipuluje napisem wejściowym, nie zachowując informacji związanych z początkowym tekstem. Oznacza to, że jeśli filtr usunie jakiś fragment napisu, lub doda nowy fragment, tokenizer tego nie zauważy i położenie tokenów w oryginalnym polu nie zostanie poprawnie zapisane. Trzeba mieć tego świadomość w sytuacji używania zapytań biorących pod uwagę wzajemne położenie słów oraz w przypadku używania highlightingu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/05/09/solr-filtry-patternreplacecharfilter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kilka słów o optymalizacji &#8211; filter cache</title>
		<link>https://solr.pl/2011/02/07/kilka-slow-o-optymalizacji-filter-cache/</link>
					<comments>https://solr.pl/2011/02/07/kilka-slow-o-optymalizacji-filter-cache/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 07 Feb 2011 08:02:49 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[filter cache]]></category>
		<category><![CDATA[filterCache]]></category>
		<category><![CDATA[filtr]]></category>
		<category><![CDATA[filtrowanie]]></category>
		<category><![CDATA[query]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=180</guid>

					<description><![CDATA[Dzisiejszy wpis poświęcony został jednemu z typów cache w Solr &#8211; filter cache. Postaram się przedstawić do czego służy, jak go skonfigurować i jak go optymalnie wykorzystywać. Zapraszam do lektury. Co przechowuje Zacznijmy od środka. FilterCache przechowuje nieuporządkowany zbiór identyfikatorów]]></description>
										<content:encoded><![CDATA[<p>Dzisiejszy wpis poświęcony został jednemu z typów cache w Solr &#8211; filter cache. Postaram się przedstawić do czego służy, jak go skonfigurować i jak go optymalnie wykorzystywać. Zapraszam do lektury.</p>
<p><span id="more-180"></span></p>
<h3>Co przechowuje</h3>
<p>Zacznijmy od środka. FilterCache przechowuje nieuporządkowany zbiór identyfikatorów dokumentów. Oczywiście nie są to identyfikatory zdefiniowanie w pliku <em>schema.xml</em> jako unikalny klucz, a wewnętrzne identyfikatory dokumentów używane przez Lucene i Solr &#8211; warto o tym pamiętać.</p>
<h3>Do czego służy</h3>
<p>Głównym zadaniem <em>filterCache </em>jest przechowywanie wyników związanych z wykorzystaniem filtrów. Aczkolwiek nie jest to jego jedyne zastosowanie. Oprócz tego cache ten może służyć jako pomoc przy facetingu (w przypadku korzystania z metody <em>TermEnum</em>) oraz do sortowania w przypadku określenia opcji <em>&lt;useFilterForSortedQuery/&gt;</em> na <em>true</em> w pliku<em> solrconfig.xml</em>.</p>
<h3>Definicja</h3>
<p>Standardowa definicja filterCache wygląda następująco:
</p>
<pre class="brush:xml">&lt;filterCache
      class="solr.FastLRUCache"
      size="16384"
      initialSize="4096"
      autowarmCount="4096" /&gt;</pre>
<p>Dostępne są następujące opcje konfiguracyjne:</p>
<ul>
<li><em>class </em>&#8211; klasa odpowiadająca za implementację. Do <em>filterCache </em>polecam korzystanie z <em>solr.FastLRUCache</em>, który charakteryzuje się większą wydajnością w przypadku większej ilości operacji GET, niż PUT.</li>
<li><em>size </em>&#8211; maksymalna ilość wpisów jaka może znaleźć się w cache&#8217;u.</li>
<li><em>initialSize </em>&#8211; początkowa wielkość cache&#8217;u.</li>
<li><em>autowarmCount </em>&#8211; ilość wpisów jaka będzie przepisywana podczas rozgrzewania ze starego cache&#8217;u do nowego.</li>
<li><em>minSize </em>&#8211; wartość określająca do jakiej ilości wpisów Solr będzie próbował redukować cache w przypadku pełnego uzupełnienia.</li>
<li><em>acceptableSize </em>&#8211; jeżeli Solr nie będzie w stanie sprowadzić ilości wpisów do tej określonej za pomocą parametru <em>minSize</em>, to wartość <em>acceptableSize</em> będzie tą, do której będzie dążył jako kolejnej.</li>
<li><em>cleanupThread </em>&#8211; wartość domyślna to <em>false</em>. W przypadku ustawienia na <em>true</em> do czyszczenia cache&#8217;u będzie wykorzystywany oddzielny wątek.</li>
</ul>
<p>W większości przypadków wykorzystanie parametrów <em>size</em>, <em>initialSize</em> oraz <em>autowarmCount </em>jest w zupełności wystarczające.</p>
<h3>Jak skonfigurować</h3>
<p>Wielkość cache&#8217;u powinna być określana na podstawie zapytań, które wysyłane są do Solr. Maksymalna wielkość <em>filterCache </em>powinna być przynajmniej tak duża jak ilość filtrów (wraz z wartościami) jaką wykorzystujemy. Oznacza to, że jeżeli nasza aplikacja charakteryzuje się, w zadanym okresie czasu, wykorzystaniem np. 2000 różnych filtrów (parametrów <em>fq</em> wraz z wartościami), to parametr <em>size</em> powinien być ustawiony na wartości minimum 2000.</p>
<h3>Efektywne wykorzystanie</h3>
<p>Jednak samo skonfigurowanie cache&#8217;u to nie koniec &#8211; ważne, aby zapytania potrafiły to wykorzystać. Weźmy na przykład zapytanie:
</p>
<pre class="brush:xml">q=nazwa:solr+AND+kategoria:ksiazka+AND+dzial:ksiazki</pre>
<p>Na pierwszy rzut oka zapytanie jest jak najbardziej poprawne. Jest z nim jednak jeden problem &#8211; nie korzysta z <em>filterCache</em>. Całe zapytanie zostanie obsłużone przez <em>queryResultCache</em> i stworzy w nim pojedynczy wpis. Zmodyfikujemy je trochę i zadajmy je w następujący sposób.
</p>
<pre class="brush:xml">q=nazwa:solr&amp;fq=kategoria:ksiazka&amp;fq=dzial:ksiazki</pre>
<p>Co się stanie teraz ? Tak jak w poprzednim wypadku, stworzony zostanie jeden wpis w <em>queryResultCache</em> oraz dwa wpisy w <em>filterCache</em>. Dlaczego jest to ważne ? Weźmy kolejne zapytanie:
</p>
<pre class="brush:xml">q=nazwa:lucene&amp;fq=kategoria:ksiazka&amp;fq=dzial:ksiazki</pre>
<p>To zapytanie stworzyłoby kolejny wpis w <em>queryResultCache</em> oraz wykorzystałoby dwa już istniejące w <em>filterCache</em> wpisy, a tym samym Solr skróciłbym czas wykonania zapytaniai oszczędziłby operacji I/O na indeksie.</p>
<p>Jeżeli natomiast wykonalibyśmy zapytanie w postaci:
</p>
<pre class="brush:xml">q=nazwa:lucene+AND+kategoria:ksiazka+AND+dzial:ksiazki</pre>
<p>Solr nie byłby w stanie wykorzystać żadnych informacji z cache&#8217;u i musiałby w celu zalezienia wyników pobierać wszystkie informacje z indeksu Lucene.</p>
<h3>Kilka słów na koniec</h3>
<p>Jak widać, samo skonfigurowanie cache&#8217;u w poprawny sposób nie gwarantuje tego, że Solr będzie w stanie go wykorzystać. To od tego jak zadajemy zapytania zależy, jak wydajny w docelowym wdrożeniu będzie Solr. Warto o tym pamiętać podczas planowania wdrożenia.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/02/07/kilka-slow-o-optymalizacji-filter-cache/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Proces wyszukiwania</title>
		<link>https://solr.pl/2010/08/09/proces-wyszukiwania/</link>
					<comments>https://solr.pl/2010/08/09/proces-wyszukiwania/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 09 Aug 2010 16:12:16 +0000</pubDate>
				<category><![CDATA[Ogólna]]></category>
		<category><![CDATA[faceting]]></category>
		<category><![CDATA[filtrowanie]]></category>
		<category><![CDATA[podstawy]]></category>
		<category><![CDATA[sortowanie]]></category>
		<category><![CDATA[wyszukiwanie]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=20</guid>

					<description><![CDATA[Niniejszym inaugurujemy część solr.pl poświęconą tym zagadnieniom, które nie są związane z konkretnym silnikiem wyszukiwania a raczej z budową i rozwojem funkcjonalności serwisów internetowych związanych z wyszukiwaniem. Czy zastanawialiście się co powoduje, że wyszukiwarka w serwisie jest uważana za dobrą?]]></description>
										<content:encoded><![CDATA[<p>Niniejszym inaugurujemy część solr.pl poświęconą tym zagadnieniom, które nie są związane z konkretnym silnikiem wyszukiwania a raczej z budową i rozwojem funkcjonalności serwisów internetowych związanych z wyszukiwaniem.</p>
<p>Czy zastanawialiście się co powoduje, że wyszukiwarka w serwisie jest uważana za dobrą? By odpowiedzieć na to pytanie, należy się zastanowić, jak wygląda typowy proces znajdowania przez klienta pożądanej przez niego informacji. I czy jest coś takiego, jak typowy proces.</p>
<p><span id="more-20"></span></p>
<p>W projektach, w których udało mi się uczestniczyć dobrze sprawdzał się model mówiący o podziale na następujące fazy:</p>
<ul>
<li>wyszukiwanie</li>
<li>redefinicja zapytania</li>
<li>filtracja</li>
<li>sortowanie</li>
<li>przeglądanie wyników</li>
</ul>
<p>Nie wszystkie te fazy muszą wystąpić, ich kolejność czasem będzie inna, czasem też poszczególne fazy będą występować wielokrotnie. Również w zależności od produktu, posiadanych danych i ich ilości nie wszystkie z nich system musi udostępniać.</p>
<p><strong>1. Wyszukiwanie</strong></p>
<p><strong><img decoding="async" class="alignleft size-medium wp-image-212" style="margin: 10px" src="http://solr.pl/wp-content/uploads/2010/08/wyszukiwanie-300x124.png" alt="" width="300" height="124"></strong>Tu użytkownik może wykazać się największą inwencją wpisując w pole (albo wiele pól) frazę wyszukiwania. I jest to jednocześnie krytyczny moment, w którym często nowy użytkownik podejmuje decyzję: zostać czy znaleźć inny, lepszy serwis. Na co zwykle zwracamy uwagę:</p>
<ul>
<li>czytelność wyników i sensowność 	doboru wyświetlanych informacji – celem użytkownika jest 	znalezienie konkretnego elementu lub grupy elementów spełniających 	kryteria (często mętne i niekonkretne) wyszukiwania. Dlatego musi 	mieć możliwość wstępnego odrzucenia tych elementów, które mu 	z jakiś powodów nie pasują. Błędem jest brak podstawowych dla 	użytkownika informacji (np. serwis z ogłoszeniami sprzedaży 	mieszkań, który nie pokazuje na liście wyników metrażu ani 	lokalizacji! )</li>
<li>liczba znalezionych wyników – 	jeśli wyników jest mało, może to np. sugerować ograniczony 	asortyment w sklepie</li>
<li>przystawanie wyników do frazy 	wyszukiwania – jeśli w sklepie komputerowym na hasło: „notebook” 	na pierwsza strona zawiera tylko pokrowce na notebooki, może to 	sugerować, że firma sprzedaje tylko akcesoria</li>
<li>możliwości nawigacji i łatwość 	dokonania wyboru – jeśli wyników wyszukiwania jest dużo,  	zostawienie użytkownikowi możliwości tylko zmiany zapytania albo 	męczącego przebijania  się przez strony wyników nie jest dobrym 	pomysłem.</li>
</ul>
<p><strong>2. Redefinicja zapytania</strong></p>
<p>W zależności od uzyskanych wyników wyszukiwania, zwykle od pierwszego wrażenia jakości tych wyników, użytkownik może zdecydować się powtórzyć wyszukiwanie. Im więcej faz redefinicji, tym gorsze wrażenie klienta i większa szansa na opuszczenie sklepu. Zwłaszcza, jeśli użytkownik, w jego mniemaniu wpisał bardzo ogólną frazę, a nie dostał żadnych wyników.</p>
<p><strong>3. Filtracja</strong></p>
<p><img fetchpriority="high" decoding="async" class="alignleft size-medium wp-image-210" style="margin: 15px" src="http://solr.pl/wp-content/uploads/2010/08/filtrowanie-185x300.png" alt="" width="185" height="300">Rodzaj zwróconych wyników jest w porządku, pytanie, jak teraz użytkownik może ograniczyć ich liczbę do tych, które są szczególnie interesujące (czyli odrzucić te mniej ciekawe). W tym celu umożliwia się dalsze nawigowanie po wynikach wyszukiwania w oparciu o filtry. Tutaj zwykle zwracamy uwagę na:</p>
<ul>
<li>łatwość dodawania i usuwania 	filtru – zakładając, że użytkownik ma jedynie ogólne pojęcie 	czego szuka, należy się spodziewać, że będzie on wielokrotnie 	zmieniał kryteria wyszukiwania – niedopuszczalne są ścieżki 	nawigacji, gdzie jedyną metodą powrotu do wcześniej 	odfiltrowanych elementów jest przycisk „powrót” w 	przeglądarce, lub rozpoczęcie kolejnego wyszukiwania.</li>
<li>zależność filtrów od rodzaju 	wyszukiwania – szukając nowego komputera interesujący jest inny 	zestaw parametrów niż wybierając książkę. Chociaż brzmi to 	jak oczywistość, zbyt często można spotkać sytuacje, gdzie 	zmiana asortymentu sklepu nie pociąga za sobą zmian definicji 	filtrów, lub zestaw filtrów jest narzucony „z góry”. W 	efekcie pojawiają się opcje typu „kolor opon”.</li>
<li>podanie liczb określających 	liczbę wyników po zastosowaniu filtra – niedoceniana 	funkcjonalność, jednak pozwala na wybieranie przez użytkownika 	optymalnego sposobu filtrowania: jeśli koniecznie w notebooku muszę 	mieć wbudowaną kamerę, to filtr „Z wbudowaną kamerą (3)” od 	razu sugeruje, że wybór koloru będzie mniej ważny i nie ma sobie 	co nim zawracać głowy.</li>
</ul>
<p><strong>4. Sortowanie<br />
</strong></p>
<p><img decoding="async" class="alignleft size-full wp-image-211" style="margin: 15px" src="http://solr.pl/wp-content/uploads/2010/08/sortowanie.png" alt="" width="194" height="35">Pozwala się zająć klientowi przeglądaniem wyników w najwygodniejszej kolejności (np. od najtańszych produktów). W praktyce liczba opcji jest mocno ograniczona, np. Pomysł sortowania po cechach produktu może konfliktować z filtrowaniem.</p>
<p><strong>5. Przeglądanie Wyników</strong></p>
<p>Tutaj użytkownik już zapoznaje się z wybranymi produktami. Z punktu widzenia wyszukiwania to już dość nudny temat <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;" /> Warto jednak pamiętać o wygodnym powrocie do listy wyników: tu błędem jest np. automatyczny powrót na pierwszą stronę wyników, albo zmuszanie użytkownika do  przewijania strony w poszukiwaniu ostatnio oglądanego elementu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/08/09/proces-wyszukiwania/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
