首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SOLR:带有词干的SynonymFilterFactory

SOLR:带有词干的SynonymFilterFactory
EN

Stack Overflow用户
提问于 2016-10-07 21:35:03
回答 1查看 995关注 0票数 0

如果我正确理解的话,SynonymFilterFactory就不会以任何方式阻止同义词。因此,如果一个人想要很好地回忆,不管是复数还是紧张,他们的同义词档案中的复数和时态都必须非常详尽。

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

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

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

代码语言:javascript
运行
复制
<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文件夹中可能是唯一的方法。是否有一种在配置中定义命名分析器的方法,或者另一种方法来实现此目标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-27 20:42:13

这并没有回答我最初的问题(关于如何仅通过配置来实现这个问题),而是我在其他人想要这样做的情况下使用的解决方案。

首先,一个自定义分析器,用于预处理来自同义词过滤器的同义词(最重要的是,用斯诺球阻止它们):

代码语言:javascript
运行
复制
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或托管模式中):

代码语言:javascript
运行
复制
<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>

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

代码语言:javascript
运行
复制
<field name="keywords" type="stemmedText" indexed="true" stored="false"/>

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

特定示例

同义词文件条目:狗,犬类,犬类,小狗

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

解析查询:SynonymQuery(关键词:canid关键字:狗关键字:doggi关键字:pup)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39926135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档