<?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>5.1 &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/5-1/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>Fri, 13 Nov 2020 21:20:33 +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 5.1: Nowe API facetingu (szybkie spojrzenie)</title>
		<link>https://solr.pl/2015/05/30/solr-5-1-nowe-api-facetingu-szybkie-spojrzenie/</link>
					<comments>https://solr.pl/2015/05/30/solr-5-1-nowe-api-facetingu-szybkie-spojrzenie/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Sat, 30 May 2015 20:20:03 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[faceting]]></category>
		<category><![CDATA[solr]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=660</guid>

					<description><![CDATA[Wraz z niedawną premierą Solr 5.1 doczekaliśmy się szeregu nowości. Jedną z nich jest przepisany moduł facetingu umożliwiający konstruowanie zapytań w oparciu o format JSON. W niniejszym wpisie postaram się pokrótce przyjrzeć tej funkcjonlaności i zobaczyć, jak Solr zmienia się]]></description>
										<content:encoded><![CDATA[<p>Wraz z niedawną <a title="Lucene i Solr 5.1" href="http://solr.pl/2015/04/14/lucene-i-solr-5-1/">premierą Solr 5.1</a> doczekaliśmy się szeregu nowości. Jedną z nich jest przepisany moduł facetingu umożliwiający konstruowanie zapytań w oparciu o format JSON. W niniejszym wpisie postaram się pokrótce przyjrzeć tej funkcjonlaności i zobaczyć, jak Solr zmienia się jako narzędzie do analizy danych w czasie rzeczywistym.</p>
<p><span id="more-660"></span></p>
<h3>Dane testowe</h3>
<p>Do naszych testów wykorzystamy dane dostarczane wraz z domyślną dystrybucją Solr. Do uruchomienia Solr wykorzystujemy komendę:</p>
<pre class="brush:xml">bin/solr start -e techproducts
</pre>
<p>Spowoduje to uruchomienie Solr oraz zaindeksowanie przykładowych danych &#8211; wszystko to w kolekcji <em>techproducts</em>.</p>
<h3>Przykład pierwszy</h3>
<p>Zacznijmy od bardzo prostego przykładu z wykorzystaniem nowego facetingu &#8211; spróbujmy pobrać od Solr faceting dotyczący producentów oraz kategorii naszych produktów. Zapytanie, do którego jesteśmy przezwyczajeni wyglądało by następująco:</p>
<pre class="brush:xml">curl 'localhost:8983/solr/techproducts/select?q=*:*&amp;rows=0&amp;indent=true&amp;facet=true&amp;facet.field=manu_id_s&amp;facet.field=cat'
</pre>
<p>Zapytanie wykorzystujące nowe API wygląda następująco:</p>
<pre class="brush:xml">curl http://localhost:8983/solr/techproducts/query -d 'q=*:*&amp;rows=0&amp;
 json.facet={
  categories : {
   terms : {
    field: cat
   }
  },
  producers : {
   terms : {
    field: manu_id_s
   }
  }
 }'
</pre>
<p>Odpowiedź na powyższe zapytanie wygląda następująco:</p>
<pre class="brush:xml">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":2,
&nbsp;&nbsp;&nbsp; "params":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "q":"*:*",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "json.facet":"{\n&nbsp; categories : {\n&nbsp;&nbsp; terms : {\n&nbsp;&nbsp;&nbsp; field: cat\n&nbsp;&nbsp; } \n&nbsp; },\n&nbsp; manu : {\n&nbsp;&nbsp; terms : {\n&nbsp;&nbsp;&nbsp; field: manu_id_s\n&nbsp;&nbsp; }\n&nbsp; }\n}",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "rows":"0"}},
&nbsp; "response":{"numFound":32,"start":0,"docs":[]
&nbsp; },
&nbsp; "facets":{
&nbsp;&nbsp;&nbsp; "count":32,
&nbsp;&nbsp;&nbsp; "categories":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "buckets":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"electronics",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":12},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"currency",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":4},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"memory",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":3},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"connector",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"graphics card",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"hard drive",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"search",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"software",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"camera",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"copier",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1}]},
&nbsp;&nbsp;&nbsp; "manu":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "buckets":[{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"corsair",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":3},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"belkin",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"canon",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":2},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"apple",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"asus",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"ati",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"boa",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"dell",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"eu",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "val":"maxtor",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "count":1}]}}}
</pre>
<p>Jak widać samo zapytanie, jak i odpowiedź jest czymś do czego nie jesteśmy przezwyczajeni w pracy z Solr. Zacznijmy więc od zapytania.</p>
<h4>Zapytanie</h4>
<p>Tym razem zapytanie wysłaliśmy do handlera <em>query</em>, ale nie to jest ważne. Najważniejsze jest to, jak wygląda samo zapytanie. Wszystkie parametry zapytania nie zostały przekazane jako parametry rządania HTTP. Tym razem wszystkie parametry zostały przekazane w ciele rządania w formie podobnej do tego do czego jesteśmy przezwyczajeni. Oprócz tego dodaliśmy nowy parametr &#8211; <em>facet.json</em>, gdzie zdefiniowaliśmy nasz faceting.</p>
<p>W Solr 5.1, każdy faceting, jaki chcemy wykonać definiujemy następująco:</p>
<pre class="brush:xml">NAZWA: {
 TYP: {
  PARAMETR: WARTOSC
  ...
  PARAMETR: WARTOSC
 }
}
</pre>
<p>W Solr 5.2, ten format zmieni się delikatnie, ale wrócimy do tego, jak tylko pojawi się Solr 5.2. W naszym przykładzie wykorzystaliśmy typ <em>terms</em>, który funkcjonuje tak samo, jak zachowanie znane nam, gdy korzystaliśmy z <em>facet.field</em>. Inne typy to np. <em>query</em>, czy <em>range</em>. Po możliwe do wykorzystania parametry odsyłamy do oficjalnej dokumentacji Solr.</p>
<h4>Wyniki</h4>
<p>Jeżeli natomiast spojrzymy na wyniki zwrócone przez Solr widzimy coś co nazywa się <em>buckets</em>. Są to grupy klucz &#8211; wartość opisujące nasz faceting &#8211; niby coś nowego, ale jednak znajome. Korzystając z nowego API facetingu możemy spotkać się z dwoma rodzajami zwracanych wyników &#8211; pojedyńczą wartością oraz właśnie bucketami. Opiszemy to dokładniej w chwili premiery Solr 5.2.</p>
<h3>Facting i funkcje</h3>
<p>Sprawdźmy jeszcze jeden przypadek &#8211; znalezienie średniej ceny produktów oraz 99 percentyla ceny. Solr umożliwia skorzytanie z szeregu funkcji w ramach nowego modułu facetingu, a zapytanie które umożliwi nam realizację naszego celu wygląda następująco:</p>
<pre class="brush:xml">curl http://localhost:8983/solr/techproducts/query -d 'q=*:*&amp;rows=0&amp;
 json.facet={
  average:"avg(price)",
  percentile:"percentile(price,99)"
 }'
