2011-08-18 3 views
2

J'essaie de configurer un correcteur orthographique pour compléter automatiquement des phrases complètes à partir de ma requête.SolR: correction orthographique complète

Je l'ai déjà été en mesure d'obtenir ce résultat:

"american israel" :
-> "american something"
-> "israel something"

Mais je veux:

"american israel" :
-> "american israel something"

Ceci est mon solrconfig.xml:

<searchComponent name="suggest_full" class="solr.SpellCheckComponent"> 
<str name="queryAnalyzerFieldType">suggestTextFull</str> 
<lst name="spellchecker"> 
    <str name="name">suggest_full</str> 
    <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
    <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
    <str name="field">text_suggest_full</str> 
    <str name="fieldType">suggestTextFull</str> 
</lst> 
</searchComponent> 

<requestHandler name="/suggest_full" class="org.apache.solr.handler.component.SearchHandler"> 
<lst name="defaults"> 
<str name="echoParams">explicit</str> 
<str name="spellcheck">true</str> 
<str name="spellcheck.dictionary">suggest_full</str> 
<str name="spellcheck.count">10</str> 
<str name="spellcheck.onlyMorePopular">true</str> 
</lst> 
<arr name="last-components"> 
<str>suggest_full</str> 
</arr> 
</requestHandler> 

Et voici mon schema.xml:

<fieldType name="suggestTextFull" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

... 

<field name="text_suggest_full" type="suggestTextFull" indexed="true" stored="false" multiValued="true"/> 

J'ai lu quelque part que je dois utiliser spellcheck.q parce q utiliser le WhitespaceAnalyzer, mais quand je l'utilise spellcheck.q i obtenir un java.lang.NullPointerException

Toutes les idées?

Répondre

1

Si vous champs SpellCheck (text_suggest_full) CONTENIR american something et israel something alors assurez-vous, qu'il existe aussi un document/entrée, avec la valeur american israel something.

Solr ne fusionnera pas american something et israel something à un terme et n'appliquera pas le résultat à votre vérification orthographique de american israel.

+0

Bien sûr, j'ai "american israel quelque chose" dans un de mes documents. Ce n'est pas le problème ici. – Valentin

0

N'y aurait-il pas une approche de saisie semi-automatique plus appropriée? Voir article this article e.g.

+0

J'ai déjà fait une fonction de saisie semi-automatique comme ceci (en fait, j'ai utilisé cet article pour le faire), mais ce que je veux vraiment maintenant, c'est de faire correspondre des phrases complètes avec ma requête complète. – Valentin

0

Vous pouvez utiliser le suggester/un composant "autocomplete" flexible; vous devez avoir la version 3.X de solr

SolrConfig.xml:

<searchComponent name="suggest" class="solr.SpellCheckComponent"> 
    <lst name="spellchecker"> 
    <str name="name">suggest</str> 
    <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
    <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
    <str name="field">name_autocomplete</str> 
    </lst> 
    </searchComponent> 


    <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler"> 
    <lst name="defaults"> 
    <str name="spellcheck">true</str> 
    <str name="spellcheck.dictionary">suggest</str> 
    <str name="spellcheck.count">10</str> 
    </lst> 
    <arr name="components"> 
    <str>suggest</str> 
    </arr> 
    </requestHandler> 

Shema.xml

<field name="name_autocomplete" type="text" indexed="true" stored="true" multiValued="false" /> 

Ajouter copyField

<copyField source="name" dest="name_autocomplete" /> 

Recharger solr, réindexer tous et test: http://localhost:8983/solr/suggest?q=&amerspellcheck=true&spellcheck.collate=true&spellcheck.build=true

Obtenez quelque chose comme:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="ameri"> 
     <int name="numFound">2</int> 
     <int name="startOffset">0</int> 
     <int name="endOffset">2</int> 
     <arr name="suggestion"> 
      <str>american morocco</str> 
      <str>american morocco something</str> 
     </arr> 
     </lst> 
     <str name="collation">american morocco something</str> 
    </lst> 
    </lst> 
</response> 

Espoir qui aident

Vive

0

à mon humble avis, un problème avec la vérification orthographique Le composant est que chaque mot est épelé en fonction de l'index complet. La "collation" des mots cochés ne correspond pas forcément à un seul document dans l'index, mais peut provenir de documents indexés séparés.

Questions connexes