我正在尝试 solr。EdgeNGramFilterFactory in solr,在这里解释我在 schema.xml字段的索引分析器中添加了<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" />
。据我所知,索尔。EdgeNGramFilterFactory 创建令牌,例如
whether - wh, whe, whet, wheth, whethe, whether.
因此,当我搜索查询时 - 它是否提供包含是否单词标记的所有文档
"suggestion":["wether","ether","heather","walther" "weather","wheeler", "fletcher", "shepherd","together","whenever","wherever","another","blather","bother","brother","chothe","eiher","either","farther","father""feather","further","gather","goethe","günther" "higher","hucher","leather","mother","neither","nyheter", "other","rather","whence", "where""shepherds","weathered","altogether","breathed","brothers","feathers","hitherto","northern","preacher","southern","withered"]
我只需要相关的文件,例如是否单词,我不需要像brother, shepherd etc
这样的不必要的文档weather, wether, ether, heather
。
架构.xml:
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
solrconfig.xml :
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">term</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.jaspell.JaspellLookupFactory</str>
<str name="buildOnCommit">true</str>
<str name="queryAnalyzerFieldType">textSpell</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="df">term</str>
<str name="spellcheck">on</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">500</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
尝试将 minGramSize 设置为更大的值,例如 4 或 5,以减少不相关的匹配项的数量。另外,请查看文档以获取更多详细信息 https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory
正如我在 schema.xml 文件中看到的那样,您使用的是 NGramFilterFactory 而不是 EdgeNGramFilterFactory。这意味着您没有像您描述的那样创建令牌:
是否 - 呜,呜
呜,呜呜,呜呜,是否。
使用NGramFilterFactory,您使用的令牌将如下所示:
是否 - 呜,
呜呜,呜��
根据您的用例,您还应考虑在索引和查询时使用不同的分词器和过滤器。在索引和查询时分析Solr对数据执行的操作的一个好方法是使用分析工具 https://cwiki.apache.org/confluence/display/solr/Analysis+Screen
- 第一件事:
索尔。EdgeNGramFilterFactory在我们在建议块中获得的建议上并不流行。默认情况下,建议使用 class="solr.SpellCheckComponent"
solr。EdgeNGramFilterFactory处理来自我们询问的查询的响应/结果。
-
第二:
MaxResultForSuggest= value。其中值可以是 10(整数(
如果查询的结果/响应超过MaxResultForSuggest的设置值,则它给出CorrectlySpelled = true
并且不会对查询提供建议,而如果查询的结果/响应小于MaxResultForSuggest的设置值,则它会给出CorrectlySpelled = false
并提供有关查询的建议。
<str name="spellcheck.maxResultsForSuggest">10</str>
- 第三:
您可以使用拼写检查设置显示建议的限制.alternativeTermCount。
<str name="spellcheck.alternativeTermCount">20</str>
- 第四:
OnlyMorePopular= true :- 在 /suggest 中效果更好,因为它总是对单词给出建议,无论拼写正确还是错误。
OnlyMorePopular= true :- 在 /spell 中效果更差,因为它没有给出正确单词的建议。就我而言,它像这样工作,我也需要对拼写正确的单词提出建议。因此,我删除了OnlyMorePopular属性,并且OnlyMorePopular的默认值为false。
<str name="spellcheck.onlyMorePopular">false</str>
对正确拼写的单词和不正确的单词都提出良好的建议。
架构.xml :
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Solrconfig.xml :
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">textSpell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">term</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">0</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">2</int>
<float name="maxQueryFrequency">0.01</float>
</lst>
</searchComponent>
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="df">term</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck">on</str>
<str name="spellcheck.extendedResults">true</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.maxResultsForSuggest">10</str>
<str name="spellcheck.alternativeTermCount">30</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>