solr – Vorschläge überspringen, die dieselben Dokumente wie die ursprüngliche Suche zurückgeben

StackOverflow https://stackoverflow.com//questions/21027891

Frage

Ich habe Suchvorschläge, die ziemlich gut funktionieren, und es gefällt mir, dass ich Vorschläge auch dann erhalte, wenn das ursprüngliche Schlüsselwort Ergebnisse zurückgegeben hat (wenn wir Dokumente mit Rechtschreibfehlern in unserer Sammlung haben).Allerdings bekomme ich oft Vorschläge, die genau die gleichen Ergebnisse liefern.Ex.Ich suche nach gelber Minzdose und erhalte die Meldung „Meinten Sie gelbe Minzdosen?“

Gibt es eine Möglichkeit, Vorschläge zu entfernen, die dieselben Ergebnisse wie der ursprüngliche Begriff liefern?

Ich verwende SolR 4.6.0 Hier sind die Informationen von Solrconfig.xml

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
        <str name="queryAnalyzerFieldType">text_general</str>
        <!-- a spellchecker built from a field of the main index -->
        <lst name="spellchecker">
          <str name="name">default</str>
          <str name="field">spell2</str>
          <str name="classname">solr.DirectSolrSpellChecker</str>
          <!-- the spellcheck distance measure used, the default is the internal levenshtein -->
          <str name="distanceMeasure">internal</str>
          <!-- minimum accuracy needed to be considered a valid spellcheck suggestion -->
          <float name="accuracy">0.1</float>
          <!-- the maximum #edits we consider when enumerating terms: can be 1 or 2 -->
          <int name="maxEdits">2</int>
          <!-- the minimum shared prefix when enumerating terms -->
          <int name="minPrefix">0</int> <!-- if set to 1, must start with same letter -->
          <!-- maximum number of inspections per result. -->
          <int name="maxInspections">5</int>
          <!-- minimum length of a query term to be considered for correction -->
          <int name="minQueryLength">4</int>
          <!-- maximum threshold of documents a query term can appear to be considered for correction -->
          <float name="maxQueryFrequency">0.01</float>
        </lst>
        <!-- a spellchecker that can break or combine words.  See "/spell" handler below for usage -->
        <lst name="spellchecker">
          <str name="name">wordbreak</str>
          <str name="classname">solr.WordBreakSolrSpellChecker</str>
          <str name="field">spell2</str>
          <str name="combineWords">true</str>
          <str name="breakWords">true</str>
          <int name="maxChanges">10</int>
          <str name="buildOnCommit">true</str>
          <int name="minBreakLength">3</int>
        </lst>
      </searchComponent>

     <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
        <lst name="defaults">
            <str name="echoParams">none</str>
           <int name="rows">10</int>
          <str name="df">contents</str>
          <str name="defType">edismax</str>
          <str name="spellcheck.dictionary">default</str>
          <str name="spellcheck.dictionary">wordbreak</str>
          <str name="spellcheck">on</str>
          <str name="spellcheck.extendedResults">false</str>       
          <str name="spellcheck.count">10</str>
          <str name="spellcheck.alternativeTermCount">25</str>
          <str name="spellcheck.maxResultsForSuggest">25</str>
          <str name="spellcheck.collate">true</str>
          <str name="spellcheck.maxCollationTries">10</str>
          <str name="spellcheck.maxCollations">5</str>         
          <str name="spellcheck.onlyMorePopular">false</str>
          <str name="spellcheck.collateParam.defType">dismax</str>
        </lst>
        <arr name="last-components">
          <str>spellcheck</str>
        </arr>
      </requestHandler>

Hier sind die Informationen aus schema.xml

 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

<field name="spell2" type="text_general" indexed="true" stored="false" required="false" multiValued="true" /> 

Eine Beispielabfrage – http://localhost:8985/solr/(collection)/spell?q=yellow%20buttermintskehrt zurück

<str name="collation">yellow (butter mints)</str> 
  <str name="collation">yellow buttermint</str> 

„Yellow Buttermints“ und „Yellow Buttertermints“ liefern die gleichen Ergebnisse.

War es hilfreich?

Lösung

Ich glaube nicht, dass es eine eindeutige Möglichkeit gibt, dies zu garantieren.Aber das sollte auf jeden Fall helfen -

  1. Fügen Sie diesen Filter sowohl zur Abfrage- als auch zur Indexzeit hinzu – EnglishMinimalStemFilterFactory

    https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-EnglishMinimalStemFilter

  2. Ich bin mir nicht sicher, ob SynonymFilterFactory in diesem Fall funktionieren würde.Du könntest es auch ohne versuchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top