<?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>component &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/component/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 22:33:13 +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 i autocomplete (cz. 3)</title>
		<link>https://solr.pl/2010/11/29/solr-i-autocomplete-cz-3/</link>
					<comments>https://solr.pl/2010/11/29/solr-i-autocomplete-cz-3/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 29 Nov 2010 22:32:33 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[suggest component]]></category>
		<category><![CDATA[suggester]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=144</guid>

					<description><![CDATA[W poprzednich częściach (cz. 1, cz. 2) cyklu dowiedzieliśmy w jaki sposób można wykorzystać Solr, aby uzyskać funkcjonalność autocomplete. W dzisiejszym wpisie pokażę w jaki sposób dodać do komponentu Suggester słownik, a tym samym mieć wpływ na generowane podpowiedzi. Konfiguracja]]></description>
										<content:encoded><![CDATA[<p>W poprzednich częściach (<a href="http://solr.pl/2010/10/18/solr-i-autocomplete-cz-1/">cz. 1</a>, <a href="http://solr.pl/2010/11/15/solr-i-autocomplete-cz-2/">cz. 2</a>) cyklu dowiedzieliśmy w jaki sposób można wykorzystać Solr, aby uzyskać funkcjonalność autocomplete. W dzisiejszym wpisie pokażę w jaki sposób dodać do komponentu Suggester słownik, a tym samym mieć wpływ na generowane podpowiedzi.</p>
<p><span id="more-144"></span></p>
<p><img fetchpriority="high" decoding="async" class="size-full wp-image-483" title="Google Autocomplete" src="http://solr.pl/wp-content/uploads/2010/10/google_autocomplete2.png" alt="" width="641" height="159"></p>
<h3>Konfiguracja komponentu</h3>
<p>Do konfiguracji komponentu przedstawionej w poprzedniej części dodajmy następujący parametr:
</p>
<pre class="brush:xml">&lt;str name="sourceLocation"&gt;dict.txt&lt;/str&gt;</pre>
<p>Zatem nasza konfiguracja powinna wyglądać następująco:
</p>
<pre class="brush:xml">&lt;searchComponent name="suggest" class="solr.SpellCheckComponent"&gt;
 &lt;lst name="spellchecker"&gt;
&nbsp; &lt;str name="name"&gt;suggest&lt;/str&gt;
&nbsp; &lt;str name="classname"&gt;org.apache.solr.spelling.suggest.Suggester&lt;/str&gt;
  &lt;str name="lookupImpl"&gt;org.apache.solr.spelling.suggest.tst.TSTLookup&lt;/str&gt;
  &lt;str name="field"&gt;name_autocomplete&lt;/str&gt;
  &lt;str name="sourceLocation"&gt;dict.txt&lt;/str&gt;
 &lt;/lst&gt;
&lt;/searchComponent&gt;</pre>
<p>Poinformowaliśmy komponent, że ma korzystać ze słownika o nazwie <em>dict.txt</em>, który znajduje się w katalogu z plikami konfiguracyjnymi Solr.</p>
<h3>Konfiguracja handlera</h3>
<p>Do konfiguracji handlera także dodamy jeden parametr, będzie on następujący:
</p>
<pre class="brush:xml">&lt;str name="spellcheck.onlyMorePopular"&gt;true&lt;/str&gt;</pre>
<p>Zatem konfiguracja powinna wyglądać następująco:
</p>
<pre class="brush:xml">&lt;requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchComponent"&gt;
 &lt;lst name="defaults"&gt;
&nbsp; &lt;str name="spellcheck"&gt;true&lt;/str&gt;
&nbsp; &lt;str name="spellcheck.dictionary"&gt;suggest&lt;/str&gt;
&nbsp; &lt;str name="spellcheck.count"&gt;10&lt;/str&gt;
  &lt;str name="spellcheck.onlyMorePopular"&gt;true&lt;/str&gt;
 &lt;/lst&gt;
 &lt;arr name="components"&gt;
&nbsp; &lt;str&gt;suggest&lt;/str&gt;
 &lt;/arr&gt;
&lt;/requestHandler&gt;</pre>
<p>Parametr ten mówi, aby komponent zwrócił tylko takie podpowiedzi, dla których ilość wyników wyszukiwania będzie większa od ilości wyników wyszukiwania dla aktualnego zapytania.</p>
<h3>Słownik</h3>
<p>Wcześniej powiedzieliśmy Solr, aby korzystał ze słownika, ale jak ma wyglądać przykładowy słownik. Do celów artykułu zdefiniowałem następujący słownik:
</p>
<pre class="brush:plain"># przykladowy slownik
Dysk twardy hitachi
Dysk twardy wd    2.0
Dysk twardy jjdd    3.0
</pre>
<p>Jak wygląda konstrukcja słownika ? Każda z fraz (bądź pojedynczy wyrazów) znajduje się w oddzielnej linii. Każda linia zakończona jest wagą danej frazy (pomiędzy wagą a frazą występuje znak tabulacji) wykorzystywanej wraz z parametrem <em>spellcheck.onlyMorePopular=true</em> (im wyższa waga, tym wyżej znajdzie się podpowiedź). W przypadku pominięcia wagi Solr sam dodaje wartość domyślną wynoszącą 1. Słownik powinien być zapisany w kodowaniu UTF-8. Linie rozpoczynające się od znaku # są pomijane.</p>
<h3>Dane</h3>
<p>W tym wypadku nie potrzebujemy danych &#8211; komponent korzysta jedynie ze słownika.</p>
<h3>Sprawdźmy jak to działa</h3>
<p>W celu sprawdzenia jak działa nasz mechanizm zadajemy do Solr następujące zapytanie, oczywiście wcześniej przebudowując indeks mechanizmu:</p>
<p><code>/suggest?q=Dys</code></p>
<p>W odpowiedzi dostajemy następujące wyniki:
</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&gt;
&lt;lst name="spellcheck"&gt;
  &lt;lst name="suggestions"&gt;
    &lt;lst name="Dys"&gt;
      &lt;int name="numFound"&gt;3&lt;/int&gt;
      &lt;int name="startOffset"&gt;0&lt;/int&gt;
      &lt;int name="endOffset"&gt;3&lt;/int&gt;
      &lt;arr name="suggestion"&gt;
        &lt;str&gt;Dysk twardy jjdd&lt;/str&gt;
        &lt;str&gt;Dysk twardy hitachi&lt;/str&gt;
        &lt;str&gt;Dysk twardy wd&lt;/str&gt;
     &lt;/arr&gt;
    &lt;/lst&gt;
  &lt;/lst&gt;
&lt;/lst&gt;
&lt;/response&gt;
</pre>
<h3>Kilka słów na koniec</h3>
<p>Jak widać podpowiedzi zostały posortowane według wysokości wag, czyli zgodnie z oczekiwaniami. Warto zauważyć także, że zapytanie zostało zadane dużą literą, co również ma dość duże znaczenie &#8211; zadanie zapytania małą literą spowoduje wygenerowanie zerowej listy podpowiedzi.</p>
<p>Co można powiedzieć o metodzie &#8211; jeżeli mamy bardzo dobre słowniki z wygenerowanymi wagami np. na podstawie zachowań klientów, jest to metoda generowania podpowiedzi, która zdobędzie sympatię klientów. Nie polecam jej jednak w przypadku pierwszych kroków z podpowiedziami i nieposiadania słowników &#8211; wtedy podpowiedzi mogą, choć oczywiście nie muszą, być słabej jakości.</p>
<h3>Co dalej</h3>
<p>Ilość zajęć nie pozwoliła mi niestety na przeprowadzenie testów wydajnościowych poszczególnych metod, dlatego też w następnej części postaram się przedstawić, jak zachowują się poszczególne metody w zależności od struktury i wielkości indeksu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/11/29/solr-i-autocomplete-cz-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr i autocomplete (cz. 2)</title>
		<link>https://solr.pl/2010/11/15/solr-i-autocomplete-cz-2/</link>
					<comments>https://solr.pl/2010/11/15/solr-i-autocomplete-cz-2/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 15 Nov 2010 22:29:47 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[phrase]]></category>
		<category><![CDATA[phrases]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[suggest]]></category>
		<category><![CDATA[suggest component]]></category>
		<category><![CDATA[suggester]]></category>
		<category><![CDATA[token]]></category>
		<category><![CDATA[tokens]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=140</guid>

					<description><![CDATA[W poprzedniej części pokazałem w jaki sposób można wykorzystać mechanizm facetingu, aby zrealizować funkcjonalność autocomplete. Dzisiaj postaram pokazać jak wykorzystać komponent nazwany Suggest i za jego pomocą zrealizować funkcjonalność podpowiedzi. Na początek Jedna rzecz, którą należy powiedzieć &#8211; Suggest component]]></description>
										<content:encoded><![CDATA[<p>W <a href="http://solr.pl/2010/10/18/solr-i-autocomplete-cz-1/" target="_self" rel="noopener noreferrer">poprzedniej</a> części pokazałem w jaki sposób można wykorzystać mechanizm facetingu, aby zrealizować funkcjonalność autocomplete. Dzisiaj postaram pokazać jak wykorzystać komponent nazwany Suggest i za jego pomocą zrealizować funkcjonalność podpowiedzi.</p>
<p><span id="more-140"></span></p>
<p><img decoding="async" class="size-full wp-image-483" title="Google Autocomplete" src="http://solr.pl/wp-content/uploads/2010/10/google_autocomplete2.png" alt="" width="641" height="159"></p>
<h3>Na początek</h3>
<p>Jedna rzecz, którą należy powiedzieć &#8211; Suggest component nie jest dostępny w Solr w wersji 1.4.1 i niższych. Aby móc zacząć wykorzystywać ten komponent konieczne jest pobranie mininum wersji 3_x z repozytorium SVN.</p>
<h3>Konfiguracja</h3>
<p>Zanim przejdziemy do konfiguracji indeksu musimy zdefiniować komponent. A więc zaczynamy od zdefiniowania nowego komponentu wyszukiwania:
</p>
<pre class="brush:xml">&lt;searchComponent name="suggest" class="solr.SpellCheckComponent"&gt;
 &lt;lst name="spellchecker"&gt;
&nbsp; &lt;str name="name"&gt;suggest&lt;/str&gt;
&nbsp; &lt;str name="classname"&gt;org.apache.solr.spelling.suggest.Suggester&lt;/str&gt;
  &lt;str name="lookupImpl"&gt;org.apache.solr.spelling.suggest.tst.TSTLookup&lt;/str&gt;
  &lt;str name="field"&gt;name_autocomplete&lt;/str&gt;
 &lt;/lst&gt;
&lt;/searchComponent&gt;</pre>
<p>Warto wspomnieć, iż komponent Suggester oparty jest na solr.SpellCheckComponent dlatego konfiguracja wygląda tak jak powyżej. Mamy tutaj trzy ważne informacje:</p>
<ul>
<li><em>name </em>&#8211; nazwa komponentu.</li>
<li><em>lookupImpl </em>&#8211; obiekt, który będzie obsługiwał wyszukiwanie. W tym momencie mamy dwie możliwości korzystanie z klasy TSTLookup lub JasperLookup. Ta pierwsza charakteryzuje się jednak większą wydajnością.</li>
<li><em>field </em>&#8211; pole na podstawie, którego będą generowane podpowiedzi.</li>
</ul>
<p>Dodajmy teraz odpowiedni handler, który będzie miał zapisaną odpowiednią konfigurację:
</p>
<pre class="brush:xml">&lt;requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler"&gt;
 &lt;lst name="defaults"&gt;
&nbsp; &lt;str name="spellcheck"&gt;true&lt;/str&gt;
&nbsp; &lt;str name="spellcheck.dictionary"&gt;suggest&lt;/str&gt;
&nbsp; &lt;str name="spellcheck.count"&gt;10&lt;/str&gt;
 &lt;/lst&gt;
 &lt;arr name="components"&gt;
&nbsp; &lt;str&gt;suggest&lt;/str&gt;
 &lt;/arr&gt;
&lt;/requestHandler&gt;</pre>
<p>Dość prosta konfiguracja, która dla handlera definiuje dodatkowy komponent oraz mówi Solr, że maksymalna ilość pokazywanych podpowiedzi wynosi 10, ma być wykorzystywany spellchecker (a dokładniej Suggester) oraz, że słownik na podstawie, którego ma być realizowane podpowiadanie nazywa się suggest, czyli dokładnie tak samo jak nasz zdefiniowany komponent.</p>
<h3>Indeks</h3>
<p>Załóżmy, że nasz dokument składa się z 3 pól: identyfikatora, nazwy i opisu. Podpowiadanie realizujemy na podstawie pola przechowującego nazwę. Nasz indeks mógłby wyglądać nastęująco:
</p>
<pre class="brush:xml">&lt;field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/&gt;
&lt;field name="name" type="text" indexed="true" stored="true" multiValued="false" /&gt;
&lt;field name="name_autocomplete" type="text_auto" indexed="true" stored="true" multiValued="false" /&gt;
&lt;field name="description" type="text" indexed="true" stored="true" multiValued="false" /&gt;</pre>
<p>Dodatkowo dochodzi następująca definicja kopiowania pola:
</p>
<pre class="brush:xml">&lt;copyField source="name" dest="name_autocomplete" /&gt;</pre>
<h3>Podpowiadanie pojedynczych słów</h3>
<p>Aby zrealizować podpowiadanie pojedynczych słów nasz typ text_autocomplete powinien zostać zdefiniowany w następujący sposób:
</p>
<pre class="brush:xml">&lt;fieldType class="solr.TextField" name="text_auto" positionIncrementGap="100"&gt;
 &lt;analyzer&gt;
  &lt;tokenizer class="solr.WhitespaceTokenizerFactory"/&gt;
  &lt;filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/&gt;
  &lt;filter class="solr.LowerCaseFilterFactory"/&gt;
 &lt;/analyzer&gt;
&lt;/fieldType&gt;</pre>
<h3>Podpowiadanie fraz</h3>
<p>Aby zrealizować podpowiadanie całych fraz nasz typ text_autocomplete powinien zostać zdefiniowany w następujący sposób:
</p>
<pre class="brush:xml">&lt;fieldType class="solr.TextField" name="text_auto"&gt;
 &lt;analyzer&gt;
  &lt;tokenizer class="solr.KeywordTokenizerFactory"/&gt;
  &lt;filter class="solr.LowerCaseFilterFactory"/&gt;
 &lt;/analyzer&gt;
&lt;/fieldType&gt;</pre>
<p>Jeżeli chcemy podpowiadać całe frazy warto zastanowić się nad własną klasą odpowiedzialną za konwersję zapytań.</p>
<h3>Budowanie słownika</h3>
<p>Przed skorzystaniem z komponentu należy wybudować jego indeks. W tym celu wysyłamy następującą komendę:
</p>
<pre class="brush:bash">/suggest?spellcheck.build=true</pre>
<h3>Zapytania</h3>
<p>Teraz dochodzimy do wykorzystania komponentu. W celu pokazania jak wygląda wykorzystanie komponentu, zdecydowałem się na drugi wariant, czyli pełne frazy. Zadając zapytanie:
</p>
<pre class="brush:bash">/suggest?q=dys</pre>
<p>dostajemy następujące podpowiedzi:
</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&gt;
 &lt;lst name="spellcheck"&gt;
  &lt;lst name="suggestions"&gt;
   &lt;lst name="dys"&gt;
    &lt;int name="numFound"&gt;4&lt;/int&gt;
    &lt;int name="startOffset"&gt;0&lt;/int&gt;
    &lt;int name="endOffset"&gt;3&lt;/int&gt;
    &lt;arr name="suggestion"&gt;
     &lt;str&gt;dysk twardy&lt;/str&gt;
     &lt;str&gt;dysk twardy samsung&lt;/str&gt;
     &lt;str&gt;dysk twardy seagate&lt;/str&gt;
     &lt;str&gt;dysk twardy toshiba&lt;/str&gt;
    &lt;/arr&gt;
   &lt;/lst&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
&lt;/response&gt;</pre>
<h3>Na koniec</h3>
<p>W kolejnej części dotyczącej funkcjonalności autocomplete zmodyfikujemy trochę wykorzystanie Suggestera i zobaczymy w jaki sposób dodać do mechanizmu słownik, aby jeszcze ulepszyć mechanizm podpowiedzi. Na ostatnią część zostawię sobie porównanie wydajności każdej z metod i sprawdzenia która z metod jest najszybsza w różnych sytuacjach.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/11/15/solr-i-autocomplete-cz-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
