<?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>function &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/function/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 12:24: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>RankField i Rank Query Parser</title>
		<link>https://solr.pl/2020/09/28/rankfield-i-rank-query-parser/</link>
					<comments>https://solr.pl/2020/09/28/rankfield-i-rank-query-parser/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 28 Sep 2020 11:23:38 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[rank]]></category>
		<category><![CDATA[rank query parser]]></category>
		<category><![CDATA[rankfield]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=828</guid>

					<description><![CDATA[Jedną z funkcjonalności o których nie mieliśmy jeszcze okazji pisać, jest nowy typ pól nazwany RankField oraz o nowym parserze &#8211; Rank Query Parser. Korzystając z obu wspomnianych nowości mamy możliwość wpływania na score dokumentów za pomocą funkcji operujących na]]></description>
										<content:encoded><![CDATA[
<p>Jedną z funkcjonalności o których nie mieliśmy jeszcze okazji pisać, jest nowy typ pól nazwany <strong>RankField</strong> oraz o nowym parserze &#8211; <strong>Rank Query Parser</strong>. Korzystając z obu wspomnianych nowości mamy możliwość wpływania na <em>score</em> dokumentów za pomocą funkcji operujących na wartościach pól. Spójrzmy zatem co wspomniana para ma do zaoferowania. </p>



<span id="more-828"></span>



<h2 class="wp-block-heading">Funkcjonalność Rank Query Parser</h2>



<p>Funkcjonalność <strong>Rank Query Parser</strong> jest dość prosta. Pozwala on na modyfikowanie <em>score</em> dokumentu na podstawie jednej z dostępnych funkcji operującej na wartości zawartej w polu tego dokumentu. Można zatem powiedzieć, iż dostarcza wycinka funkcjonalności dostępnej za pomocą <strong>Function Query Parser</strong>. Nowością jest jednak możliwość wykorzystania algorytmu BlockMax-WAND, aby zwiększyć wydajność naszego zapytania.  </p>



<h2 class="wp-block-heading">Pola typu RankField</h2>



<p>Korzystanie z nowego typu pół, czyli z&nbsp;<strong>RankField</strong>&nbsp;jest bardzo proste. Wszystko co potrzebujemy zrobić do zdefiniowanie odpowiedniego typu pola, pola i rozpoczęcie indeksowania danych. Załóżmy, iż nasze dokumentu posiadają następującą strukturę:</p>



<pre class="wp-block-code"><code class="">{
  "id" : 1,
  "name": "RankField and RankQueryParser",
  "type": "post",
  "views": 1000 
}</code></pre>



<p>Mamy zatem identyfikator dokumentu, nazwę dokumentu, jego typ oraz liczbę wyświetleń. Interesują nas wartości z tego ostatniego. Załóżmy, iż chcielibyśmy, aby wartości z tego pola były brane pod uwagę podczas obliczania <em>score</em> dokumentu &#8211; im więcej wyświetleń, tym wyżej dokument powinien być w wynikach wyszukiwania. W przypadku naszych dokumentów struktura danych opisana w pliku <strong>schema.xml</strong> wygląda następująco:</p>



<pre class="wp-block-code"><code class="">&lt;field name="id" type="string" />
&lt;field name="name" type="text_ws" />
&lt;field name="type" type="string" />
&lt;field name="views" type="rank" /></code></pre>



<p>Oczywiście, musimy także zdefiniować nasz nowy typ <strong>rank</strong>, którego definicja mogłaby wyglądać następująco:</p>



<pre class="wp-block-code"><code class="">&lt;fieldType name="rank" class="solr.RankField" /></code></pre>



<p>I to jest wszystko czego potrzebujemy, czas na zapytania.</p>



<h2 class="wp-block-heading">Korzystanie z Rank Query Parser</h2>



<p>Aby skorzystać z <strong>Rank Query Parser</strong> i wykorzystać informacje z pola <strong>views</strong> w celu wpływania na <em>score</em> możemy wykorzystać zapytanie podobne do następującego:</p>



<pre class="wp-block-code"><code class="">q=_query_:{!rank f='views' function='log'}</code></pre>



<p>Przed zadaniem zapytania zaindeksowaliśmy następujące dokumenty:</p>



<pre class="wp-block-code"><code class="">[
  {
    "id" : 1,
    "name": "RankField and RankQueryParser",
    "type": "post",
    "views": 1000 
  },
  {
    "id" : 2,
    "name": "Lucene and Solr 8.6.1 were released",
    "type": "announcement",
    "views": 10
  }
]</code></pre>



<p>A wyniki zapytania wygląda następująco:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":3,
    "params":{
      "q":"_query_:{!rank f='views' function='log'}",
      "fl":"score,*"}},
  "response":{"numFound":2,"start":0,"maxScore":6.908755,"numFoundExact":true,"docs":[
      {
        "id":"1",
        "name":"RankField and RankQueryParser",
        "type":"post",
        "_version_":1678886835690930176,
        "score":6.908755},
      {
        "id":"2",
        "name": "Lucene and Solr 8.6.1 were released",
        "type":"announcement",
        "_version_":1678886835758039040,
        "score":2.3978953}]
  }}</code></pre>



<p>Można zauważyć, iż pomimo tego, że zadaliśmy zapytanie <strong>match all</strong>, które nadaje każdemu z dokumentów <em>score</em> o wartości <strong>1.0</strong> wszystkim pasującym dokumentom nasz <em>score</em> jest inny. Solr wziął pod uwagę wartość zwróconą przez funkcję <strong>log</strong> dla każdego z dokumentów.</p>



<h2 class="wp-block-heading">Wydajność</h2>



<p>Oczywiście, to samo co powyżej moglibyśmy osiągnąć stosując <strong>Function Query Parser</strong>. Kluczem jest natomiast to, iż <strong>Rank Query Parser</strong> wspiera algorytm BlockMax-WAND. W przypadku kiedy do naszego zapytania dodamy parametr <strong>minExactCount</strong> ustawiony na liczbę dokumentów, które muszą pasować do zapytania Solr jest w stanie pominąć te dokumenty, które nie trafią do top N. Oczywiście zrobi to tylko wtedy, kiedy warunek określony przez <strong>minExactCount</strong> zostanie osiągnięty. </p>



<p>Wynik zapytania z parametrem&nbsp;<strong>minExactCount</strong> wygląda następująco:</p>



<pre class="wp-block-code"><code class="">{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":1,
    "params":{
      "q":"_query_:{!rank f='views' function='log'}",
      "fl":"score,*",
      "minExactCount":"1"}},
  "response":{"numFound":2,"start":0,"maxScore":6.908755,"numFoundExact":true,"docs":[
      {
        "id":"1",
        "name":"RankField and RankQueryParser",
        "type":"post",
        "_version_":1678886835690930176,
        "score":6.908755},
      {
        "id":"2",
        "name":"Lucene and Solr 8.6.1 were released",
        "type":"announcement",
        "_version_":1678886835758039040,
        "score":2.3978953}]
  }}</code></pre>



<p>O samym algorytmie BlockMax-WAND i jego wykorzystaniu w Solr porozmawiamy sobie w następnych wpisach. Jest trochę plusów i minusów o których fajnie porozmawiać.</p>



<h2 class="wp-block-heading">Dostępne funkcje</h2>



<p>W momencie powstawania tego wpisu dostępne były następujące funkcje, z których mogliśmy skorzystać wykorzystując <strong>Rank Query Parser</strong>:</p>



<ul class="wp-block-list"><li><strong>log</strong>&nbsp;&#8211; funkcja logarytmiczna, wykorzystuje atrybuty &nbsp;<strong>weight</strong>&nbsp;oraz&nbsp;<strong>scalingFactor</strong></li><li><strong>satu</strong>&nbsp;&#8211; funkcja akceptujące atrybuty&nbsp;<strong>pivot</strong>&nbsp;oraz&nbsp;<strong>weight</strong></li><li><strong>sigm</strong>&nbsp;&#8211; funkcja akceptująca atrybuty&nbsp;<strong>pivot</strong>,&nbsp;<strong>weight</strong>, oraz&nbsp;<strong>exponent</strong>&nbsp;</li></ul>



<p>W ramach naszego zapytania możemy skorzystać z jednej z wyżej wymienionych funkcji i wykorzystać ją do  modyfikacji <em>score</em> naszych dokumentów.</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Pomimo tego, iż wcześniej podobną funkcjonalność mogliśmy już w Solr uzyskać, to jednak wsparcie dla algorytmu BlockMax-WAND jest dosyć dużym plusem. W sytuacjach kiedy mamy możliwość zadawania zapytań i nie potrzebujemy dokładnej informacji na temat liczby zwróconych wyników wyszukiwania to <strong>Rank Query Parser</strong> wydaje się być funkcjonalnością, na którą warto spojrzeć.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2020/09/28/rankfield-i-rank-query-parser/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sortowanie po wartościach funkcji w Solr (SOLR-1297)</title>
		<link>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/</link>
					<comments>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 28 Feb 2011 08:12:05 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[1.5]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[function sorting]]></category>
		<category><![CDATA[funkcje]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[SOLR-1297]]></category>
		<category><![CDATA[sorting]]></category>
		<category><![CDATA[sortowanie po funkcjach]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=203</guid>

					<description><![CDATA[Solr w wersji 3.1 i późniejszych otrzymał jakiś czas temu bardzo ciekawą funkcjonalność &#8211; sortowanie na podstawie wartości pomocą funkcji. Co nam to daje ? W zasadzie kilka ciekawych możliwości, o których poniżej. Na początek Pierwszy z przykładów, których przychodzi]]></description>
										<content:encoded><![CDATA[<p>Solr w wersji 3.1 i późniejszych otrzymał jakiś czas temu bardzo ciekawą funkcjonalność &#8211; sortowanie na podstawie wartości pomocą funkcji. Co nam to daje ? W zasadzie kilka ciekawych możliwości, o których poniżej.</p>
<p><span id="more-203"></span></p>
<h3>Na początek</h3>
<p>Pierwszy z przykładów, których przychodzi mi do głowy, być może ze względu na projekt nad którym  pracowałem jakiś czas temu, to sortowanie po odległości pomiędzy dwoma punktami. Do tej pory, aby zaimplementować taką funkcjonalność konieczne była zmiany w Solr (np. wdrożenie <em>LocalLucene </em>i <em>LocalSolr</em>). Korzystając z Solr 3.1 i późniejszych, możemy sortować wyniki wyszukiwania za pomocą wartości zwracanych przez zdefiniowane funkcje. Na przykład,w Solr mamy dostępną funkcję <em>dist</em> wyliczającą odległość pomiędzy dwoma punktami. Jeden z wariantów funkcji to funkcja przyjmująca pięć parametrów: algorytm i dwie pary punktów. Jeżeli, przy pomocy tej funkcji, chcielibyśmy posortować wyniki wyszukiwania rosnąco od punktu o długości i szerokości geograficznej 0,0, to wysyłając parametr <em>sort</em> w następującej postaci otrzymalibyśmy właśnie tak posortowane wyniki:
</p>
<pre class="brush:xml">...sort=dist(2, geo_x, geo_y, 0, 0) asc</pre>
<p>Podejrzewam, że najczęściej wykorzystywanymi wartościami pierwszego parametru będą:</p>
<ul>
<li><em>1</em> &#8211; kalkulacja odległości na podstawie metryki Manhattan</li>
<li><em>2</em> &#8211; kalkulacja odległości euklidesowej</li>
</ul>
<h3>Kilka słów o wydajności</h3>
<p>Wszystko pięknie, tylko jak to wygląda pod kątem wydajności ? Przeprowadziłem dwa proste testy.</p>
<p>Podczas pierwszego testu zaindeksowałem 200 tysięcy dokumentów składających się z czterech pól: identyfikatora (pole liczbowe), opis (pole typu <em>text</em>) oraz x i y (dwa pola liczbowe). Żeby nie zaciemniać wyników testu do sortowania wykorzystałem jedną z prostszych funkcji dostępnych obecnie w Solr &#8211; <em>sum</em> &#8211; sumującą dwa argumenty. Tak zdefiniowane sortowanie porównałem z sortowaniem domyślnym, czyli po wartości <em>score</em>. Poniżej tabela z wynikami:</p>
<p>[table “11” not found /]<br />
</p>
<p>Kolejny test polegał na porównaniu sortowania po polu typu <em>string</em> do sortowania z wykorzystaniem funkcji. Przebieg testu był prawie identyczny, jak przebieg pierwszego testu &#8211; indeksacja 200.000 dokumentów (z dodatkowym polem: opis_sort<em> </em>typu <em>string</em>) oraz wykorzystanie funkcji <em>sum</em>. Poniżej tabela z wynikami:</p>
<p>[table “12” not found /]<br />
</p>
<p>Na podstawie powyższego testu widać, iż sortowanie z wykorzystaniem funkcji jest zdecydowanie wolniejsze od domyślnego sortowania (czego można było się spodziewać). Sortowanie to jest także wolniejsze od sortowania po polu typu <em>string</em>, jednak tutaj różnica nie jest już tak znaczna, jak w poprzednim przypadku.</p>
<h3>Kilka słów na koniec</h3>
<p>Oczywiście powyższy test tylko prześlizguje się po temacie wydajności sortowania z wykorzystaniem funkcji w Solr, jednak pokazuje prostą zależność. Biorąc pod uwagę to, iż nie jest to sortowanie domyśle, a dające nam naprawdę duże możliwości konfiguracyjne wydaje mi się, że jest to funkcjonalność warta zapamiętania. Na pewno będzie sprawdzać się wtedy, kiedy wymagania mówią, iż musimy sortować po wartościach zmieniających się zarówno w zależności od zapytania, jak i od stanu indeksu &#8211; tak jak w przypadku sortowania po dystansie od podanego przez użytkownika punktu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2011/02/28/sortowanie-po-wartosciach-funkcji-w-solr-solr-1297/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
