<?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>rank query parser &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/rank-query-parser/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>
	</channel>
</rss>
