Top Banner
71

Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Jul 15, 2015

Download

Software

LucidWorks
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext
Page 2: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Solr Anti - patterns Rafał Kuć, Sematext Group, Inc.

@kucrafal @sematext

http://sematext.com

Page 3: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

About me Sematext consultant & engineer Solr.pl co-founder Father & husband

Page 4: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The (not so) perfect migration

h"p://en.wikipedia.org/wiki/Bird_migra4on  

h"p://www.likesbooks.com/aara:erhours/?p=750  

Page 5: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

From 3.1 to 4.10 (and hopefully not back)

March  2011   September  2014  

Page 6: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The lonely solrconfig.xml

<requestHandler  name="/update"  class="solr.XmlUpdateRequestHandler"  />        <requestHandler  name="/update/javabin"  class="solr.BinaryUpdateRequestHandler"  />    <requestHandler  name="/update/csv"  class="solr.CSVRequestHandler"  />    <requestHandler  name="/update/json"  class="solr.JsonUpdateRequestHandler"  />    

<luceneMatchVersion>LUCENE_31</luceneMatchVersion>  

<directoryFactory  name="DirectoryFactory"                                                                                                      class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>              

Page 7: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

DOC  

DOC  

DOC  

And faulty indexing

EXCEPTIONS  :)  

Page 8: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

And faulty indexing

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>    <lst  name="responseHeader">      <int  name="status">400</int>      <int  name="QTime">0</int>    </lst>    <lst  name="error">      <str  name="msg">missing  content  stream</str>      <int  name="code">400</int>    </lst>  </response>  

109173  [qtp1223685984-­‐20]  ERROR  org.apache.solr.core.SolrCore    ľ  org.apache.solr.common.SolrExcep4on:  missing  content  stream                  at  org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:69)                  at  org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)                  at  org.apache.solr.core.SolrCore.execute(SolrCore.java:1967)                  at  org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:777)                  at  org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:418)                  at  org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:207)                  at  org.eclipse.je"y.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)                  at  org.eclipse.je"y.servlet.ServletHandler.doHandle(ServletHandler.java:455)                  at  org.eclipse.je"y.server.handler.ScopedHandler.handle(ScopedHandler.java:137)                  at  org.eclipse.je"y.security.SecurityHandler.handle(SecurityHandler.java:557)                  at  org.eclipse.je"y.server.session.SessionHandler.doHandle(SessionHandler.java:231)                  at  org.eclipse.je"y.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)                  at  org.eclipse.je"y.servlet.ServletHandler.doScope(ServletHandler.java:384)                  at  org.eclipse.je"y.server.session.SessionHandler.doScope(SessionHandler.java:193)                  at  org.eclipse.je"y.server.handler.ContextHandler.doScope(ContextHandler.java:1009)                  at  org.eclipse.je"y.server.handler.ScopedHandler.handle(ScopedHandler.java:135)                  at  org.eclipse.je"y.server.handler.ContextHandlerCollec4on.handle(ContextHandlerCollec4on.java:255)                  at  org.eclipse.je"y.server.handler.HandlerCollec4on.handle(HandlerCollec4on.java:154)                  at  org.eclipse.je"y.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)                  at  org.eclipse.je"y.server.Server.handle(Server.java:368)                  at  org.eclipse.je"y.server.AbstractH"pConnec4on.handleRequest(AbstractH"pConnec4on.java:489)                  at  org.eclipse.je"y.server.BlockingH"pConnec4on.handleRequest(BlockingH"pConnec4on.java:53)                  at  org.eclipse.je"y.server.AbstractH"pConnec4on.headerComplete(AbstractH"pConnec4on.java:942)                  at  org.eclipse.je"y.server.AbstractH"pConnec4on$RequestHandler.headerComplete(AbstractH"pConnec4on.java:1004)                  at  org.eclipse.je"y.h"p.H"pParser.parseNext(H"pParser.java:647)                  at  org.eclipse.je"y.h"p.H"pParser.parseAvailable(H"pParser.java:235)                  at  org.eclipse.je"y.server.BlockingH"pConnec4on.handle(BlockingH"pConnec4on.java:72)                  at  org.eclipse.je"y.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)                  at  org.eclipse.je"y.u4l.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)                  at  org.eclipse.je"y.u4l.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)                  at  java.lang.Thread.run(Unknown  Source)  

