簡體   English   中英

SOLR:SynonymFilterFactory帶有詞干

[英]SOLR: SynonymFilterFactory with stemming

如果我理解正確,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文件夾中可能是唯一的方法。 有沒有一種方法可以在配置中定義命名分析器,或者有另一種方法可以實現此目標?

這並不能回答我最初的問題(僅關於如何通過配置來實現),但是如果其他任何人想要這樣做,我最終都會使用該解決方案。

首先,一個自定義分析器將用於預處理來自同義詞過濾器的同義詞(最重要的是,使用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"/>

在此示例中,文檔的關鍵字字段將出現在索引中。 當對該字段進行查詢時,該詞干將被詞干然后用於查找同義詞(已由自定義分析器預先填充)。 結果是,包含“不完整”同義詞列表(復數,時態)的同義詞文件具有更高的匹配機會。

具體例子

同義詞文件條目:[狗,狗,狗,犬,犬,小狗,小狗,小狗]

搜索詞:幼犬(請注意,它不在同義詞列表中)

解析的查詢:SynonymQuery(同義詞(關鍵字:canid關鍵字:dog關鍵字:doggi關鍵字:pup關鍵字:puppi))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM