すべて、Solr 5.3.1 でスペル チェックを適用しようとしています。
現在、Solr 5.3.1 にはすでにSpellCheckComponent
. 以下のようになります。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_general</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">text</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.5</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">4</int>
<float name="maxQueryFrequency">0.01</float>
</lst>
<lst name="spellchecker">
<str name="name">wordbreak</str>
<str name="classname">solr.WordBreakSolrSpellChecker</str>
<str name="field">name</str>
<str name="combineWords">true</str>
<str name="breakWords">true</str>
<int name="maxChanges">10</int>
</lst>
</searchComponent>
しかし、この機能を消費しようとしたとき。このような。
http://10.2.21.38:7574/solr/gettingstarted_shard1_replica2/spell?q=%E7%94%B2&wt=json&indent=true
私は言った例外で応答を得ました
All checkers need to use the same Analyzer
また、インターネットからいくつかの解決策を検索しようとしました。以下のようないくつかの解決策を見つけました。
Solr 4.0 すべて同じになるようにスペルチェッカー アナライザーを変更するにはどうすればよいですか?
Solr スペルチェック: 結果を表示できません。常に同じエラーが発生します
そのため、回答に従ってこれらのフィールドを同じフィールドに変更しようとしました。
<str name="field">text</str>
<str name="field">name</str>
同じフィールドに
このような 。
...
<str name="field">EntryCNName</str>
....
<str name="field">EntryCNName</str>
これはスキーマで定義されています。
<field name="EntryCNName" type="text_ik" indexed="true" stored="true"/>
フィールドタイプの定義は
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
しかし、残念ながら、まだ同じエラーが発生しました。誰かがこのエラーの意味を理解するのを手伝ってくれませんか? それを修正する方法?
ありがとう。
アップデート
何とか進めます。
スキーマで定義されている必要があります<str name="field">xx</str>
。searchComponent
のrequestHandler
xxx は名前<str name="spellcheck.dictionary">xxx</str>
からのものである必要がありますspellchecker
。たとえば、私の場合、それらはdefault
とwordbreak
です。
そこで、以下のように構成を変更します。
スキーマ.xml
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<!--<field name="Name" type="string" indexed="true" stored="true"/>-->
<field name="EntityID" type="string" indexed="false" stored="true"/>
<field name="EntryCNName" type="text_ik" indexed="true" stored="true"/>
<field name="EntryEnName" type="string" indexed="true" stored="true"/>
<field name="EntryType" type="string" indexed="false" stored="true"/>
<field name="_text_" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true" />
<!--<field name="content" type="text_general" indexed="true" stored="true" required="true" />-->
<copyField source="*" dest="_text_"/>
<copyField source="EntryEnName" dest="spell" />
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StandardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StandardFilterFactory" />
</analyzer>
</fieldType>
SolrConfig.xml
<lst name="spellchecker">
<str name="name">default</str>
<str name="classname">solr.IndexBasedSpellChecker</str>
<str name="field">spell</str>
<str name="spellcheckIndexDir">/path/to/my/spell/index</str>
<str name="accuracy">0.7</str>
<float name="thresholdTokenFrequency">.0001</float>
</lst>
<lst name="spellchecker">
<str name="name">wordbreak</str>
<str name="classname">solr.WordBreakSolrSpellChecker</str>
<str name="field">spell</str>
<str name="spellcheckIndexDir">/path/to/my/spell/index</str>
<str name="combineWords">true</str>
<str name="breakWords">true</str>
<int name="maxChanges">10</int>
</lst>
<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">true</str>
<str name="spellcheck.collateExtendedResults">true</str>
<str name="spellcheck.maxCollationTries">10</str>
<str name="spellcheck.maxCollations">5</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
これでエラーはなくなりました。しかし、次のようなURLを呼び出すと
私は空の提案を得ました。
<lst name="spellcheck">
<lst name="suggestions"/>
<bool name="correctlySpelled">false</bool>
<lst name="collations"/>
</lst>
そして実際に。キーワードで多くの結果を検索できますlung
。Lung
を試したときにsolr が を提案しないのはなぜlu
ですか? 私が逃したものは何でも.Thanks.