<?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>Search Nuggets &#187; relevance</title>
	<atom:link href="http://blog.comperiosearch.com/blog/tag/relevance/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.comperiosearch.com</link>
	<description>A blog about Search as THE solution</description>
	<lastBuildDate>Mon, 13 Jun 2016 08:59:45 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>How Elasticsearch calculates significant terms</title>
		<link>http://blog.comperiosearch.com/blog/2015/06/10/how-elasticsearch-calculates-significant-terms/</link>
		<comments>http://blog.comperiosearch.com/blog/2015/06/10/how-elasticsearch-calculates-significant-terms/#comments</comments>
		<pubDate>Wed, 10 Jun 2015 11:02:28 +0000</pubDate>
		<dc:creator><![CDATA[André Lynum]]></dc:creator>
				<category><![CDATA[Elasticsearch]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[aggregations]]></category>
		<category><![CDATA[lexical analysis]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[significant terms]]></category>
		<category><![CDATA[word analysis]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=3785</guid>
		<description><![CDATA[Many of you who use Elasticsearch may have used the significant terms aggregation and been intrigued by this example of fast and simple word analysis. The details and mechanism behind this aggregation tends to be kept rather vague however and couched in terms like &#8220;magic&#8221; and the commonly uncommon. This is unfortunate since developing informative [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_3823" style="width: 310px" class="wp-caption aligncenter"><a href="http://blog.comperiosearch.com/wp-content/uploads/2015/06/uncommonlycommon.png"><img src="http://blog.comperiosearch.com/wp-content/uploads/2015/06/uncommonlycommon-300x187.png" alt="The &quot;unvommonly common&quot;" width="300" height="187" class="size-medium wp-image-3823" /></a><p class="wp-caption-text">The magic of the &#8220;uncommonly common&#8221;.</p></div>
<p>Many of you who use Elasticsearch may have used the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html" title="significant terms">significant terms aggregation</a> and been intrigued by this example of fast and simple word analysis. The details and mechanism behind this aggregation tends to be kept rather vague however and couched in terms like &#8220;magic&#8221; and the commonly uncommon. This is unfortunate since developing informative analyses based on this aggregation requires some adaptation to the underlying documents especially in the face of less structured text. Significant terms seems especially susceptible to garbage in &#8211; garbage out effects and developing a robust analysis requires some understanding of the underlying data. In this blog post we will take a look at the default relevance score used by the significance terms aggregation, the mysteriously named JLH score, as it is implemented in Elasticsearch 1.5. This score is especially developed for this aggregation and experience shows that it tends to be the most effective one available in Elasticsearch at this point.</p>
<p>The JLH relevance scoring function is not given in the documentation. A quick dive into the code however and we find the following scoring function.</p>
<img src='http://s0.wp.com/latex.php?latex=++JLH+%3D+%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D++%28p_%7Bfore%7D+-+p_%7Bback%7D%29%5Cfrac%7Bp_%7Bfore%7D%7D%7Bp_%7Bback%7D%7D+%26+p_%7Bfore%7D+-+p_%7Bback%7D+%3E+0+%5C%5C++0++%26+elsewhere++%5Cend%7Bmatrix%7D%5Cright.++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  JLH = \left\{\begin{matrix}  (p_{fore} - p_{back})\frac{p_{fore}}{p_{back}} &amp; p_{fore} - p_{back} &gt; 0 \\  0  &amp; elsewhere  \end{matrix}\right.  ' title='  JLH = \left\{\begin{matrix}  (p_{fore} - p_{back})\frac{p_{fore}}{p_{back}} &amp; p_{fore} - p_{back} &gt; 0 \\  0  &amp; elsewhere  \end{matrix}\right.  ' class='latex' />
<p>Here the <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> is the frequency of the term in the foreground (or query) document set, while <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> is the term frequency in the background document set which by default is the whole index.</p>
<p>Expanding the formula gives us the following which is quadratic in <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' />.</p>
<img src='http://s0.wp.com/latex.php?latex=++%28p_%7Bfore%7D+-+p_%7Bback%7D%29%5Cfrac%7Bp_%7Bfore%7D%7D%7Bp_%7Bback%7D%7D+%3D+%5Cfrac%7Bp_%7Bfore%7D%5E2%7D%7Bp_%7Bback%7D%7D+-+p_%7Bfore%7D++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  (p_{fore} - p_{back})\frac{p_{fore}}{p_{back}} = \frac{p_{fore}^2}{p_{back}} - p_{fore}  ' title='  (p_{fore} - p_{back})\frac{p_{fore}}{p_{back}} = \frac{p_{fore}^2}{p_{back}} - p_{fore}  ' class='latex' />
<p>By keeping <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> fixed and keeping in mind that both it and <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> is positive we get the following function plot. Note that <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> is unnaturally large for illustration purposes.</p>
<p><a href="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-pb-fixed.png"><img src="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-pb-fixed-300x206.png" alt="JLH-pb-fixed" width="300" height="206" class="alignnone size-medium wp-image-3792"></a></p>
<p>On the face of it this looks bad for a scoring function. It can be undesirable that it changes sign, but more troublesome is the fact that this function is not monotonically increasing.</p>
<p>The gradient of the function:</p>
<img src='http://s0.wp.com/latex.php?latex=++%5Cnabla+JLH%28p_%7Bfore%7D%2C+p_%7Bback%7D%29+%3D+%5Cleft%28%5Cfrac%7B2+p_%7Bfore%7D%7D%7Bp_%7Bback%7D+-+1%7D+%2C+-%5Cfrac%7Bp_%7Bfore%7D%5E2%7D%7Bp_%7Bback%7D%5E2%7D%5Cright%29++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \nabla JLH(p_{fore}, p_{back}) = \left(\frac{2 p_{fore}}{p_{back} - 1} , -\frac{p_{fore}^2}{p_{back}^2}\right)  ' title='  \nabla JLH(p_{fore}, p_{back}) = \left(\frac{2 p_{fore}}{p_{back} - 1} , -\frac{p_{fore}^2}{p_{back}^2}\right)  ' class='latex' />
<p>Setting the gradient to zero we see by looking at the second coordinate that the JLH does not have a minimum, but approaches it when <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> approaches zero where the function is undefined. While the second coordinate is always positive, the first coordinate shows us where the function is not increasing.</p>
<img src='http://s0.wp.com/latex.php?latex=++%5Cbegin%7Baligned%7D++%5Cfrac%7B2+p_%7Bfore%7D%7D%7Bp_%7Bback%7D%7D++-+1+%26+%3C+0+%5C%5C++p_%7Bfore%7D+%26+%3C+%5Cfrac%7B1%7D%7B2%7Dp_%7Bback%7D++%5Cend%7Baligned%7D++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{aligned}  \frac{2 p_{fore}}{p_{back}}  - 1 &amp; &lt; 0 \\  p_{fore} &amp; &lt; \frac{1}{2}p_{back}  \end{aligned}  ' title='  \begin{aligned}  \frac{2 p_{fore}}{p_{back}}  - 1 &amp; &lt; 0 \\  p_{fore} &amp; &lt; \frac{1}{2}p_{back}  \end{aligned}  ' class='latex' />
<p>Furtunately the decreasing part of the function is in an area where <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D+-+p_%7Bback%7D+%3C+0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore} - p_{back} &lt; 0' title='p_{fore} - p_{back} &lt; 0' class='latex' /> and the JLH score explicitly defined as zero. By symmetry of the square around the minimum of the first coordinate of the gradient around <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1%7D%7B2%7Dp_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\frac{1}{2}p_{back}' title='\frac{1}{2}p_{back}' class='latex' /> we also see that the entire area where the score is below zero is in this region.</p>
<p>With this it seems sensible to just drop the linear term of the JLH score and just use the quadratic part. This will result in the same ranking with a slightly less steep increase in score as <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> increases.</p>
<img src='http://s0.wp.com/latex.php?latex=++JLH_%7Bmod%7D+%3D+%5Cfrac%7Bp_%7Bfore%7D%5E2%7D%7Bp_%7Bback%7D%7D++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  JLH_{mod} = \frac{p_{fore}^2}{p_{back}}  ' title='  JLH_{mod} = \frac{p_{fore}^2}{p_{back}}  ' class='latex' />
<p>Looking at the level sets for the JLH score there is a quadratic relationship between the <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' />. Solving for a fixed level <img src='http://s0.wp.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> we get:</p>
<img src='http://s0.wp.com/latex.php?latex=++%5Cbegin%7Baligned%7D++JLH+%3D+%26+%5Cfrac%7Bp_%7Bfore%7D%5E2%7D%7Bp_%7Bback%7D%7D+-+p_%7Bfore%7D+%3D+k+%5C%5C+++%26+p_%7Bfore%7D%5E2+-+p_%7Bfore%7D+-+k%5Ccdot+p_%7Bback%7D++%3D+0+%5C%5C+++%26+p_%7Bfore%7D+%3D+%5Cfrac%7B1%7D%7B2%7D+%5Cpm+%5Cfrac%7B%5Csqrt%7B1+%2B+4+%5Ccdot+k+%5Ccdot+p_%7Bback%7D%7D%7D%7B2%7D++%5Cend%7Baligned%7D++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{aligned}  JLH = &amp; \frac{p_{fore}^2}{p_{back}} - p_{fore} = k \\   &amp; p_{fore}^2 - p_{fore} - k\cdot p_{back}  = 0 \\   &amp; p_{fore} = \frac{1}{2} \pm \frac{\sqrt{1 + 4 \cdot k \cdot p_{back}}}{2}  \end{aligned}  ' title='  \begin{aligned}  JLH = &amp; \frac{p_{fore}^2}{p_{back}} - p_{fore} = k \\   &amp; p_{fore}^2 - p_{fore} - k\cdot p_{back}  = 0 \\   &amp; p_{fore} = \frac{1}{2} \pm \frac{\sqrt{1 + 4 \cdot k \cdot p_{back}}}{2}  \end{aligned}  ' class='latex' />
<p>Where the negative part is outside of function definition area.<br />
This is far easier to see in the simplified formula.</p>
<img src='http://s0.wp.com/latex.php?latex=++%5Cbegin%7Baligned%7D++JLH+%3D+%26+%5Cfrac%7Bp_%7Bfore%7D%5E2%7D%7Bp_%7Bback%7D%7D+%3D+k+%5C%5C+++%26+p_%7Bfore%7D+%3D+%5Csqrt%7Bk+%5Ccdot+p_%7Bback%7D%7D++%5Cend%7Baligned%7D++&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{aligned}  JLH = &amp; \frac{p_{fore}^2}{p_{back}} = k \\   &amp; p_{fore} = \sqrt{k \cdot p_{back}}  \end{aligned}  ' title='  \begin{aligned}  JLH = &amp; \frac{p_{fore}^2}{p_{back}} = k \\   &amp; p_{fore} = \sqrt{k \cdot p_{back}}  \end{aligned}  ' class='latex' />
<p>An increase in <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> must be offset by approximately a square root increase in <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> to  retain the same score.</p>
<p><a href="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-contour.png"><img src="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-contour-300x209.png" alt="JLH-contour" width="300" height="209" class="alignnone size-medium wp-image-3791"></a></p>
<p>As we see the score increases sharply as <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> increases in a quadratic manner against <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' />. As <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> becomes small compared to <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> the growth goes from linear in <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> to squared.</p>
<p>Finally a 3D plot of the score function.</p>
<p><a href="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-3d.png"><img src="http://blog.comperiosearch.com/wp-content/uploads/2015/06/JLH-3d-300x203.png" alt="JLH-3d" width="300" height="203" class="alignnone size-medium wp-image-3790"></a></p>
<p>So what can we take away from all this? I think the main practical consideration is the squared relationship between <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> which means once there is significant difference between the two the <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> will dominate the score ranking. The <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> factor primarily makes the score sensitive when this factor is small and for reasonable similar <img src='http://s0.wp.com/latex.php?latex=p_%7Bback%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{back}' title='p_{back}' class='latex' /> the <img src='http://s0.wp.com/latex.php?latex=p_%7Bfore%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_{fore}' title='p_{fore}' class='latex' /> decides the ranking. There are some obvious consequences from this which would be interesting to explore in real data. First that you would like to have a large background document set if you want more fine grained sensitivity to background frequency. Second, foreground frequencies can dominate the score to such an extent that peculiarities of the implementation may show up in the significant terms ranking, which we will look at in more detail as we try to apply the significant terms aggregation to single documents.</p>
<p>The results and visualizations in this blog post is also available as an <a href="https://github.com/andrely/ipython-notebooks/blob/master/JLH%20score%20characteristics.ipynb" title="JLH score characteristics">iPython notebook</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2015/06/10/how-elasticsearch-calculates-significant-terms/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enterprise Search Optimization (ESO)</title>
		<link>http://blog.comperiosearch.com/blog/2015/01/10/enterprise-search-optimization_eso/</link>
		<comments>http://blog.comperiosearch.com/blog/2015/01/10/enterprise-search-optimization_eso/#comments</comments>
		<pubDate>Sat, 10 Jan 2015 11:45:54 +0000</pubDate>
		<dc:creator><![CDATA[Christoffer Vig]]></dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[enterprise search]]></category>
		<category><![CDATA[enterprise search optimization]]></category>
		<category><![CDATA[ESO]]></category>
		<category><![CDATA[findability]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[relevancy tuning]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=3153</guid>
		<description><![CDATA[So, you got your enterprise search engine, but still can&#8217;t find what you&#8217;re looking for?  It&#8217;s time to stop your sobbing and learn to play the exciting game of Enterprise Search Optimization (ESO). Enterprise search differs from web search in some fundamental ways. But there are also similarities. Since we all know how successful web search [...]]]></description>
				<content:encoded><![CDATA[<p>So, you got your enterprise search engine, but still can&#8217;t find what you&#8217;re looking for?  It&#8217;s time to stop your sobbing and learn to play the exciting game of Enterprise Search Optimization (ESO).</p>
<p><span id="more-3153"></span></p>
<p><a href="http://en.wikipedia.org/wiki/Enterprise_search">Enterprise search</a> differs from <a href="http://en.wikipedia.org/wiki/Web_search_engine">web search</a> in some fundamental ways. But there are also similarities. Since we all know how successful web search is, let&#8217;s see if there is something to learn by examining the differences.</p>
<p>&nbsp;</p>
<table>
<tbody>
<tr>
<th></th>
<th>Web search</th>
<th> Enterprise search</th>
</tr>
<tr>
<td>Search Engine</td>
<td>Google, Bing, Baidu&#8230;</td>
<td>SharePoint, Elasticsearch, Solr, Virtualworks, Autonomy, GSA&#8230;</td>
</tr>
<tr>
<td>Sources</td>
<td>Web pages, web applications (++)</td>
<td>databases, file shares, intranet, web pages, email, SAP, CRM&#8230;</td>
</tr>
<tr>
<td>Content ambitions</td>
<td>everything</td>
<td>limited</td>
</tr>
<tr>
<td>Authority ranking</td>
<td>Pagerank</td>
<td>custom</td>
</tr>
<tr>
<td>Control of search engine</td>
<td>web search company</td>
<td>tech department, power users</td>
</tr>
<tr>
<td>Control of content</td>
<td>user</td>
<td>user</td>
</tr>
<tr>
<td>Writer/reader ratio</td>
<td>low</td>
<td>high</td>
</tr>
</tbody>
</table>
<p>The most striking similarity is that both solutions involve content produced by a user.</p>
<p>The main differences are the search engine and who controls it, the different types of content sources, and the use of the pagerank algorithm.</p>
<h3><strong>Web content and web search</strong></h3>
<p>What makes web search so successful?  Web search was revolutionized when Google introduced their web search using the pagerank algorithm. Pagerank uses the natural structure of the world wide web, and assigns high weight to pages with many incoming links. It rests on the assumption that pages with correct and important information will be used as references on other pages. Along with pagerank, there is a large number of other factors used to drive relevancy; content quality, keywords, social media sharing etc. Most of the details are not publicly available.</p>
<p>Content publishers on the world wide web can use the tricks of <a href="http://en.wikipedia.org/wiki/Search_engine_optimization">Search Engine Optimization</a> (SEO) to make sure their content gets optimal visibility on the web. SEO is the art of combining knowledge of two things;</p>
<p>- how web search engines work</p>
<p>- what search terms people use.</p>
<p>Both of these areas involve a lot of guessing. Some information can be found in guides such as the <a href="https://support.google.com/webmasters/answer/35769?hl=en&amp;ref_topic=6002025">Google Webmaster Guidelines</a>, which explains what a webmaster can do to make sure her web sites are properly indexed. Parts of this read almost like an instruction on how to create a nice school paper: &#8220;Create a useful, information-rich site, and write pages that clearly and accurately describe your content.&#8221;</p>
<p>By following these guidelines, you are helping web search engines understand your content.</p>
<p><strong>Enterprise content and enterprise search </strong></p>
<p>Enterprise search is a different story. Content is gathered from different sources, with varying degrees of  structure, and mostly without links that could be used for pagerank.</p>
<p>Content publishers in an enterprise search solution are on their own, with no official guidelines describing the rules to follow to win top ranking on the intranet search. More often than not, nobody knows how the enterprise search engine really works. Compare this to the web search situation, and it should not come as a surprise if enterprise search sucks.</p>
<p>A solution to this dilemma requires taking a step back from the idea that enterprise search is a box that you can plug in to your intranet  and &#8220;there was search&#8221;.</p>
<p>Search tech guys often pride themselves in the abilities of their search engines, and will rather fix relevancy problems created by bad content by doing tricks on the technical side of things. On the other side of the story, content producers expect search to &#8220;just work&#8221;, and put all the responsibility on technology and the implementer.</p>
<p>Creating a great enterprise search solution requires cooperation between the makers of content and the makers of search solutions.</p>
<p>Content producers should know how their content will end up in search. They should know what factors affect findability. Search solutions should have documentation targeted towards the end user, which in the enterprise also might be a content producer.</p>
<h3><strong>ESO</strong></h3>
<p>We can define Enterprise Search Optimization (ESO) as the art of improving Enterprise Search. Where ESO has been applied, we should expect to find a well functioning search solution, where employees and content producers know how to create easily findable content.</p>
<p>Compared to SEO, Enterprise search optimization is a simple procedure, involving little  guesswork in regard to figuring out how the search engine works. It is also a difficult procedure, since ESO needs to be individually tailored and optimized for the specific informational needs for each enterprise.  To develop ESO guidelines, the search technicians need to sit down with the content producers and users to figure out the details of the information model and where the pain of missing information hurts the most.</p>
<p>ESO should result in a list of guidelines, or rules, similar to the lists of SEO. These rules can range from simple and obvious, making sure documents have descriptive titles, correct dates and author, to more complex involving consistent language use, metadata fields for categorization, etc. ESO rules should also explain how structure is imposed on data with less structure.</p>
<p>Recognizing authoritative content is solved in web search engines by using the pagerank algorithm. Enterprise search will rarely be able to use pagerank directly. Authority can often be determined by other means. This can range from simple facts like &#8220;This book is the company procedure bible&#8221; to &#8220;powerpoint is more important than word&#8221;.</p>
<h3><strong>Optimizing  enterprise search </strong></h3>
<p>Enterprise search can suck a little less by applying a customized version of SEO.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2015/01/10/enterprise-search-optimization_eso/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dictatorial control over recipe search results using elasticsearch and function_score</title>
		<link>http://blog.comperiosearch.com/blog/2014/07/11/dictatorial-control-recipe-search-results-using-elasticsearch-function_score/</link>
		<comments>http://blog.comperiosearch.com/blog/2014/07/11/dictatorial-control-recipe-search-results-using-elasticsearch-function_score/#comments</comments>
		<pubDate>Fri, 11 Jul 2014 06:02:06 +0000</pubDate>
		<dc:creator><![CDATA[Christoffer Vig]]></dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Elasticsearch]]></category>
		<category><![CDATA[recipe app]]></category>
		<category><![CDATA[relevance]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=2723</guid>
		<description><![CDATA[Once the design for the seasonal recipes app started coming into place, we soon saw there was something fishy about the results. Elasticsearch and custom relevancy to the rescue! Warning! Dynamic scripting has been disabled by default in  elasticsearch version 1.4.3. Using the technique in this article now requires some extra steps. Details on the Elastic blog. [...]]]></description>
				<content:encoded><![CDATA[<p>Once the design for <a href="http://recipe.comperiosearch.com">the seasonal recipes app </a> started coming into place, we soon saw there was something fishy about the results. Elasticsearch and custom relevancy to the rescue!<br />
<span id="more-2723"></span></p>
<p><em>Warning! Dynamic scripting has been disabled by default in  elasticsearch version 1.4.3</em>. <em>Using the technique in this article now requires some extra steps. Details on the <a href="https://www.elastic.co/blog/running-groovy-scripts-without-dynamic-scripting/">Elastic blog</a>.</em></p>
<p><a title="Relevance tuning in the search domain. What is it exactly?" href="http://blog.comperiosearch.com/blog/2014/03/07/recipe-app-relevance-tuning-what-is-it-exactly/">Our design </a>explains that we need results to be sorted by number of ingredients, and then by date, with the most recent recipes on top, scoring recipes from 2008 at bottom. The original attempt involved a simple &#8220;terms&#8221; query.</p>
<p>Investigating the results for July, in the garden, gave us recipes for jam at the top, with the count of matching ingredients being only 3 for the top hit. The list of ingredients in season for July in the garden is quite long, but all you need to know is that it contains &#8220;<a href="http://en.wikipedia.org/wiki/Redcurrant">rips</a>&#8220;, a little red sour berry, and &#8220;poteter&#8221;, that is potatoes.</p>
<script src="https://gist.github.com/85138ca283157f4db3ad.js?file=terms"></script>
<p>You can find the queries used in this post at <a href="http://sense.qbox.io/gist/ed20280e523b7821791a161ecf129068b06e2316">http://sense.qbox.io</a></p>
<p>For this query, we were some what surprised that none of the recipes on top contained potatoes. Using the highlight function, it is easy to see that the number of ingredients returned for the top hits should have been higher. Then it dawned upon us: <a href="http://en.wikipedia.org/wiki/Tf%E2%80%93idf">TF-IDF!</a> You&#8217;re messing up again! What we see is just the normal relevancy, promoting the least commonly used terms to the top. This works well for natural language queries, but that&#8217;s not really what we are doing here.</p>
<p>Luckily, elasticsearch doesn&#8217;t leave us stuck in a rut. We implemented a custom scoring function using the <a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html">function score query</a>.</p>
<script src="https://gist.github.com/85138ca283157f4db3ad.js?file=function_score"></script>
<p>For this scoring, we don&#8217;t need any points from the query terms, we just want to replace the default scoring with our custom one (boost_mode = replace).<br />
The scoring function has two parts, one where we add up the number of ingredients, and one part to add some boost to the most recent posts.</p>
<p>The function to sum up term frequencies looks like this:</p>
<script src="https://gist.github.com/85138ca283157f4db3ad.js?file=script_score_groovy"></script>
<p>The tf() function returns the term frequency  for a term in this field. There are a number of functions you can use to perform your own calculations based on index properties. The functions available are documented in the <a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-advanced-scripting.html#_nomenclature">text scoring in scripts</a> and the <a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_document_fields">scripting module</a>.</p>
<p>To the term frequency we add the date scoring:</p>
<script src="https://gist.github.com/85138ca283157f4db3ad.js?file=date_score_function"></script>
<p>We are using a linear function, but we could also have <a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html#_decay_functions">used gauss or exponential curves.</a></p>
<p>The &#8220;scale&#8221; parameter decides the point on the graph where the value specified in &#8220;decay&#8221; should be found. Setting it to 700 days allows the scoring to reach 0 for recipes dated in 2008, which was one of the requirements.</p>
<p>The number of ingredients will always be whole numbers, while the date scoring is normalized to values from 1 to 0.</p>
<p>To allow the scoring from both functions to add up, we use the parameter score_mode=sum.</p>
<p>Elasticsearch is an extremely powerful toolbox for search, information retrieval, analytics, big data, you name it. The possibilites are endless.</p>
<p>&nbsp;</p>
<p>If you want to learn more about custom scoring in elasticsearch, there are some nice videos you can watch:</p>
<p>&#8220;<a href="http://youtu.be/xg2pepPcBME">Scoring for human beings&#8221; by Britta Weber, Berlin Buzzwords 2014</a></p>
<p><a href="http://www.elasticsearch.org/videos/introducing-custom-scoring-functions/">http://www.elasticsearch.org/videos/introducing-custom-scoring-functions/</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2014/07/11/dictatorial-control-recipe-search-results-using-elasticsearch-function_score/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to visualize absolute search result quality</title>
		<link>http://blog.comperiosearch.com/blog/2014/05/08/how-to-visualize-absolute-search-result-quality/</link>
		<comments>http://blog.comperiosearch.com/blog/2014/05/08/how-to-visualize-absolute-search-result-quality/#comments</comments>
		<pubDate>Thu, 08 May 2014 16:51:56 +0000</pubDate>
		<dc:creator><![CDATA[Espen Klem]]></dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[recipe app]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[relevance tuning]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=2278</guid>
		<description><![CDATA[Earlier, I&#8217;ve looked into how I could use the Phi spiral to possibly get a better display of what&#8217;s most relevant in a search result. A former colleague of mine, Johannes Hoff Holmedahl, did a quick test on the theory, and it may actually work. For the recipe app I want to do something slightly [...]]]></description>
				<content:encoded><![CDATA[<p>Earlier, I&#8217;ve looked into how I could <a href="http://blog.comperiosearch.com/blog/2013/07/05/a-better-search-result-a-visual-relevancy-hierarchy-building-on-the-phi-spiral/">use the Phi spiral to possibly get a better display of what&#8217;s most relevant</a> in a search result. A former colleague of mine, Johannes Hoff Holmedahl, <a href="//blog.comperiosearch.com/blog/2013/08/07/redesigning-netflix-using-the-phi-spiral/">did a quick test on the theory</a>, and it may actually work.</p>
<p>For the recipe app I want to do something slightly different, showing the absolute search result quality for each result. In other words: If the best search result in a result set is not very good, make it smaller than if it has higher value, thus showing an absolute value for each result. The dialogue equivalent comparing i.e. two movies would be to define the best of them better than the other, but not the best you&#8217;d seen.</p>
<h2>Absolute search result quality</h2>
<p>aka. Absolute visual relevance hierarchy</p>
<p>How do we then measure absolute quality? In an earlier post I described <a href="http://blog.comperiosearch.com/blog/2014/03/07/recipe-app-relevance-tuning-what-is-it-exactly/">what would be our relevancy hierarchy</a>. The more in-season ingredients in a recipe, the better quality.</p>
<p><a href="https://www.flickr.com/photos/eklem/14158409963/"><img class="alignnone" src="https://farm8.staticflickr.com/7349/14158409963_dc2463f1f7.jpg" alt="Visualization of absolute search result quality" width="500" height="281" /></a></p>
<p>I&#8217;ve defined three quality groups for absolute search result quality so far (number of ingredients: n):</p>
<ol>
<li>n &gt;= 4</li>
<li>1 &lt; n &lt; 4</li>
<li>n = 1</li>
</ol>
<p>Here are three different examples on search results set. First has two results with four or more in-season ingredients and second has only one. Third has none, typically something that would happen during the winter months in Norway:</p>
<p><a href="https://www.flickr.com/photos/eklem/14115310566/sizes/l"><img class="alignnone" src="https://farm8.staticflickr.com/7375/14115310566_375a0d5936.jpg" alt="Visualization of absolute search result quality" width="500" height="237" /></a></p>
<p><a href="http://blog.comperiosearch.com/blog/tag/recipe-app/">The recipe app is work in progress</a>. Check back every now and then for new blog posts on the subject.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2014/05/08/how-to-visualize-absolute-search-result-quality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Relevance tuning in the search domain. What is it exactly?</title>
		<link>http://blog.comperiosearch.com/blog/2014/03/07/recipe-app-relevance-tuning-what-is-it-exactly/</link>
		<comments>http://blog.comperiosearch.com/blog/2014/03/07/recipe-app-relevance-tuning-what-is-it-exactly/#comments</comments>
		<pubDate>Fri, 07 Mar 2014 16:26:06 +0000</pubDate>
		<dc:creator><![CDATA[Espen Klem]]></dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[recipe app]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[relevancy tuning]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[user story]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=2032</guid>
		<description><![CDATA[First thing first! Let&#8217;s get rid of the bullshit bingo lingo: &#8220;Relevancy tuning&#8221; in search is a fancy description for something that&#8217;s not very magical, even if it sounds like just that. It&#8217;s about getting the right results on top of your search result. End of story. If somebody asks you a question, you should [...]]]></description>
				<content:encoded><![CDATA[<p>First thing first! Let&#8217;s get rid of the bullshit bingo lingo: &#8220;Relevancy tuning&#8221; in search is a fancy description for something that&#8217;s not very magical, even if it sounds like just that. It&#8217;s about getting the right results on top of your search result. End of story. If somebody asks you a question, you should start by giving that person the most likely answer first. Most search engines seems to be digressing. It&#8217;s because we haven&#8217;t told in a clear manner what to be expected from them. And because we often use generic tools to solve specific problems.</p>
<p>One generic tool for getting the right results on top is the &#8220;<a href="http://en.wikipedia.org/wiki/Tf%E2%80%93idf">term frequency–inverse document frequency</a>&#8220;, or <a href="https://www.google.no/?gfe_rd=ctrl&amp;ei=_NAZU7qjL8-AwAP6_oCgBg&amp;gws_rd=cr#q=tf-idf&amp;safe=off">tf-idf</a> for short. It&#8217;s a combination of how often a term is mentioned in a document compared to how often it&#8217;s mentioned in all of your documents in the index. So, rare terms within the whole index used often in one document makes it a good search result when searching for that term. But most likely, not good enough. You need to figure out what&#8217;s the characteristics of your content, and what are the most characteristic use cases and user stories for your users. Only then can you achieve great relevancy, &#8230;  I mean get the right result on top of your search result.</p>
<h2>Model for relevance tuning</h2>
<p>We&#8217;ll use our Recipe app as an example&#8230;</p>
<p><img class="alignnone" src="http://farm4.staticflickr.com/3122/12989606394_97436f539e_z.jpg" alt="Model for relevance tuning" width="360" height="640" /></p>
<p>So, for our food recipe app, we have some obvious content characteristics:</p>
<ul>
<li>The more ingredients in-season for one recipe is good. We&#8217;re doing an OR-search on all ingredients in-season so this comes out-of-the-box &#8230; almost.</li>
<li>Quite a lot of recipes doesn&#8217;t stand the test of time. We know that most of the recipes at oppskrift.klikk.no from 2008 or newer are quite good and have nice photos.</li>
<li>We&#8217;re not sure if we need this, but we know whom of the writers to trust. This may be an overkill when we already have a boosting on newer recipes.</li>
</ul>
<p>And we know a lot about our users as well:</p>
<ul>
<li>Most grown up people in Norway have a job, thus limited time to prepare a meal. This means that recipes that takes shorter preparations should be boosted from Monday through Thursday. The verdict on Friday is still not decided.</li>
<li>During the weekend people have more time to make dinner. The recipes that takes a short time to prepare most probably cut some corners, and are not that good compared to recipes that takes a little longer time. So for the weekends, we should do a demotion of really quick recipes, at least for dinners.</li>
</ul>
<p>This is the info we&#8217;re going to use to sort our search result. But we have more knowledge about our users that we can use to auto-set filters for certain times of the day:</p>
<ul>
<li>Most work days, people don&#8217;t plan a breakfast meal or lunch. The whole day we can auto-set the main &#8220;course&#8221; filter.</li>
<li>During the weekend, people may also plan a lunch. We&#8217;ve decided to auto-set the &#8220;light meal&#8221;-filter during weekends up until lunch time. After that the &#8220;main course&#8221; filter is auto-set. We&#8217;ll log if the first thing our users do is to set another filter.</li>
<li>On Friday and Saturday a lot of Norwegians drink beer, wine or liquor. After some hours of drinking, they get hungry. Maybe we should have an &#8220;afterparty, quick and greasy and tasty-meal&#8221;-filter auto-set for late Fridays and Saturdays?</li>
</ul>
<p>So, what&#8217;s the filters we&#8217;ve decided on:</p>
<ul>
<li>Light meals</li>
<li>Starters</li>
<li>Main courses</li>
<li>Deserts</li>
<li>&#8230; and maybe the Afterparty-thingy</li>
</ul>
<p>What do you think?</p>
<p><img class="alignnone" src="http://farm4.staticflickr.com/3143/12988485805_d1a693e95c_z.jpg" alt="Model for relevance tuning" width="640" height="360" /></p>
<p>Sounds nice? This is work in progress, so <a href="http://blog.comperiosearch.com/blog/tag/recipe-app/">check back every now and then for new blog posts</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2014/03/07/recipe-app-relevance-tuning-what-is-it-exactly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The seasonal recipe app: Tapping into the mental model</title>
		<link>http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/</link>
		<comments>http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/#comments</comments>
		<pubDate>Fri, 07 Feb 2014 15:09:26 +0000</pubDate>
		<dc:creator><![CDATA[Espen Klem]]></dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[brainstorm]]></category>
		<category><![CDATA[concept]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[qbox]]></category>
		<category><![CDATA[recipe app]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[relevancy tuninig]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[wireframes]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=1980</guid>
		<description><![CDATA[Our mental model for the seasonal recipe app is helping people use the best ingredients for any particular time of year is the goal for our little demo search app. Since a lot of people in Norway actually go into the nature and forage, fetch, pick, shoot and fish their own food, we wanted to [...]]]></description>
				<content:encoded><![CDATA[<p>Our mental model for the seasonal recipe app is helping people use the best ingredients for any particular time of year is the goal for our little demo search app. Since a lot of people in Norway actually go into the nature and forage, fetch, pick, shoot and fish their own food, we wanted to divide into some of the most typical and normal places where you can find those types of food. We then have two variables for our search: <strong>Place where you find the food</strong> and <strong>Time of year (Month)</strong>.</p>
<h2>Tapping into the mental model</h2>
<p>Each variable combination will do an OR-search containing a lot of ingredients for that particular place and time of year. Our relevancy model so far:</p>
<ol>
<li>Recipes with the highest amount of ingredients hits</li>
<li>Newest recipes</li>
<li>Recipes written by Christopher Sjuve</li>
</ol>
<p>Number one on the list is given, but why number two and three? A lot of the older recipes doesn&#8217;t stand the test of time, and we know we trust Christopher Sjuve&#8217;s recipes.</p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7320/12363398174_f9d83062bc_c.jpg" alt="" width="461" height="259" /></p>
<p>&nbsp;</p>
<p>The places we&#8217;ve chosen:</p>
<ol>
<li>The sea</li>
<li>The farm</li>
<li>The garden</li>
<li>The forest</li>
<li>The mountain</li>
</ol>
<p>It&#8217;s an odd bunch of places, but so far we think it will work. Logs and usability testing will tell us later if we&#8217;re hitting the target or not. The farm doesn&#8217;t fit that well with the others, since you don&#8217;t normally enter a farm and steal a cow or some potatoes. But it will be what&#8217;s closest in content to your average supermarket, and will be the default choice. Almost all of the places will have some overlapping ingredients. Each search is a combination of a place and a month. 5 places x 12 months means a sprite of 60 images where you swipe horizontal to select a place. Month will be selected for you, but to open up for exploration we think it will be valuable to  have a vertical swipe to select month.</p>

<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/0-swipe-place/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/0-swipe-place-150x150.png" class="attachment-thumbnail" alt="0-swipe-place" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/1-sea/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/1-sea-150x150.png" class="attachment-thumbnail" alt="1-sea" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/2-farm/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/2-farm-150x150.png" class="attachment-thumbnail" alt="2-farm" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/3-garden/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/3-garden-150x150.png" class="attachment-thumbnail" alt="3-garden" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/4-forest/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/4-forest-150x150.png" class="attachment-thumbnail" alt="4-forest" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/5-mountain/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/5-mountain-150x150.png" class="attachment-thumbnail" alt="5-mountain" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/recipe-app-mental-model/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/04/recipe-app-mental-model-150x150.jpg" class="attachment-thumbnail" alt="The mental model of the recipe app, mockups" /></a>
<a href='http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/rp_12363398174_f9d83062bc_c-jpg/'><img width="150" height="150" src="http://blog.comperiosearch.com/wp-content/uploads/2014/02/12363398174_f9d83062bc_c-150x150.jpg" class="attachment-thumbnail" alt="rp_12363398174_f9d83062bc_c.jpg" /></a>

<p>Here&#8217;s the first wireframes on the UX concept.</p>
<p><img class="alignnone" src="http://farm4.staticflickr.com/3813/12365584783_9bec51cf06_z.jpg" alt="" width="640" height="361" /></p>
<p>First version of the query matrix. So far not organized by places, but types of ingredients.</p>
<p><a href="http://ec2-54-195-32-62.eu-west-1.compute.amazonaws.com:3000/search?ingredients=rødbet">The search is already up and running, but lack every sign of graphical user interface</a>.</p>
<p><a href="http://qbox.io/"><img class="alignnone" src="http://farm8.staticflickr.com/7456/12366227173_38b6792cd5_z.jpg" alt="" width="640" height="284" /></a></p>
<p><strong><a href="http://qbox.io/">Thanks to Qbox.io for letting us use a Hosted Elasticsearch</a> instance for this project!</strong></p>
<p>&nbsp;</p>
<p>Sounds nice? This is work in progress, so <a href="http://blog.comperiosearch.com/blog/tag/recipe-app/">check back every now and then for new blog posts</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2014/02/07/the-seasonal-recipe-app-tapping-into-the-mental-model/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual relevancy hierarchy creating a better search result using the Phi spiral?</title>
		<link>http://blog.comperiosearch.com/blog/2013/07/05/a-better-search-result-a-visual-relevancy-hierarchy-building-on-the-phi-spiral/</link>
		<comments>http://blog.comperiosearch.com/blog/2013/07/05/a-better-search-result-a-visual-relevancy-hierarchy-building-on-the-phi-spiral/#comments</comments>
		<pubDate>Fri, 05 Jul 2013 12:46:56 +0000</pubDate>
		<dc:creator><![CDATA[Espen Klem]]></dc:creator>
				<category><![CDATA[User Experience]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[relevance]]></category>
		<category><![CDATA[search result]]></category>
		<category><![CDATA[search results]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.comperiosearch.com/?p=1217</guid>
		<description><![CDATA[Today, most search solutions will give you the results as a list from 1 to 10. Problem is, they&#8217;re not very appealing, and don&#8217;t do the task at hand very well. At the top of the list, it’s okay. Number 1 gets most clicks, number 2 a little less, number three even less, but then [...]]]></description>
				<content:encoded><![CDATA[<p>Today, most search solutions will give you the results as a list from 1 to 10. Problem is, they&#8217;re not very appealing, and don&#8217;t do the task at hand very well. At the top of the list, it’s okay. Number 1 gets most clicks, number 2 a little less, number three even less, but then in the middle, a lot of results get less than the ones at the bottom.</p>
<h2>Using the phi-spiral as a visual relevancy hierarchy</h2>
<div id="attachment_1488" style="width: 578px" class="wp-caption alignnone"><a href="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-011.png"><img class=" wp-image-1488  " src="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-011.png" alt="" width="568" height="352" /></a><p class="wp-caption-text">So, how could the Phi spiral help us?</p></div>
<p>A search engine list out what it thinks is the most important first. But the list has several issues:</p>
<ul>
<li><strong>You could, but should you?</strong><br />
Just because your template really want you to render a logic list as a visual  list, doesn&#8217;t mean you have to do it like that.</li>
<li><strong>Not representing the information well<br />
</strong>A news article looks like a news article, no matter which version you see: The front page teaser, a short version or the full blown thingy. But a search result almost always looks like just that: A dull list of items.</li>
<li><strong>Too many items</strong><br />
Results at the bottom of the list tends to get higher click rates than just above the bottom. I guess this have to do with how people <a href="http://www.useit.com/alertbox/reading_pattern.html">scan web content in F-shaped patterns</a> and that a list of 10 items is too much information for the user to digest.</li>
</ul>
<p>So, what if we started to use space and position to show relevancy? The Phi spiral, building on the Fibonacci sequence would make a nice search result.</p>
<div id="attachment_1489" style="width: 578px" class="wp-caption alignnone"><a href="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-021.png"><img class=" wp-image-1489 " src="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-021.png" alt="" width="568" height="447" /></a><p class="wp-caption-text">Phi spiral as a search result. We&#8217;ll get all sorts of other issues, but I think it&#8217;s a good start to getting somewhere better.</p></div>
<p>You would maybe not be able to show more than 5 result items, but we could put the search box in the middle of the page and then get 6 items.</p>
<div id="attachment_1490" style="width: 578px" class="wp-caption alignnone"><a href="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-031.png"><img class=" wp-image-1490 " src="http://blog.comperiosearch.com/wp-content/uploads/2013/07/phi-spiral-031.png" alt="" width="568" height="1012" /></a><p class="wp-caption-text">Looking less like a search result and more like a content filled page.</p></div>
<p>So, what do you think? Others are using treemaps: <a href="http://newsmap.jp/">Newsmap.jp</a>. Not a very usable implementation, but a nice idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2013/07/05/a-better-search-result-a-visual-relevancy-hierarchy-building-on-the-phi-spiral/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using internal rank metrics in external search engines</title>
		<link>http://blog.comperiosearch.com/blog/2011/02/03/internal-rank-metrics-external-search-engines/</link>
		<comments>http://blog.comperiosearch.com/blog/2011/02/03/internal-rank-metrics-external-search-engines/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 13:20:51 +0000</pubDate>
		<dc:creator><![CDATA[Marcus Johansson]]></dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[bing]]></category>
		<category><![CDATA[click-stream data]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[invisible web]]></category>
		<category><![CDATA[precision]]></category>
		<category><![CDATA[recall]]></category>
		<category><![CDATA[relevance]]></category>

		<guid isPermaLink="false">http://nuggets.comperiosearch.com/?p=236</guid>
		<description><![CDATA[…and how the hidden web can be revealed In the current flame war between Google and Bing, there is a good amount of pie-throwing going on around the internet. But in the process, some very interesting tech stuff has surfaced as well. We’ve got a glimpse on one of the many components Bing is using [...]]]></description>
				<content:encoded><![CDATA[<p><em><strong>…and how the hidden web can be revealed<br />
</strong></em></p>
<p>In the current flame war between Google and Bing, there is a good amount of <a href="http://techcrunch.com/2011/02/01/bing-google-fight/">pie-throwing</a> going on <a href="http://www.puremango.co.uk/2011/02/what-on-earth-are-google-doing/">around the internet</a>. But in the process, some very interesting tech stuff has surfaced as well. We’ve got a glimpse on one of the many components Bing is using as a measurement of relevance, namely <a href="http://www.bing.com/community/site_blogs/b/search/archive/2011/02/02/setting-the-record-straight.aspx">click-stream data from real users</a>.</p>
<p>Disregarding the Google vs. Bing dispute; the use of click-stream data (aka browser usage statistics), is very interesting in a search engine perspective. This is because relevance of search queries is often described as a combination of <a href="http://en.wikipedia.org/wiki/Recall_%28information_retrieval%29"><em>the precision of the results</em> and the <em>recall of the query</em></a>, and click-stream data can help increasing them both.</p>
<p>Here’s one of the reasons why.</p>
<p>If you spend a lot of time on a particular web site, you have probably used its search engine. Quite often, you can choose to search through the site using Google or Bing. But a reason why it makes sense to use the site’s own search engine is that in theory, the particular site can <em>always </em>build a better search experience than what anyone else ever could. They can rank the documents using important internal metrics such as e.g. upvotes (Reddit), social distance (LinkedIn) reputation (Stack Overflow), and retweets (Twitter). The list goes on.</p>
<p>Now. If you happen to be able to watch what users do on these particular web sites, you would in fact be able to lift some of that domain-specific data (upvotes, distance, reputation, and retweets) into your own machinery. Perhaps not directly, but at least indirectly.</p>
<p>If someone searches on Reddit for a certain comment thread, their search engine will (supposedly) produce the best match, ranked according to how many upvotes and comments that particular thread has accumulated. Two things are of interest:</p>
<ol>
<li>The user is quite likely to visit a page that was returned high up in the results.</li>
<li>The URL to the results is likely to contain something like “search=TERMS” or “query=TERMS”.</li>
</ol>
<p>If you happen to collect browser usage statistics you can draw the conclusion that the documents that the user clicked on are highly relevant according to the site’s internal metrics – whatever those might be. Better yet, as you can analyze the URL to the actual search form you also know the particular query terms that the user typed to find these documents. And you can adjust your search engine accordingly.</p>
<p>Simply put, you have now leveraged a web site’s internal data in your external search engine. Consequently adding to the <strong><em>precision of the results</em></strong> using a previously unreachable metric.</p>
<p>Additionally, this tactic will open up more of the “invisible web”. For example, it is not uncommon for government sites to contain big amounts of data, but the only way to get to it is by running queries through an often poorly designed search form. Links into the data sets are rarely provided, so the actual data remains hidden from the search engines.</p>
<p>Until now, as click-stream data allows the search engines to discover it by piggybacking on users&#8217; browsing sessions. Thus, adding to the <strong><em>recall of the queries</em></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.comperiosearch.com/blog/2011/02/03/internal-rank-metrics-external-search-engines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
