[英]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.