Page 9: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Let’s make that right

<requestHandler  name="/update"  class="solr.UpdateRequestHandler"  />        <requestHandler  name="/update/json"  class="solr.UpdateRequestHandler">      <lst  name="defaults">          <str  name="stream.contentType">applicaLon/json</str>      </lst>  </requestHandler>  

<luceneMatchVersion>LUCENE_4.10.0</luceneMatchVersion>  

<directoryFactory  name="DirectoryFactory"                                                                                                      class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>              

<nrtMode>true</nrtMode>  

<updateLog>      <str  name="dir">          ${solr.ulog.dir:}      </str>  </updateLog>  

Page 10: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The old schema.xml

<fieldType  name="int"  class="solr.IntField"  omitNorms="true"/>  <fieldType  name="long"  class="solr.LongField"  omitNorms="true"/>  <fieldType  name="float"  class="solr.FloatField"  omitNorms="true"/>  <fieldType  name="double"  class="solr.DoubleField"  omitNorms="true"/>  <fieldType  name="date"  class="solr.DateField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sint"  class="solr.SortableIntField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="slong"  class="solr.SortableLongField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sfloat"  class="solr.SortableFloatField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sdouble"  class="solr.SortableDoubleField"  sortMissingLast="true"  omitNorms="true"/>  

Page 11: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

<fieldType  name="int"  class="solr.IntField"  omitNorms="true"/>  <fieldType  name="long"  class="solr.LongField"  omitNorms="true"/>  <fieldType  name="float"  class="solr.FloatField"  omitNorms="true"/>  <fieldType  name="double"  class="solr.DoubleField"  omitNorms="true"/>  <fieldType  name="date"  class="solr.DateField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sint"  class="solr.SortableIntField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="slong"  class="solr.SortableLongField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sfloat"  class="solr.SortableFloatField"  sortMissingLast="true"  omitNorms="true"/>  <fieldType  name="sdouble"  class="solr.SortableDoubleField"  sortMissingLast="true"  omitNorms="true"/>  

The old schema.xml

Page 12: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The new schema.xml

<fieldType  name="int"  class="solr.TrieIntField"  precisionStep="0"  posi4onIncrementGap="0"/>  <fieldType  name="float"  class="solr.TrieFloatField"  precisionStep="0"  posi4onIncrementGap="0"/>  <fieldType  name="long"  class="solr.TrieLongField"  precisionStep="0"  posi4onIncrementGap="0"/>  <fieldType  name="double"  class="solr.TrieDoubleField"  precisionStep="0"  posi4onIncrementGap="0"/>  <fieldType  name="date"  class="solr.TrieDateField"  precisionStep="0"  posi4onIncrementGap="0"/>  <fieldType  name="4nt"  class="solr.TrieIntField"  precisionStep="8"  posi4onIncrementGap="0"/>  <fieldType  name="rloat"  class="solr.TrieFloatField"  precisionStep="8"  posi4onIncrementGap="0"/>  <fieldType  name="tlong"  class="solr.TrieLongField"  precisionStep="8"  posi4onIncrementGap="0"/>  <fieldType  name="tdouble"  class="solr.TrieDoubleField"  precisionStep="8"  posi4onIncrementGap="0"/>  <fieldType  name="tdate"  class="solr.TrieDateField"  precisionStep="6"  posi4onIncrementGap="0"/>  

Page 13: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Threads? What threads? <Set  name="ThreadPool">      <New  class="org.eclipse.je"y.u4l.thread.QueuedThreadPool">          <Set  name="minThreads">10</Set>          <Set  name="maxThreads">200</Set>          <Set  name="detailedDump">false</Set>      </New>  </Set>  

Page 14: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

I see deadlocks

Page 15: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Threads? What threads? <Set  name="ThreadPool">      <New  class="org.eclipse.je"y.u4l.thread.QueuedThreadPool">          <Set  name="minThreads">10</Set>          <Set  name="maxThreads">200</Set>          <Set  name="detailedDump">false</Set>      </New>  </Set>  

Page 16: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

OK, so now we can actually run queries <Set  name="ThreadPool">      <New  class="org.eclipse.je"y.u4l.thread.QueuedThreadPool">          <Set  name="minThreads">10</Set>          <Set  name="maxThreads">10000</Set>          <Set  name="detailedDump">false</Set>      </New>  </Set>  

