You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by Shanmugavel SRD <sr...@gmail.com> on 2010/12/16 08:47:55 UTC

Query performance issue while using EdgeNGram

While using auto suggest using EdgeNGramFilterFactory in SOLR 1.4.1, we are
having performance issue on query response time.
For example, even though 'p' is in auto warming, if I search for 'people'
immediately after optimization is completed, then search on 'people' is
taking 11-15 secs respond. But subsequent search on 'people' is responding
in less than 1 sec. I want to understand why it is taking 11 secs to respond
and how to reduce it to 1 sec.

These are the below configurations. Could anyone suggest on what am I
missing here?

1) Added query warming
2) Decreased mergeFactor to '3'
3) Increased HashDocSet maxSize as '7000' (which is 1432735 * 0.005)
4) Optimized after the data import.

Data are indexed from a csv file. optimize is called immediately after date
import.

No of docs : 1432735

solrconfig.xml 
  <indexDefaults>
    <useCompoundFile>false</useCompoundFile>
    <mergeFactor>3</mergeFactor>
    <ramBufferSizeMB>32</ramBufferSizeMB>
    <maxMergeDocs>2147483647</maxMergeDocs>
    <maxFieldLength>10000</maxFieldLength>
    <writeLockTimeout>1000</writeLockTimeout>
    <commitLockTimeout>10000</commitLockTimeout>
    <lockType>single</lockType>
  </indexDefaults>
  <mainIndex>
    <useCompoundFile>false</useCompoundFile>
    <ramBufferSizeMB>32</ramBufferSizeMB>
    <mergeFactor>3</mergeFactor>
    <maxMergeDocs>2147483647</maxMergeDocs>
    <maxFieldLength>10000</maxFieldLength>
    <unlockOnStartup>false</unlockOnStartup>
  </mainIndex>
  <updateHandler class="solr.DirectUpdateHandler2">
    <maxPendingDeletes>100000</maxPendingDeletes>
  </updateHandler>

  <query>
    <maxBooleanClauses>1024</maxBooleanClauses>
     <filterCache
      class="solr.LRUCache"
      size="16384"
      initialSize="4096"
      autowarmCount="4096"/>

    <queryResultCache
      class="solr.LRUCache"
      size="16384"
      initialSize="4096"
      autowarmCount="4096"/>

    <documentCache
      class="solr.LRUCache"
      size="5000"
      initialSize="5000"
      />

    <enableLazyFieldLoading>true</enableLazyFieldLoading>
    <queryResultWindowSize>50</queryResultWindowSize>
    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
    <HashDocSet maxSize="7000" loadFactor="0.75"/>
  <listener event="newSearcher" class="solr.QuerySenderListener">
      <arr name="queries">
        <lst> <str name="q">a</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">b</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">c</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">d</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">e</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">f</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">g</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">h</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">i</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">j</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">k</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">l</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">m</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">n</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">o</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">p</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">q</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">r</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">s</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">t</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">u</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">v</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">w</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">x</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">y</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">z</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">0</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">1</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">2</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">3</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">4</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">5</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">6</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">7</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">8</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">9</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
      </arr>
    </listener>
    <listener event="firstSearcher" class="solr.QuerySenderListener">
      <arr name="queries">
        <lst> <str name="q">a</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">b</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">c</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">d</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">e</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">f</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">g</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">h</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">i</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">j</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">k</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">l</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">m</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">n</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">o</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">p</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">q</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">r</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">s</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">t</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">u</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">v</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">w</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">x</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">y</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">z</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">0</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">1</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">2</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">3</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">4</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">5</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">6</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">7</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">8</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
        <lst> <str name="q">9</str><str name="qt">typeahead</str><str
name="start">0</str><str name="rows">100</str></lst>
      </arr>
    </listener>
    <useColdSearcher>false</useColdSearcher>
    <maxWarmingSearchers>20</maxWarmingSearchers>
  </query>

 <requestHandler name="typeahead" class="solr.SearchHandler">
	     <lst name="defaults">
	       <str name="wt">json</str>
	       <str name="fl">name,score</str>
	       <str name="sort">score desc</str>
	       <str name="indent">true</str>
	     </lst>
   </requestHandler>
  <requestDispatcher handleSelect="true" >
  <requestParsers enableRemoteStreaming="true"
multipartUploadLimitInKB="2048" />
    <httpCaching lastModifiedFrom="openTime" etagSeed="Solr">
    </httpCaching>
  </requestDispatcher>        
  <requestHandler name="standard" class="solr.StandardRequestHandler"
