【问题标题】:SOLR: SynonymFilterFactory with stemmingSOLR:SynonymFilterFactory 与词干
【发布时间】:2016-10-07 21:35:03
【问题描述】:

如果我理解正确,SynonymFilterFactory 不会以任何方式阻止同义词。因此,如果他们想要良好的回忆而不考虑复数/时态,就必须非常详尽地在其同义词文件中使用复数和时态。

我看到SynonymFilterFactory 有一个可选参数,它可以接受分析器。

analyzer:(可选;默认值:WhitespaceTokenizerFactory)解析同义词文件时使用的分析器类的名称。如果指定了analyzer,则可能不指定tokenizerFactory,反之亦然。

我怀疑像这样嵌套所需的分析器是否有效:

<analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.SnowballPorterFilterFactory" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" > 
        <analyzer>
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.SnowballPorterFilterFactory" />
            <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
        </analyzer>
    </filter>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>

我怀疑编译扩展分析器 .jar 并将其放在 SOLR 的 lib 文件夹中可能是执行此操作的唯一方法。有没有办法在配置中定义一个命名分析器,或者另一种方法来实现这个目标?

【问题讨论】:

    标签: solr lucene synonym stemming


    【解决方案1】:

    这并没有回答我最初的问题(关于如何仅通过配置来做到这一点),而是我最终使用的解决方案,以防其他人想要这样做。

    首先,一个自定义分析器将用于预处理来自同义词过滤器的同义词(最重要的是,使用 Snowball 对它们进行词干处理):

    public class SnowballAnalyzer extends Analyzer {
        /**
         * Creates a
         * {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} which
         * tokenizes text when given a reader.
         * 
         * @return A
         *         {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents}
         *         built from an {@link WhitespaceTokenizer} filtered with
         *         {@link LowerCaseFilter} and English {@link SnowballFilter}.
         */
        @Override
        protected TokenStreamComponents createComponents(String fieldName) {
            Tokenizer source = new WhitespaceTokenizer();
            TokenStream filter = new LowerCaseFilter(source);
            filter = new SnowballFilter(filter, "English");
            return new TokenStreamComponents(source, filter);
        }
    
    }
    

    这被提取为 .jar 并部署到您的 SOLR 主目录的 lib 目录中。接下来,确保告诉 SOLR 在你的同义词过滤器中使用这个分析器(通常在 schema.xml 或 managed-schema 中):

    <fieldType name="stemmedText" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory"/>
            <filter class="solr.SynonymFilterFactory" expand="true" analyzer="your.package.SnowballAnalyzer" ignoreCase="true" synonyms="synonyms.txt"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
    </fieldType>
    

    最后,在您想要的任何字段上使用上述类型:

    <field name="keywords" type="stemmedText" indexed="true" stored="false"/>
    

    在此示例中,文档的关键字字段将在索引中提取。当对该字段进行查询时,该术语将被提取词干然后用于查找同义词(自定义分析器已经预先提取了词干)。结果是包含“不完整”同义词列表(复数、时态)的同义词文件获得匹配的机会要高得多。

    具体例子

    同义词文件条目:[dog,doggy,dogs,canids,canid,puppy,pups,pup]

    搜索词:小狗(注意它不在同义词列表中)

    解析的查询:SynonymQuery(Synonym(keywords:canid 关键字:dog 关键字:doggi 关键字:pup 关键字:puppi))

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多