Page 17: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper

Page 18: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper

Page 19: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper

Page 20: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper

Page 21: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper

Page 22: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper – production

Page 23: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper – production

-­‐DzkHost=zk1:2181,zk2:2181,zk3:2181  

Page 24: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper – production

-­‐DzkHost=zk1:2181,zk2:2181,zk3:2181  

Page 25: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper – production

-­‐DzkHost=zk1:2181,zk2:2181,zk3:2181  

Page 26: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

The ZooKeeper – production

-­‐DzkHost=zk1:2181,zk2:2181,zk3:2181  

Page 27: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Let’s cache everything

<filterCache  class="solr.LRUCache"                            size="1048576"                            ini4alSize="1048576"                            autowarmCount="524288"/>  

<queryResultCache  class="solr.LRUCache"                            size="1048576"                            ini4alSize="1048576"                            autowarmCount="524288"/>  <documentCache  class="solr.LRUCache"  

                         size="1048576"                            ini4alSize="1048576"                            autowarmCount="0"/>  

Page 28: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

And now let’s look at the warmup times

Page 29: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

And now let’s look at the warmup times

Page 30: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

OK, show us the way „Mr. Consultant”

<filterCache  class="solr.FastLRUCache"                            size="1024"                            ini4alSize="1024"                            autowarmCount="512"/>  

<queryResultCache  class="solr.LRUCache"                            size="16000"                            ini4alSize="16000"                            autowarmCount="8000"/>  <documentCache  class="solr.LRUCache"  

                         size="16384"                            ini4alSize="16384"                            autowarmCount="0"/>  

Page 31: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Let’s look at the warmup times again

Page 32: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Let’s look at the warmup times again

Page 33: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Bulks are for noobs

Applica4on   Applica4on   Applica4on  

Doc   Doc   Doc  

Page 34: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Bulks are for noobs

Applica4on   Applica4on   Applica4on  

Doc   Doc   Doc  

Page 35: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But let’s use bulks, just in case

Page 36: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But let’s use bulks, just in case

Page 37: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

We need to refresh and hard commit

<autoCommit>      <maxTime>1000</maxTime>      <openSearcher>true</openSearcher>  </autoCommit>    <autoSo:Commit>      <maxTime>1000</maxTime>  </autoSo:Commit>  

Page 38: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Maybe we should only refresh?

<autoCommit>      <maxTime>60000</maxTime>      <openSearcher>false</openSearcher>  </autoCommit>    <autoSo:Commit>      <maxTime>1000</maxTime>  </autoSo:Commit>  

Page 39: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

OK, let’s go easy with refreshing

<autoCommit>      <maxTime>60000</maxTime>      <openSearcher>false</openSearcher>  </autoCommit>    <autoSo:Commit>      <maxTime>30000</maxTime>  </autoSo:Commit>  

Page 40: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But I really need all that data

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&start=3000000&rows=5'  

Page 41: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="responseHeader">      <int  name="status">0</int>      <int  name="QTime">9418</int>      <lst  name="params">          <str  name="start">3000000</str>          <str  name="q">*:*</str>          <str  name="rows">5</str>      </lst>  </lst>  <result  name="response"  numFound="3284000"  start="3000000">      .      .      .  </result>  </response>  

But I really need all that data

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&start=3000000&rows=5'  

Page 42: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="responseHeader">      <int  name="status">0</int>      <int  name="QTime">9418</int>      <lst  name="params">          <str  name="start">3000000</str>          <str  name="q">*:*</str>          <str  name="rows">5</str>      </lst>  </lst>  <result  name="response"  numFound="3284000"  start="3000000">      .      .      .  </result>  </response>  

But I really need all that data

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&start=3000000&rows=5'  

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="error">      <str  name="msg">java.lang.OutOfMemoryError:  Java  heap  space</str>      <str  name="trace">java.lang.RuntimeException:  java.lang.OutOfMemoryError:  Java  heap  space  

 at  org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:796)    at  org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:448)  

             .                .                .  Caused  by:  java.lang.OutOfMemoryError:  Java  heap  space  

 .    .    .  

</str>      <int  name="code">500</int>  </lst>  </response>  

Page 43: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But I really need all that data

Query  

Page 44: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But I really need all that data

Page 45: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But I really need all that data

Page 46: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

But I really need all that data

Response  

