<?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>highlighting &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/highlighting/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>Thu, 12 Nov 2020 12:51:27 +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>Autocomplete na polach wielowartościowych (highlighting)</title>
		<link>https://solr.pl/2013/02/25/autocomplete-na-polach-wielowartosciowych-highlighting/</link>
					<comments>https://solr.pl/2013/02/25/autocomplete-na-polach-wielowartosciowych-highlighting/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 25 Feb 2013 11:05:17 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[highlighting]]></category>
		<category><![CDATA[multivalued]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=493</guid>

					<description><![CDATA[Jednym z tematów na który natknąłem się ostatnio był problem funkcjonalności autocomplete na polach, które oznaczone są jako multiValued=&#8221;true&#8221; (m.in. pytanie zadano tutaj na Stack Overflow). Przyjrzyjmy się zatem jakie mamy możliwości. Wiele rdzeni kontra jeden rdzeń Jedną z możliwości,]]></description>
										<content:encoded><![CDATA[<p>Jednym z tematów na który natknąłem się ostatnio był problem funkcjonalności autocomplete na polach, które oznaczone są jako <em>multiValued=&#8221;true&#8221;</em> (m.in. pytanie zadano tutaj na <a href="http://stackoverflow.com/questions/14865417/autocomplete-feature-using-solr4-on-multivalued-fields">Stack Overflow</a>). Przyjrzyjmy się zatem jakie mamy możliwości.</p>
<p><span id="more-493"></span></p>
<h2>Wiele rdzeni kontra jeden rdzeń</h2>
<p>Jedną z możliwości, jaką powinniśmy rozważyć na początku, to kwestia tego, czy jesteśmy w stanie stworzyć rdzeń lub kolekcję odpowiedzialną tylko i wyłączenie za autocomplete. Jeżeli tak, to powinniśmy iść tą drogą. Przyczyny tego są proste &#8211; taka kolekcja będzie z reguły mniejsza, niż ta w której indeksowane są nasze dane, ilość termów także ma szansę być mniejsza, a tym samym wykonywanie zapytań powinno być szybsze. Oczywiście, idzie za tym konieczność przygotowania konfiguracji, konieczność indeksacji drugiej kolekcji. Czasami jednak istnieją sytuacje kiedy takie rozwiązanie nie jest możliwe, na przykład ze względu na dodatkowe filtrowanie i takim przypadkiem zajmę się w tym wpisie.</p>
<p>Załóżmy dodatkowo że chcemy podpowiadać pełne frazy.</p>
<h2>Konfiguracja</h2>
<p>Zacznijmy zatem od konfiguracji.</p>
<h3>Struktura indeksu</h3>
<p>Załóżmy, że chcemy podpowiadać frazy z indeksu, oczywiście z pola wielowartościowego. Niech pole to nazywa się <em>features</em>, a cała konfiguracja pól w indeksie będzie następująca:
</p>
<pre class="brush:xml">&lt;fields&gt;
 &lt;field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /&gt;
 &lt;field name="features" type="string" indexed="true" stored="true" multiValued="true"/&gt;
 &lt;field name="features_autocomplete" type="text_autocomplete" indexed="true" stored="true" multiValued="true"/&gt;

 &lt;field name="_version_" type="long" indexed="true" stored="true"/&gt;
&lt;/fields&gt;</pre>
<p>Jak widać do autocomplete będziemy wykorzystywać pole <em>features_autocomplete</em>. Pole <em>_version_</em> wymagane jest przez niektóre funkcjonalności Solr 4.0 i nowszych i dlatego jest obecne w naszym indeksie.</p>
<h3>Kopiowanie</h3>
<p>Dodatkowo, aby automatycznie zasilać danymi pole <em>features_autocomplete</em> skorzystamy z funkcjonalności copy field, a zatem do pliku <em>schema.xml</em> dodajemy następujący wpis:
</p>
<pre class="brush:xml">&lt;copyField source="features" dest="features_autocomplete"/&gt;</pre>
<h3>Typ text_autocomplete</h3>
<p>Przyjrzyjmy się teraz jak wygląda nasz typ <em>text_autocomplete</em>:
</p>
<pre class="brush:xml">&lt;fieldType name="text_autocomplete"&nbsp;class="solr.TextField" positionIncrementGap="100"&gt;
 &lt;analyzer type="index"&gt;
  &lt;tokenizer class="solr.KeywordTokenizerFactory"/&gt;
  &lt;filter class="solr.LowerCaseFilterFactory"/&gt;
  &lt;filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" /&gt;
 &lt;/analyzer&gt;
 &lt;analyzer type="query"&gt;
  &lt;tokenizer class="solr.KeywordTokenizerFactory" /&gt;
  &lt;filter class="solr.LowerCaseFilterFactory"/&gt;
 &lt;/analyzer&gt;
&lt;/fieldType&gt;</pre>
<p>Jak widać w trakcie indeksowania będziemy tworzyć kolejne rozwinięcia naszej frazy zawartej w polu <em>features_autocomplete </em>za pomocą filtra <em>solr.EdgeNGramFilterFactory</em>. Minimalna długość powstałego tokoena może mieć długość 2, a najdłuższy może mieć długość 50 znaków.</p>
<p>Na etapie zapytania sprowadzamy frazę tylko do wspólnego mianownika za pomocą <em>solr.LowerCaseFilterFactory</em> i filtrów tworzonych przez tą fabrykę.</p>
<h3>Przykładowe dane</h3>
<p>Nasze dane wyglądają następująco:
</p>
<pre class="brush:xml">&lt;add&gt;
 &lt;doc&gt;
  &lt;field name="id"&gt;1&lt;/field&gt;
  &lt;field name="features"&gt;Multiple windows&lt;/field&gt;
  &lt;field name="features"&gt;Single door&lt;/field&gt;
 &lt;/doc&gt;
 &lt;doc&gt;
  &lt;field name="id"&gt;2&lt;/field&gt;
  &lt;field name="features"&gt;Single window&lt;/field&gt;
  &lt;field name="features"&gt;Single door&lt;/field&gt;
 &lt;/doc&gt;
 &lt;doc&gt;
  &lt;field name="id"&gt;3&lt;/field&gt;
  &lt;field name="features"&gt;Multiple windows&lt;/field&gt;
  &lt;field name="features"&gt;Multiple doors&lt;/field&gt;
 &lt;/doc&gt;
&lt;/add&gt;</pre>
<h2>Podstawowe zapytania</h2>
<p>Spójrzmy zatem na zapytania.</p>
<h3>Na początek</h3>
<p>Zacznijmy od prostego zapytania, które w przypadku kiedy mielibyśmy pole przechowujące pojedyncze wartości zwróciłoby nam dane, które nas interesują. Zapytanie takie mogłoby wyglądać następująco:
</p>
<pre class="brush:xml">q=features_autocomplete:sing&amp;fl=features_autocomplete</pre>
<h3>Wyniki</h3>
<p>Wyniki, jakie otrzymujemy z takiego zapytania to:
</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;3&lt;/int&gt;
  &lt;lst name="params"&gt;
   &lt;str name="fl"&gt;features_autocomplete&lt;/str&gt;
   &lt;str name="q"&gt;features_autocomplete:sing&lt;/str&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
 &lt;result name="response" numFound="2" start="0"&gt;
 &lt;doc&gt;
  &lt;arr name="features_autocomplete"&gt;
   &lt;str&gt;Single window&lt;/str&gt;
   &lt;str&gt;Single door&lt;/str&gt;
  &lt;/arr&gt;
 &lt;/doc&gt;
 &lt;doc&gt;
  &lt;arr name="features_autocomplete"&gt;
   &lt;str&gt;Multiple windows&lt;/str&gt;
   &lt;str&gt;Single door&lt;/str&gt;
  &lt;/arr&gt;
 &lt;/doc&gt;
 &lt;/result&gt;
&lt;/response&gt;</pre>
<h3>Krótki komentarz</h3>
<p>Jak widać wyniki, jakie otrzymaliśmy nie satysfakcjonują nas, ze względu na to, że oprócz wartości, w której Solr znalazł trafienie, dostajemy także resztę danych w polu wielowartościowym. Zmodyfikujmy zatem nasze zapytanie.</p>
<h2>Zapytanie z highlightingiem</h2>
<p>Jak widać musimy zmienić nasze zapytanie, aby otrzymać to czego potrzebujemy. Wykorzystamy do tego highlighting.</p>
<h3>Zmienione zapytanie</h3>
<p>Zmieńmy zatem nasze zapytanie dodając następujący fragment:
</p>
<pre class="brush:xml">hl=true&amp;hl.fl=features_autocomplete&amp;hl.simple.pre=&amp;hl.simple.post=</pre>
<p>Zatem całe zapytanie wygląda następująco:
</p>
<pre class="brush:xml">q=features_autocomplete:sing&amp;fl=features_autocomplete&amp;hl=true&amp;hl.fl=features_autocomplete&amp;hl.simple.pre=&amp;hl.simple.post=</pre>
<p>Kilka słów o dodanych parametrach:</p>
<ul>
<li><em>hl=true</em> &#8211; informujemy Solr, iż chcemy korzystać z highlightingu,</li>
<li><em>hl.fl=features_autocomplete</em> &#8211; określamy jakie pole ma zostać wykorzystane do highlightingu,</li>
<li><em>hl.simple.pre=</em> &#8211; stwierdzamy, iż nie chcemy widzieć gdzie zaczyna się podświetlony fragment,</li>
<li><em>hl.simple.post=</em> &#8211; stwierdzamy, iż nie chcemy widzieć gdzie kończy się podświetlony fragment.</li>
</ul>
<h3>Wyniki</h3>
<p>Wyniki, które Solr zwraca na powyższe zapytanie, wyglądają następująco:
</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;4&lt;/int&gt;
  &lt;lst name="params"&gt;
   &lt;str name="fl"&gt;features_autocomplete&lt;/str&gt;
   &lt;str name="q"&gt;features_autocomplete:sing&lt;/str&gt;
   &lt;str name="hl.simple.pre"/&gt;
   &lt;str name="hl.simple.post"/&gt;
   &lt;str name="hl.fl"&gt;features_autocomplete&lt;/str&gt;
   &lt;str name="hl"&gt;true&lt;/str&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
 &lt;result name="response" numFound="2" start="0"&gt;
 &lt;doc&gt;
  &lt;arr name="features_autocomplete"&gt;
   &lt;str&gt;Single window&lt;/str&gt;
   &lt;str&gt;Single door&lt;/str&gt;
  &lt;/arr&gt;
 &lt;/doc&gt;
 &lt;doc&gt;
  &lt;arr name="features_autocomplete"&gt;
   &lt;str&gt;Multiple windows&lt;/str&gt;
   &lt;str&gt;Single door&lt;/str&gt;
  &lt;/arr&gt;
 &lt;/doc&gt;
 &lt;/result&gt;
 &lt;lst name="highlighting"&gt;
  &lt;lst name="2"&gt;
   &lt;arr name="features_autocomplete"&gt;
    &lt;str&gt;Single window&lt;/str&gt;
   &lt;/arr&gt;
  &lt;/lst&gt;
  &lt;lst name="1"&gt;
   &lt;arr name="features_autocomplete"&gt;
    &lt;str&gt;Single door&lt;/str&gt;
   &lt;/arr&gt;
  &lt;/lst&gt;
 &lt;/lst&gt;
&lt;/response&gt;</pre>
<p>Jak widać, w sekcji odpowiedzialnej za highlighting, otrzymaliśmy te frazy, które nas interesowały.</p>
<h2>Podsumowanie</h2>
<p>Należy pamiętać, iż przedstawiony sposób nie jest jedynym sposobem rozwiązania przedstawionego problemu. W kolejnym wpisie przedstawimy, jak ten sam problem można rozwiązać przy pomocy facetingu, jeżeli tylko jesteśmy w stanie zaakceptować pewne niedogodności, ale o tym w następnym wpisie dotyczącym funkcjonalności autocomplete.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2013/02/25/autocomplete-na-polach-wielowartosciowych-highlighting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solr 3.1: FastVectorHighlighting</title>
		<link>https://solr.pl/2011/06/13/solr-3-1-fastvectorhighlighting/</link>
					<comments>https://solr.pl/2011/06/13/solr-3-1-fastvectorhighlighting/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 13 Jun 2011 17:48:18 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[fast]]></category>
		<category><![CDATA[highlighting]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[podświetlanie]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[vector]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=248</guid>

					<description><![CDATA[Jedną z wielu nowych funkcjonalności jakie przyniosła wersja 3.1 biblioteki Lucene i serwera wyszukiwania Solr jest FastVectorHighlighting, czyli nic innego jak usprawnione funkcjonalności odpowiedzialne za highlighting. Ze względu na to, że obecny dotychczas w Solr highlighting nie dość, że nie]]></description>
										<content:encoded><![CDATA[<p>Jedną z wielu nowych funkcjonalności jakie przyniosła wersja 3.1 biblioteki Lucene i serwera wyszukiwania Solr jest <em>FastVectorHighlighting</em>, czyli nic innego jak usprawnione funkcjonalności odpowiedzialne za highlighting. Ze względu na to, że obecny dotychczas w Solr highlighting nie dość, że nie działał zbyt szybko, to mówiąc wprost potrafił <em>zabić </em>Solr przy dużej ilości danych, bądź bardzo długich polach tekstowych. Stwierdziłem, że warto przetestować wydajność nowej funkcjonalności.</p>
<p><span id="more-248"></span></p>
<h3>Kilka słów na początek</h3>
<p>Na początek kilka informacji o możliwościach nowego hightlightra w Lucene:</p>
<ul>
<li>wspiera pola oparte o N-gram</li>
<li>wymusza wykorzystanie Java 5 lub wyższej</li>
<li>bierze pod uwagę podbicia w celu nadawania ważności fragmentom tekstu</li>
<li>jest bardzo szybki dla dużych dokumentów</li>
</ul>
<p>Warto wspomnieć, iż obecny highlighter został oznaczony jako <em>Deprecated</em> zgodnie z ticketem <a href="https://issues.apache.org/jira/browse/SOLR-1696" target="_blank" rel="noopener noreferrer">SOLR-1696</a>.</p>
<h3>Jak został wykonany test ?</h3>
<p>Do testów wykorzystałem indeks zawierający około 1.2 miliona dokumentów (zaindeksowane dane polskiej wikipedii &#8211;  tylko najnowsze zmiany). Dla każdego z poniższych wyszukiwań wykorzystywałem duże pole testowe do podświetlenia, raz ze <em>starym (hl.useFastVectorHighlighter=false)</em>, raz z <em>nowym (hl.useFastVectorHighlighter=true)</em><em> </em>highlighterem. Testy wykonywane były na wyłączonym cache`u Solr. Przedstawiony w tabelce czas odpowiedzi, to średni czas z 10 kolejno zadanych zapytań z wyłączeniem czasu największego i najmniejszego. Poniżej wyniki tego prostego testu:</p>
[table “7” not found /]<br />

<p>Pomimo tego, iż test jest prosty pokazuje pewną prawidłowość &#8211; <em>FastVectorHighlighter </em>jest szybszy od dotychczasowego highlightera.</p>
<p>Co do samej jakości podświetleń nie udało mi się zauważyć większych różnic, aczkolwiek specyfika danych nie sprzyja takim obserwacjom.</p>
<h3>O czym należy pamiętać ?</h3>
<p>Należy pamiętać, że <em>FastVectorHighlighter </em>wymaga, aby pole na którym będzie działać, było odpowiednio zdefiniowane. Konieczne jest ustawienie atrybutów pola na następujące:<em> termVectors=”true” termPositions=”true” termOffsets=”true”</em>. W przeciwnym wypadku dalej będzie wykorzystywany stary mechanizm.</p>
<h3>Podsumowując</h3>
<p>Warto pamiętać, że test przeprowadzony przeze mnie nie jest dokładnym testem wydajności, a jedynie sprawdzeniem nowego mechanizmu w warunkach mniej lub bardziej przypominających produkcyjne. Pozwala to jednak stwierdzić, iż możemy spodziewać się zwiększonej wydajności podczas korzystania z nowej wersji highlightingu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/06/13/solr-3-1-fastvectorhighlighting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
