我正在使用text_general类型在solr index中搜索以下配置。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<filter class="org.apache.solr.analysis.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="1"
splitOnCaseChange="1"
splitOnNumerics="1"
preserveOriginal="1"
stemEnglishPossessive="1"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<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>
我为很多内容编制索引并使用关键字进行搜索:请,请和请。
PLEASE关键字查询返回非常小的结果集。
Q =%22PLEASE%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特
但请&amp;请给出大的结果集。
Q =%22please%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特
Q =%22Please%22安培; q.op = OR&安培; DF =文本&安培; QT =%2Fselect&安培;排序= CONTENT_NAME +降序&安培; FQ = content_source%3ASharepoint&安培; AuthenticatedUserName =拉利特
即使我使用的是WordDelimiterFilterFactory,也应该考虑PLEASE,Please&amp;请作为相同的关键字?
任何想法。
答案 0 :(得分:1)
您在使用标记器和过滤器时存在根本冲突。 SnowBallPorterFilterFactory要求小写输入正常工作:
公共最终类PorterStemFilter扩展TokenFilter
根据Porter词干分析算法转换令牌流。 注意:堵塞过滤器的输入必须是小写的, 所以你需要使用LowerCaseFilter或LowerCaseTokenizer 在Tokenizer链中,为了使其正常工作!
这会导致您在将流运行到SnowBallPorterFilterFactory之前在某处运行LowerCaseFilterFactory。
你也在使用词干之后使用WordDelimiterFilterFactory - 这意味着在通过WordDelimiterFilterFactory运行之后生成的新单词将不会被阻止。
修复它并不像预先放置LowerCaseFilterFactory那么简单,因为虽然这将解决SnowBallPorterFilterFactory问题,但它会干扰WordDelimiterFilterFactory在更改大小写时生成新单词。
我建议您尝试以下顺序:
StandardTokenizerFactory
WordDelimiterFilterFactory
LowerCaseFilterFactory
SynonymFilterFactory
StopFilterFactory
SnowballPorterFilterFactory
当您开始使用尽可能多的过滤器时,很难获得一个完美的订单,但我相信这将解决您当前的问题。与往常一样,我建议您使用文档集中的常用单词运行许多测试,以查看它与您所需输出的匹配程度。
答案 1 :(得分:0)
你遇到了这个问题,因为你在小写之前就已经出现了问题。我发现根据具体情况,不同的词干分子会根据不同的词汇来区分。在Solr Admin UI的“分析”选项卡中查看以下输出。你可以看到PLEASE与Please和please不同(或者根本没有),因此,后两者有不同的结果集。
ST PLEASE | please | Please
SF PLEASE | pleas | Pleas
WDF PLEASE | pleas | Pleas
SF PLEASE | pleas | Pleas
LCF please | pleas |pleas
要解决这个问题,我建议在小写之后运行stemmer作为最后一步。这将确保您的单词分隔符过滤器仍然有效。
希望它有所帮助。