Page 47: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Use the scroll Luke

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&cursorMark=*&sort=score+desc,id+desc'  

Page 48: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Use the scroll Luke

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&cursorMark=*&sort=score+desc,id+desc'  

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="responseHeader">      <int  name="status">0</int>      <int  name="QTime">189</int>      <lst  name="params">          <str  name="sort">score  desc,id  desc</str>          <str  name="q">*:*</str>          <str  name="cursorMark">*</str>      </lst>  </lst>  <result  name="response"  numFound="3284000"  start="0">      <doc>        ...      </doc>      .      .      .  </result>  <str  name="nextCursorMark">AoIIP4AAACY5OTk5OTA=</str>  </response>  

Page 49: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Use the scroll Luke

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&sort=score+desc,id+desc                                                                                                                                                                &cursorMark=AoIIP4AAACY5OTk5OTA='  

Page 50: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Use the scroll Luke

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&sort=score+desc,id+desc                                                                                                                                                                &cursorMark=AoIIP4AAACY5OTk5OTA='  

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="responseHeader">      <int  name="status">0</int>      <int  name="QTime">184</int>      <lst  name="params">          <str  name="sort">score  desc,id  desc</str>          <str  name="q">*:*</str>          <str  name="cursorMark">AoIIP4AAACY5OTk5OTA=</str>      </lst>  </lst>  <result  name="response"  numFound="3284000"  start="0">      <doc>          ...      </doc>      .      .      .  </result>  <str  name="nextCursorMark">AoIIP4AAACY5OTk5ODE=</str>  </response>  

Page 51: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Limiting faceting, why bother?

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&facet=true&facet.field=tag&…                            facet.limit=-­‐1&facet.mincount=0'  

Page 52: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Limiting faceting, why bother?

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&facet=true&facet.field=tag&…                            facet.limit=-­‐1&facet.mincount=0'  

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>  <lst  name="responseHeader">      <int  name="status">0</int>      <int  name="QTime">9967</int>      <lst  name="params">      ...      </lst>  </lst>  <result  name="response"  numFound="3284000"  start="0">    .    .    .  </result>  <lst  name="facet_counts">      <lst  name="facet_fields">          <lst  name="tag">          ...          </lst>      </lst>  </lst>  </response>  

Page 53: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Limiting faceting, why bother?

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&facet=true&facet.field=tag&…                            facet.limit=-­‐1&facet.mincount=0'  

<?xml  version="1.0"  encoding="UTF-­‐8"?>  <response>    .    .    .    <lst  name="error">      <str  name="msg">Error  while  processing  facet  fields:  java.lang.OutOfMemoryError:  Java  heap  space</str>      <str  name="trace">org.apache.solr.common.SolrException:  Error  while  processing  facet  fields:  java.lang.OutOfMemoryError:  Java  heap  space  

 .    .    .  

Caused  by:  java.lang.OutOfMemoryError:  Java  heap  space    at  org.apache.solr.request.SimpleFacets.getFieldCacheCounts(SimpleFacets.java:685)    .    .    .  

   </str>      <int  name="code">500</int>    </lst>  </response>  

Page 54: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Now let’s look at performance

Page 55: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Now let’s look at performance

Page 56: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Now let’s look at performance

Page 57: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Now let’s look at performance

Page 58: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Now let’s look at performance

Page 59: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

curl  -­‐XGET  'localhost:8983/solr/select?q=*:*&facet=true&facet.field=tag&…                            facet.limit=100&facet.mincount=1'  

Page 60: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 61: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 62: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 63: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 64: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 65: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 66: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Magic happens with small changes

Page 67: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Monitoring in production

h"p://sematext.com/spm/index.html  

Page 68: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

And remember…

Release  Notes  Solr  4.10.0  

<luceneMatchVersion>  3.1  

</luceneMatchVersion>  

Page 69: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Quick summary

h"p://www.soothetube.com/2013/12/29/thats-­‐all-­‐folks/  

Page 70: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

We are hiring! Dig Search? Dig Analytics? Dig Big Data? Dig Performance? Dig Logging? Dig working with and in open – source? We’re hiring world – wide!

http://sematext.com/about/jobs.html

Page 71: Solr Anti-Patterns: Presented by Rafał Kuć, Sematext

Thank you! Rafał Kuć

@kucrafal [email protected]

Sematext

@sematext http://sematext.com http://blog.sematext.com