2017-08-28 9 views
0

私はスペルチェックにSolrを使用しています。 DirectSolrSpellChecker & WordBreakSolrSpellCheckerの両方を有効にしました。私は次の問題を抱えています:Solrスペルチェック問い合わせ条件の変更

A.私は「心配」を質問しています。 Solrはこの用語を「worri」に変換し、同じ結果を返します。単語が "y" ["傷害"、 "心配"など]で終わる場合、最後の "y"は "i"に置き換えられます。

クエリ例:

http://localhost:8983/solr/MY_CORE/spell?df=text&spellcheck.q=worry&spellcheck=true&spellcheck.extendedResults=true&spellcheck.onlyMorePopular=true 

Solrの結果:

<response> 
<lst name="responseHeader"> 
<int name="status">0</int> 
<int name="QTime">5</int> 
</lst> 
<result name="response" numFound="0" start="0"/> 
<lst name="spellcheck"> 
<lst name="suggestions"> 
<lst name="worri"> 
<int name="numFound">9</int> 
<int name="startOffset">0</int> 
<int name="endOffset">5</int> 
<int name="origFreq">5</int> 
<arr name="suggestion"> 
<lst> 
<str name="word">wo r ri</str> 
<int name="freq">90</int> 
</lst> 
<lst> 
<str name="word">worst</str> 
<int name="freq">12</int> 
</lst> 
<lst> 
<str name="word">wo r r i</str> 
<int name="freq">5246</int> 
</lst> 
<lst> 
<str name="word">work</str> 
<int name="freq">2920</int> 
</lst> 
<lst> 
<str name="word">w o r ri</str> 
<int name="freq">530</int> 
</lst> 
<lst> 
<str name="word">worn</str> 
<int name="freq">81</int> 
</lst> 
<lst> 
<str name="word">w o r r i</str> 
<int name="freq">5246</int> 
</lst> 
<lst> 
<str name="word">wors</str> 
<int name="freq">79</int> 
</lst> 
<lst> 
<str name="word">worm</str> 
<int name="freq">10</int> 
</lst> 
</arr> 
</lst> 
</lst> 
<bool name="correctlySpelled">false</bool> 
</lst> 
</response> 

また出力上記B.は "worri" などの言葉を持っている、と私はSolrのフィールドにそれらの単語のいずれかを見つけることができませんでした。文字がスペースで区切られているような言葉をsolrが返す理由もわかりません。以下は

スキーマファイルである:以下

<field name=MY FIELD type="text_en" multiValued="false" indexed="true" stored="true"/> 

設定ファイルです:

<!-- a spellchecker built from a field of the main index --> 
     <lst name="spellchecker"> 
      <str name="name">default</str> 
      <str name="field"> MY FIELD </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.5</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">1</int> 
      <!-- 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> 
      <!-- uncomment this to require suggestions to occur in 1% of the documents 
      <float name="thresholdTokenFrequency">.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">MY FIELD</str> 
     <str name="combineWords">false</str> 
     <str name="breakWords">true</str> 
     <int name="maxChanges">10</int> 
     </lst> 

    </searchComponent> 


    <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> 
     <lst name="defaults"> 
      <str name="spellcheck.dictionary">default</str> 
      <str name="spellcheck.dictionary">wordbreak</str> 
      <str name="spellcheck">on</str> 
      <str name="spellcheck.extendedResults">true</str> 
      <str name="spellcheck.count">10</str> 
      <str name="spellcheck.alternativeTermCount">5</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> 

誰かがこれをについて私を助けることができる場合、私は本当に感謝。

ありがとうございます!

答えて

0

あなたが「wo r r i」のような「奇妙な」提案。 WordBreakSolrSpellCheckerを使用していて、いくつかのスペルチェック機能を提供しようとしているトークンが壊れているので、あなたはそれらを持っているので、削除すればこれらの提案を得るべきではありません。ここでは公式ドキュメントからの引用です:

WordBreakSolrSpellCheckerは、隣接する クエリ用語を組み合わせ、および/または複数の単語に条件を破っての提案を提供しています。これは、Luceneの WordBreakSpellCheckerを活用して、 SpellCheckComponent強化です。 シンプルベースの辞書を使用せずに間違った空白文字を入力すると、スペルエラーを検出できます。 は、単語分割エラーの照合をサポートしています。 ユーザーには単一単語のスペルエラーと単語区切りのエラー 同じクエリでまた、シャードサポートも提供します。

したがって、基本的に、あなたの例では、worst, work, worm, worn, worsのようなSolrインデックスからの標準的な提案が得られます。他のすべてはWordBreakSolrSpellCheckerの結果に過ぎず、あなたのインデックスでそれらを見つけることはありません。

+0

詳細な回答ありがとうございます!最初の問題について考えていますか?単語の末尾が "y"の場合、solrは "i"に置き換えて、それに対してスペルチェックを行います。 – user5369925

+0

あなたのスキーマにおそらくいくつかのステミングがあります。それを共有できますか? – Mysterion

関連する問題