Solr/Lucene标记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"

有没有办法从标记n-gram中删除开头和结尾的停止字

目前,我有以下组合,用于删除任何包含停止字的n-gram:

<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