Solr/Lucene标记n-gram:仅删除前导和尾随停止字
有没有办法从标记n-gram中删除开头和结尾的停止字 目前,我有以下组合,用于删除任何包含停止字的n-gram:Solr/Lucene标记n-gram:仅删除前导和尾随停止字,solr,lucene,Solr,Lucene,有没有办法从标记n-gram中删除开头和结尾的停止字 目前,我有以下组合,用于删除任何包含停止字的n-gram: <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" "/>
<filter class="solr.PatternReplaceFilterFactory" pattern=".*_.*" replacement=""/>
</analyzer>
例如,如果我的文档包含以下ngram:
“伦敦塔”、“伦敦塔”、“伦敦”、“伦敦”
使用“of,in”作为停止字,木瓦过滤器将产生:
伦敦塔,伦敦塔,伦敦,伦敦
(请注意,第二个“伦敦塔”与第一个不同,但这部分信息丢失)
然后模式过滤器将删除前3个n-gram
但我真正想做的是保留“伦敦塔”、“伦敦塔”、“伦敦”、“伦敦”
这可能吗
非常感谢 您可能希望查看分析器,而不是木瓦分析器。我不认为他们是一个完美的匹配(他们只做bigrams),但你可能会发现他们的表现更接近你想要的
另一种选择是在木瓦后面的链条中粘贴一个过滤器工厂,并在n-gram的开头捕捉这些常用词,然后将它们替换掉。您可能还需要在此之后进行筛选,以便只保留一个版本的-现在相同的-标记。我在尝试构建自动完成功能时遇到了相同的问题,该功能将从木瓦标记中获得建议(后面的stopwords看起来很有趣)
我最终开发了一个令牌过滤器,它可以做到这一点:。如果您不介意在Solr中添加一个额外的jar,您可以查看它。此外,它目前只适用于尾随停止词,尽管它也可以调整为前导词。这可能有点晚了,但它对我有效,我认为其他可能面临相同问题的人会感兴趣 在fieldType中放置过滤器的顺序会影响结果。 在StopFilterFactory之前使用ShingleFilterFactory时,我得到的结果正是您所期望的结果
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="(^[^a-zA-Z0-9á-úÁ-Ú]*|[^a-zA-Z0-9á-úÁ-Ú]*$)" replacement=""/>
<filter class="solr.ShingleFilterFactory" outputUnigrams="true" minShingleSize="2" maxShingleSize="6"
tokenSeparator=" "/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" />
</analyzer>
如果您担心信息丢失,为什么要删除stopwords?在我看来,普通的词尾在句子的开头或结尾并没有比在中间的影响小。毕竟,“在路上”和“在路上”也有明显不同的含义。为什么不完全从您的分析器中删除
StopFilterFactory
?