2016-07-17 12 views
2

現在、ローカルサーバーでsolr 5xを使用しており、すべてのインデックスを生成するためにDrupalインスタンスを使用しています。多くの設定をした後、私はsolrの実装にかなり満足しています。Solr Spell Check正しく偽陽性を返しました.Spelled()

しかし、私はちょうど気づいてきた問題の一つは、正しいつづりはまだスペルミスとしてカウントされ、まだ提案を提供しているということです。

"correctlySpelled":false

あなたはJSON出力で見ることができるように、両方の単語:ライセンスと正しく入力されており、まだ間違ったとして分類されている車両。

"spellcheck":{ 
    "suggestions":[ 
     "license", 
     { 
     "numFound":3, 
     "startOffset":0, 
     "endOffset":7, 
     "suggestion":[ 
      "licensed", 
      "licensee", 
      "licenser" 
     ] 
     }, 
     "vehicle", 
     { 
     "numFound":3, 
     "startOffset":8, 
     "endOffset":15, 
     "suggestion":[ 
      "chicle", 
      "pedicle", 
      "vehiculate" 
     ] 
     } 
    ], 
    "correctlySpelled":false, 
    "collations":[ 
     "collation", 
     "licensed chicle", 
     "collation", 
     "licensed pedicle", 
     "collation", 
     "licensed vehiculate", 
     "collation", 
     "licenser chicle", 
     "collation", 
     "licenser pedicle" 
    ] 
} 

偽陽性を引き起こす理由は誰にもありますか?

URLエンコードされたクエリ

http://192.168.33.10:8983/solr/drupal/spell?q=license+vehicle&spellcheck=true&spellcheck.accuracy=0.7&spellcheck.collate=true&defType=edismax&json.nl=flat&omitHeader=true&qf=ts_title^1&fl=*,score&start=0&fq=index_id:"new_index"&fq=hash:"96z3wm"&rows=10&wt=json&stopwords=true&lowercaseOperators=true

問合せ:

q = license+vehicle 
spellcheck = true 
spellcheck.accuracy = 0.7 
spellcheck.collate = true 
defType = edismax 
json.nl = flat 
omitHeader = true 
qf = ts_title^1 
fl = *,score 
start = 0 
fq = index_id:"new_index" 
fq = hash:"96z3wm" 
rows = 10 
wt = json 
stopwords = true 
lowercaseOperators = true 

のschema.xmlの関連部分:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> --> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <!-- Case insensitive stop word removal. --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> --> 

    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="multiterm"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> --> 

    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="1" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

solrconfig.xmlの関連部分

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> 
    <lst name="defaults"> 
     <str name="df">spell</str> <!--The default field for spell checking. --> 
     <str name="spellcheck.dictionary">file</str> <!--default or file or jarowinkler as mentioned above. --> 
     <str name="spellcheck">on</str> 
     <str name="spellcheck.extendedResults">true</str> 
     <str name="spellcheck.count">3</str> 
     <str name="spellcheck.maxResultsForSuggest">5</str> 
     <str name="spellcheck.collate">false</str> 
     <str name="spellcheck.collateExtendedResults">false</str> 
     <str name="spellcheck.maxCollationTries">10</str> 
     <str name="spellcheck.maxCollations">5</str> 
    </lst> 
    <arr name="last-components"> 
     <str>spellcheck</str> 
    </arr> 
    </requestHandler> 

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

    <str name="queryAnalyzerFieldType">textSpell</str> 

    <lst name="spellchecker"> 
     <str name="name">default</str> 
     <str name="field">spell</str> 
     <str name="spellcheckIndexDir">spellchecker</str> 
     <str name="buildOnOptimize">true</str> 
    </lst> 

    <lst name="spellchecker"> 
     <str name="classname">solr.FileBasedSpellChecker</str> 
     <str name="name">file</str> 
     <str name="sourceLocation">spellings.txt</str> 
     <str name="characterEncoding">UTF-8</str> 
     <str name="spellcheckIndexDir">spellcheckerFile</str> 
    </lst> 

    </searchComponent> 
+0

スペル訂正のソースとして非ステムフィールドを使ってみましたか?あなたは、あなたが指摘していると考える用語を実際には持っていないかもしれません。また、古いwikiから: "spellcheck.maxResultsForSuggest"が指定されていない場合、デフォルトの動作は提案を生成し、少なくとも1項が索引にない場合は "正しく指定されました"を "false"と報告することです(Document Frequency == 0 )返される結果の数にかかわらず。 – MatsLindh

+0

@MatsLindh - 'solr.SearchHandler'に' spellcheck.maxResultsForSuggest'のリファレンスがあります。上記のように結果は正常に戻っているので、用語の索引付けが行われています。スペルチェッカーの値は正しいスペルを無視しているだけです。 –

+0

トークンのヒット数がmaxResultsForSuggestよりも大きいですか? – MatsLindh

答えて

0

これは私もSolrのを経験してきたものです。それは予測不可能なやり方で起こる。私がこのような条件を避けるために使用するアプローチは、100に設定することで、edismaxパラメータ "mm"でスペルチェックを行うことです。 edismaxのクエリでmm = 100を設定して、それが機能するかどうか確認してください。次に、フローを作成します。ここでは、最初に厳密に単語のスペルのみを確認し、それを検索クエリハンドラに渡します。あなたがmm = 100を指定するときには、どんな種類の二重引用符でもフレーズを渡さないようにしてください。それが助けてくれたら教えてください:)

+0

私はmm値を100に設定しましたが、結果は返されません。ちょうど同じ提案です。あなたは精巧にしてください、非常に感謝しますか? –

+0

mmと一緒に他のパラメータを送信していますか? –

+0

私はedismaxをサポートするために私の要求を再フォーマットする必要があるかどうかを理解したいと思っています。また、他に何を送る必要がありますか? –

関連する問題