Romi
Romi

Reputation: 4931

How do I implement a solr spell checker?

I want to implement a spellchecker component in my search application using solr. What configuration is required to change for it?

Upvotes: 0

Views: 4380

Answers (1)

Muhannad A.Alhariri
Muhannad A.Alhariri

Reputation: 3922

Add the following section to your solrconfig.xml

    <searchComponent name="spellcheck" class="solr.SpellCheckComponent">

    <lst name="spellchecker">
      <!--
           Optional, it is required when more than one spellchecker is configured.
           Select non-default name with spellcheck.dictionary in request handler.
      -->
      <str name="name">default</str>
      <!-- The classname is optional, defaults to IndexBasedSpellChecker -->
      <str name="classname">solr.IndexBasedSpellChecker</str>
      <!--
               Load tokens from the following field for spell checking,
               analyzer for the field's type as defined in schema.xml are used
      -->
      <str name="field">spell</str>
      <!-- Optional, by default use in-memory index (RAMDirectory) -->
      <str name="spellcheckIndexDir">./spellchecker</str>
      <!-- Set the accuracy (float) to be used for the suggestions. Default is 0.5 -->
      <str name="accuracy">0.7</str>
      <!-- Require terms to occur in 1/100th of 1% of documents in order to be included in the dictionary -->
      <float name="thresholdTokenFrequency">.0001</float>
    </lst>
    <!-- Example of using different distance measure -->
    <lst name="spellchecker">
      <str name="name">jarowinkler</str>
      <str name="field">lowerfilt</str>
      <!-- Use a different Distance Measure -->
      <str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>
      <str name="spellcheckIndexDir">./spellchecker</str>

    </lst>

    <!-- This field type's analyzer is used by the QueryConverter to tokenize the value for "q" parameter -->
    <str name="queryAnalyzerFieldType">textSpell</str>
</searchComponent>
<!--
  The SpellingQueryConverter to convert raw (CommonParams.Q) queries into tokens.  Uses a simple regular expression
  to strip off field markup, boosts, ranges, etc. but it is not guaranteed to match an exact parse from the query parser.

  Optional, defaults to solr.SpellingQueryConverter
-->
<queryConverter name="queryConverter" class="solr.SpellingQueryConverter"/>

<!--  Add to a RequestHandler
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NOTE:  YOU LIKELY DO NOT WANT A SEPARATE REQUEST HANDLER FOR THIS COMPONENT.  THIS IS DONE HERE SOLELY FOR
THE SIMPLICITY OF THE EXAMPLE.  YOU WILL LIKELY WANT TO BIND THE COMPONENT TO THE /select STANDARD REQUEST HANDLER.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-->


<requestHandler name="/spellCheckCompRH" class="solr.SearchHandler">
    <lst name="defaults">
      <!-- Optional, must match spell checker's name as defined above, defaults to "default" -->
      <str name="spellcheck.dictionary">default</str>
      <!-- omp = Only More Popular -->
      <str name="spellcheck.onlyMorePopular">false</str>
      <!-- exr = Extended Results -->
      <str name="spellcheck.extendedResults">false</str>
      <!--  The number of suggestions to return -->
      <str name="spellcheck.count">1</str>
    </lst>
<!--  Add to a RequestHandler
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REPEAT NOTE:  YOU LIKELY DO NOT WANT A SEPARATE REQUEST HANDLER FOR THIS COMPONENT.  THIS IS DONE HERE SOLELY FOR
THE SIMPLICITY OF THE EXAMPLE.  YOU WILL LIKELY WANT TO BIND THE COMPONENT TO THE /select STANDARD REQUEST HANDLER.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-->
    <arr name="last-components">
      <str>spellcheck</str>
    </arr>
  </requestHandler>

This config sample from Solr Wiki , After adding this you can request to build spellchecker index

http://localhost:8983/solr/spell?q=some query&spellcheck=true&spellcheck.collate=true&spellcheck.build=true 

Note to not include the last part of the query in each request because this woill build the spelling index all time you request so the previous becomes after the first request

http://localhost:8983/solr/spell?q=some query&spellcheck=true&spellcheck.collate=true

In the previous XML sextion son't forget to replace the field spell by the field on which you want to build your spellchecker against

And now you can feel the power of spellchecking

Upvotes: 2

Related Questions