default="true">  
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
     </lst>
     <arr name="last-components">
     </arr>
  </requestHandler>
  <requestHandler name="/search"
class="org.apache.solr.handler.component.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
    </lst>
  </requestHandler>  
  <queryConverter name="queryConverter"
class="solr.SpellingQueryConverter"/>
  <searchComponent name="elevator"
class="org.apache.solr.handler.component.QueryElevationComponent" >
    <str name="queryFieldType">string</str>
    <str name="config-file">elevate.xml</str>
  </searchComponent> 
  <requestHandler name="/elevate"
class="org.apache.solr.handler.component.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
    </lst>
    <arr name="last-components">
      <str>elevator</str>
    </arr>
  </requestHandler>
  <requestHandler name="/update" class="solr.XmlUpdateRequestHandler"
></requestHandler>
  <requestHandler name="/analysis" class="solr.AnalysisRequestHandler"
></requestHandler>
  <requestHandler name="/update/csv" class="solr.CSVRequestHandler"
startup="lazy" />
  <requestHandler name="/admin/"
class="org.apache.solr.handler.admin.AdminHandlers" />
  <requestHandler name="/admin/ping" class="PingRequestHandler">
    <lst name="defaults">
      <str name="qt">standard</str>
      <str name="q">solrpingquery</str>
      <str name="echoParams">all</str>
    </lst>
  </requestHandler>  
  <highlighting>
   <fragmenter name="gap" class="org.apache.solr.highlight.GapFragmenter"
default="true">
    <lst name="defaults">
     <int name="hl.fragsize">100</int>
    </lst>
   </fragmenter>
   <fragmenter name="regex"
class="org.apache.solr.highlight.RegexFragmenter">
    <lst name="defaults">
      <int name="hl.fragsize">70</int>
      <float name="hl.regex.slop">0.5</float> 
      <str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
    </lst>
   </fragmenter>   
   <formatter name="html" class="org.apache.solr.highlight.HtmlFormatter"
default="true">
    <lst name="defaults">
     <str name="hl.simple.pre"><![CDATA[<em>]]></str>
     <str name="hl.simple.post"><![CDATA[</em>]]></str>
    </lst>
   </formatter>
  </highlighting>    
    <queryResponseWriter name="xml"
class="org.apache.solr.request.XMLResponseWriter" default="true"/>
    <queryResponseWriter name="json"
class="org.apache.solr.request.JSONResponseWriter"/>
    <queryResponseWriter name="python"
class="org.apache.solr.request.PythonResponseWriter"/>
    <queryResponseWriter name="ruby"
class="org.apache.solr.request.RubyResponseWriter"/>
    <queryResponseWriter name="php"
class="org.apache.solr.request.PHPResponseWriter"/>
    <queryResponseWriter name="phps"
class="org.apache.solr.request.PHPSerializedResponseWriter"/>
    <queryResponseWriter name="xslt"
class="org.apache.solr.request.XSLTResponseWriter">
    <int name="xsltCacheLifetimeSeconds">5</int>
  </queryResponseWriter> 


schema.xml

<types> 
  <fieldType name="typeahead" class="solr.TextField">
        <analyzer type="index">
	    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ISOLatin1AccentFilterFactory" />
		<filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z0-9])"
replacement="" replace="all" />
		<filter class="solr.EdgeNGramFilterFactory" maxGramSize="100"
minGramSize="1" />
	</analyzer>
	<analyzer type="query">
	    <tokenizer class="solr.KeywordTokenizerFactory"/>
	    <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ISOLatin1AccentFilterFactory" />
	    <filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z0-9])"
replacement="" replace="all" />
	    <filter class="solr.PatternReplaceFilterFactory"
pattern="^(.{20})(.*)?" replacement="$1" replace="all" />
	</analyzer>
  </fieldType> 
</types>
<fields>
   <field name="name" type="string" indexed="false" stored="true"/>
   <field name="id" type="string" indexed="true" stored="true" />
   <field name="score" type="sfloat" indexed="true" stored="false" />
   <field name="autosuggest" type="typeahead" indexed="true"
stored="false"/> 
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>autosuggest</defaultSearchField>
<copyField source="name" dest="autosuggest"/>
<solrQueryParser defaultOperator="AND"/>
-- 
View this message in context: http://lucene.472066.n3.nabble.com/Query-performance-issue-while-using-EdgeNGram-tp2097056p2097056.html
Sent from the Solr - User mailing list archive at Nabble.com.

Re: Query performance issue while using EdgeNGram