</pre>
<p>Wynik zapytania wygląda następująco:</p>
<pre class="brush:xml">{
&nbsp; "responseHeader":{
&nbsp;&nbsp;&nbsp; "status":0,
&nbsp;&nbsp;&nbsp; "QTime":2,
&nbsp;&nbsp;&nbsp; "params":{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "q":"*:*",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "json.facet":"{\n&nbsp; average:\"avg(price)\",\n&nbsp; percentile:\"percentile(price,99)\"\n }",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "rows":"0"}},
&nbsp; "response":{"numFound":32,"start":0,"docs":[]
&nbsp; },
&nbsp; "facets":{
&nbsp;&nbsp;&nbsp; "count":32,
&nbsp;&nbsp;&nbsp; "average":164.10218846797943,
&nbsp;&nbsp;&nbsp; "percentile":1966.6484985351556}}
</pre>
<p>Solr zwrócił to co chcieliśmy, a Solr zwrócił pojedyncze wartości dla każdej z funkcji.</p>
<h3>Co dalej?</h3>
<p>Oczywiście to nie wszystko co Solr oferuje nam w tym momencie oraz co planowane jest w przyszłości. Po pierwsze ilość funkcji zostanie rozszerzona &#8211; np. o możliwość pobierania unikalnych wartości. Dodatkowo, w Solr 5.2, dostaniemy możliwość zagnieżdżania facetingu i genrowania wyników zapytań zwracających np. minimalne wartości, dla każdej z grup kategorii zwróconej przez <em>terms</em> faceting.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2015/05/30/solr-5-1-nowe-api-facetingu-szybkie-spojrzenie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