Posted by Erick Erickson <er...@gmail.com>.
Hmmm. "find evicted docs"? If you mean find out how many docs are deleted,
look
on the admin "schema browser" page and the difference between MaxDoc and
NumDocs
is the number of deleted documents.

You say "for some queries the QTime is more than 8 secs". What happens if
you
re-run that query a bit later? The reason I ask is if you're not warming the
cache that
that particular query uses, you may be seeing cache loading time here.

Look at the admin stats page, especially for evictions. It's also possible
that your
caches are being reclaimed for some queries and you're seeing response
time spikes when the caches are re-loaded.

Best
Erick

On Wed, Dec 22, 2010 at 7:10 AM, Shanmugavel SRD
<sr...@gmail.com>wrote:

>
> 1) Thanks for this update. I have to use 'WhiteSpaceTokenizer'
> 2) I have to suggest the whole query itself (Say name or title)
> 3) Could you please let me know if there is a way to find the evicted docs?
> 4) Yes, we are seeing improvement in the response time if we optimize. But
> still for some queries QTime is more than 8 secs. It is a 'Blocker' for us.
> Could you please suggest any to reduce the QTime to 1 secs.
> --
> View this message in context:
> http://lucene.472066.n3.nabble.com/Query-performance-issue-while-using-EdgeNGram-tp2097056p2130751.html
> Sent from the Solr - User mailing list archive at Nabble.com.
>

Re: Query performance issue while using EdgeNGram

Posted by Shanmugavel SRD <sr...@gmail.com>.
1) Thanks for this update. I have to use 'WhiteSpaceTokenizer'
2) I have to suggest the whole query itself (Say name or title)
3) Could you please let me know if there is a way to find the evicted docs?
4) Yes, we are seeing improvement in the response time if we optimize. But
still for some queries QTime is more than 8 secs. It is a 'Blocker' for us.
Could you please suggest any to reduce the QTime to 1 secs.
-- 
View this message in context: http://lucene.472066.n3.nabble.com/Query-performance-issue-while-using-EdgeNGram-tp2097056p2130751.html
Sent from the Solr - User mailing list archive at Nabble.com.

Re: Query performance issue while using EdgeNGram

Posted by Erick Erickson <er...@gmail.com>.
A couple of observations:

1> your regex at query time is interesting. You're using KeywordTokenizer,
so input of
    "search me" becomes "searchme" before it goes through the parser. Is
this your intent?
2> Why are you using EdgeNGrams for auto suggest? The TermsComponent is
     an easier, more efficient solution unless you have some special needs,
see here:
     http://wiki.apache.org/solr/TermsComponent Are you trying to suggest
#terms#
     or complete queries? Because if it's just on a term basis,
TermsComponent
     seems much simpler. Jay's example on the Lucid web site (if that's
where
     you started down this path) is for implementing #query# selection.
3> I'd think about checking your caches. I'm not real comfortable with a min
gram
     size of 1 then warming all the alphabet. See the admin page, "stats".
Look
     for evictions. You're also bloating the size of your index pretty
significantly
     because of the huge number of unique terms you'll be generating.
4> Optimizing is not all that useful unless you've deleted a bunch of
documents, despite
     the name. What it does do is force a complete reload of the underlying
index/caches, possibly
     you're seeing resource contention here because of that. *After* the
index is warmed,  do you
     see performance differences between optimized and un-optimized indexes?
If not think about
     only optimizing during off hours.

Best
Erick

On Thu, Dec 16, 2010 at 2:47 AM, Shanmugavel SRD
<sr...@gmail.com>wrote:

>
> While using auto suggest using EdgeNGramFilterFactory in SOLR 1.4.1, we are
> having performance issue on query response time.
> For example, even though 'p' is in auto warming, if I search for 'people'
> immediately after optimization is completed, then search on 'people' is
> taking 11-15 secs respond. But subsequent search on 'people' is responding
> in less than 1 sec. I want to understand why it is taking 11 secs to
> respond
> and how to reduce it to 1 sec.
>
> These are the below configurations. Could anyone suggest on what am I
> missing here?
>
> 1) Added query warming
> 2) Decreased mergeFactor to '3'
> 3) Increased HashDocSet maxSize as '7000' (which is 1432735 * 0.005)
> 4) Optimized after the data import.
>
> Data are indexed from a csv file. optimize is called immediately after date
> import.
>
> No of docs : 1432735
>
> solrconfig.xml
>  <indexDefaults>
>    <useCompoundFile>false</useCompoundFile>
>    <mergeFactor>3</mergeFactor>
>    <ramBufferSizeMB>32</ramBufferSizeMB>
>    <maxMergeDocs>2147483647</maxMergeDocs>
>    <maxFieldLength>10000</maxFieldLength>
>    <writeLockTimeout>1000</writeLockTimeout>
>    <commitLockTimeout>10000</commitLockTimeout>
>    <lockType>single</lockType>
>  </indexDefaults>
>  <mainIndex>
>    <useCompoundFile>false</useCompoundFile>
>    <ramBufferSizeMB>32</ramBufferSizeMB>
>    <mergeFactor>3</mergeFactor>
>    <maxMergeDocs>2147483647</maxMergeDocs>
>    <maxFieldLength>10000</maxFieldLength>
>    <unlockOnStartup>false</unlockOnStartup>
>  </mainIndex>
>  <updateHandler class="solr.DirectUpdateHandler2">
>    <maxPendingDeletes>100000</maxPendingDeletes>
>  </updateHandler>
>
>  <query>
>    <maxBooleanClauses>1024</maxBooleanClauses>
>     <filterCache
>      class="solr.LRUCache"
>      size="16384"
>      initialSize="4096"
>      autowarmCount="4096"/>
>
>    <queryResultCache
>      class="solr.LRUCache"
>      size="16384"
>      initialSize="4096"
>      autowarmCount="4096"/>
>
>    <documentCache
>      class="solr.LRUCache"
>      size="5000"
>      initialSize="5000"
>      />
>
>    <enableLazyFieldLoading>true</enableLazyFieldLoading>
>    <queryResultWindowSize>50</queryResultWindowSize>
>    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
>    <HashDocSet maxSize="7000" loadFactor="0.75"/>
>  <listener event="newSearcher" class="solr.QuerySenderListener">
>      <arr name="queries">
>        <lst> <str name="q">a</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">b</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">c</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">d</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">e</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">f</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">g</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">h</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">i</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">j</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">k</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">l</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">m</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">n</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">o</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">p</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">q</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">r</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">s</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">t</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">u</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">v</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">w</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">x</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">y</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">z</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">0</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">1</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">2</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">3</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">4</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">5</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">6</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">7</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">8</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">9</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>      </arr>
>    </listener>
>    <listener event="firstSearcher" class="solr.QuerySenderListener">
>      <arr name="queries">
>        <lst> <str name="q">a</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">b</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">c</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">d</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">e</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">f</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">g</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">h</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">i</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">j</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">k</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">l</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">m</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">n</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">o</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">p</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">q</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">r</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">s</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">t</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">u</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">v</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">w</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">x</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">y</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">z</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">0</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">1</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">2</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">3</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">4</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">5</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">6</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">7</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">8</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>        <lst> <str name="q">9</str><str name="qt">typeahead</str><str
> name="start">0</str><str name="rows">100</str></lst>
>      </arr>
>    </listener>
>    <useColdSearcher>false</useColdSearcher>
>    <maxWarmingSearchers>20</maxWarmingSearchers>
>  </query>
>
>  <requestHandler name="typeahead" class="solr.SearchHandler">
>             <lst name="defaults">
>               <str name="wt">json</str>
>               <str name="fl">name,score</str>
>               <str name="sort">score desc</str>
>               <str name="indent">true</str>
>             </lst>
>   </requestHandler>
>  <requestDispatcher handleSelect="true" >
>  <requestParsers enableRemoteStreaming="true"
> multipartUploadLimitInKB="2048" />
>    <httpCaching lastModifiedFrom="openTime" etagSeed="Solr">
>    </httpCaching>
>  </requestDispatcher>
>  <requestHandler name="standard" class="solr.StandardRequestHandler"
> default="true">
>     <lst name="defaults">
>       <str name="echoParams">explicit</str>
>       <int name="rows">10</int>
>     </lst>
>     <arr name="last-components">
>     </arr>
>  </requestHandler>
>  <requestHandler name="/search"
> class="org.apache.solr.handler.component.SearchHandler">
>    <lst name="defaults">
>      <str name="echoParams">explicit</str>
>    </lst>
>  </requestHandler>
>  <queryConverter name="queryConverter"
> class="solr.SpellingQueryConverter"/>
>  <searchComponent name="elevator"
> class="org.apache.solr.handler.component.QueryElevationComponent" >
>    <str name="queryFieldType">string</str>
>    <str name="config-file">elevate.xml</str>
>  </searchComponent>
>  <requestHandler name="/elevate"
> class="org.apache.solr.handler.component.SearchHandler" startup="lazy">
>    <lst name="defaults">
>      <str name="echoParams">explicit</str>
>    </lst>
>    <arr name="last-components">
>      <str>elevator</str>
>    </arr>
>  </requestHandler>
>  <requestHandler name="/update" class="solr.XmlUpdateRequestHandler"
> ></requestHandler>
>  <requestHandler name="/analysis" class="solr.AnalysisRequestHandler"
> ></requestHandler>
>  <requestHandler name="/update/csv" class="solr.CSVRequestHandler"
> startup="lazy" />
>  <requestHandler name="/admin/"
> class="org.apache.solr.handler.admin.AdminHandlers" />
>  <requestHandler name="/admin/ping" class="PingRequestHandler">
>    <lst name="defaults">
>      <str name="qt">standard</str>
>      <str name="q">solrpingquery</str>
>      <str name="echoParams">all</str>
>    </lst>
>  </requestHandler>
>  <highlighting>
>   <fragmenter name="gap" class="org.apache.solr.highlight.GapFragmenter"
> default="true">
>    <lst name="defaults">
>     <int name="hl.fragsize">100</int>
>    </lst>
>   </fragmenter>
>   <fragmenter name="regex"
> class="org.apache.solr.highlight.RegexFragmenter">
>    <lst name="defaults">
>      <int name="hl.fragsize">70</int>
>      <float name="hl.regex.slop">0.5</float>
>      <str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
>    </lst>
>   </fragmenter>
>   <formatter name="html" class="org.apache.solr.highlight.HtmlFormatter"
> default="true">
>    <lst name="defaults">
>     <str name="hl.simple.pre"><![CDATA[<em>]]></str>
>     <str name="hl.simple.post"><![CDATA[</em>]]></str>
>    </lst>
>   </formatter>
>  </highlighting>
>    <queryResponseWriter name="xml"
> class="org.apache.solr.request.XMLResponseWriter" default="true"/>
>    <queryResponseWriter name="json"
> class="org.apache.solr.request.JSONResponseWriter"/>
>    <queryResponseWriter name="python"
> class="org.apache.solr.request.PythonResponseWriter"/>
>    <queryResponseWriter name="ruby"
> class="org.apache.solr.request.RubyResponseWriter"/>
>    <queryResponseWriter name="php"
> class="org.apache.solr.request.PHPResponseWriter"/>
>    <queryResponseWriter name="phps"
> class="org.apache.solr.request.PHPSerializedResponseWriter"/>
>    <queryResponseWriter name="xslt"
> class="org.apache.solr.request.XSLTResponseWriter">
>    <int name="xsltCacheLifetimeSeconds">5</int>
>  </queryResponseWriter>
>
>
> schema.xml
>
> <types>
>  <fieldType name="typeahead" class="solr.TextField">
>        <analyzer type="index">
>            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
>        <filter class="solr.LowerCaseFilterFactory" />
>        <filter class="solr.ISOLatin1AccentFilterFactory" />
>                <filter class="solr.PatternReplaceFilterFactory"
> pattern="([^a-z0-9])"
> replacement="" replace="all" />
>                <filter class="solr.EdgeNGramFilterFactory"
> maxGramSize="100"
> minGramSize="1" />
>        </analyzer>
>        <analyzer type="query">
>            <tokenizer class="solr.KeywordTokenizerFactory"/>
>            <filter class="solr.LowerCaseFilterFactory" />
>        <filter class="solr.ISOLatin1AccentFilterFactory" />
>            <filter class="solr.PatternReplaceFilterFactory"
> pattern="([^a-z0-9])"
> replacement="" replace="all" />
>            <filter class="solr.PatternReplaceFilterFactory"
> pattern="^(.{20})(.*)?" replacement="$1" replace="all" />
>        </analyzer>
>  </fieldType>
> </types>
> <fields>
>   <field name="name" type="string" indexed="false" stored="true"/>
>   <field name="id" type="string" indexed="true" stored="true" />
>   <field name="score" type="sfloat" indexed="true" stored="false" />
>   <field name="autosuggest" type="typeahead" indexed="true"
> stored="false"/>
> </fields>
> <uniqueKey>id</uniqueKey>
> <defaultSearchField>autosuggest</defaultSearchField>
> <copyField source="name" dest="autosuggest"/>
> <solrQueryParser defaultOperator="AND"/>
> --
> View this message in context:
> http://lucene.472066.n3.nabble.com/Query-performance-issue-while-using-EdgeNGram-tp2097056p2097056.html
> Sent from the Solr - User mailing list archive at Nabble.com.
>